Python基础之函数

Posted almira998

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础之函数相关的知识,希望对你有一定的参考价值。

Python基础之函数

​ 关于函数定义 首先说一下循环吧 循环就是相同的代码在同一个位置反复执行 而函数是相同的代码在不同的位置反复执行(相同的代码不是真正的一模一样而是可以通过传入不同的数据做出不同的改变) 函数相当于工具(具有一定的功能) 什么时候想用就直接拿出来使用

一、函数相关的基础知识

1.函数的语法结构

def 函数名(参数):
    \'\'\'函数注释\'\'\'
    函数体代码
    return 返回值
def:定义函数的关键字
函数名:命名等价于变量名
参数:可有可无 主要是在使用函数的时候规定要不要外界传数据进来
函数注释:类似于工具说明书
函数体代码:是整个函数的核心 主要取决于程序员的编写
return:使用函数之后可以返回给使用者的数据 可有可无

2.函数的定义与调用

\'\'\'函数必须先定义再调用 顺序不得乱\'\'\'
函数的定义	使用关键字def  # 定义阶段只检测语法不执行代码
函数的调用	函数名加括号  # 调用阶段才会执行函数体代码

3.函数的分类

# 1.空函数 函数体代码为空 用pass或···补全 在项目前期用来搭建框架
def register():
    """注册功能"""
    pass
# 2.无参函数 定义函数的时候括号内没有参数
def index():
    print(\'from index function\')
# 3.有参函数 定义函数的时候有参数 调用函数的时候需要括号传参数
def func(a):
    print(a)

4.函数的返回值

# 什么是返回值
调用函数之后返回给调用者的结果

# 如何获取返回值
变量名 赋值符号 函数的调用

res = func()  # 先执行func函数 然后将返回值赋值给变量res

# 函数返回值的多种情况
函数体代码中没有return关键字 默认返回None
函数体代码有return 如果后面没有写任何东西还是返回None
函数体代码有return 后面写什么就返回什么
函数体代码有return并且后面有多个数据值 则自动组织成元组返回
函数体代码遇到return会立刻结

5.函数的参数

# 形参与实参的关系

形参类似于变量名 在函数定义阶段可以随便写 最好见名知意
实参类似于数据值 在函数调用阶段与形参临时绑定 函数运行结束就立刻断开

def register(username, password):  # username和password为形参
    register(almira, 123)  # almira和123为实参
    
username与almira绑定	password与123绑定
形式参数	在函数定义阶段括号内填写的参数 简称\'形参\'
实际参数	在函数调用阶段括号内填写的参数 简称\'实参\'
位置形参	函数定义阶段括号内从左往右依次填写的变量名 eg:def func(a, b, c):pass
位置实参	函数调用阶段括号内从左往右依次填写的变量名 eg:func(1, 2, 3)
默认参数	本质就是关键字参数 提前给定 用户可传可不传
可变长形参   *args  **kwargs 用来接受多余的关键字参数 组织成字典赋值给**后面的变量名
可变长实参   在这里*类似于for循环 **可以将字典打散成关键字参数的形式传递给函数
# 关于这些参数需要注意以下几个点
越短的越简单的越靠前
越长的越复杂的越靠后
默认参数也要遵循上面
同一个形参在调用时不能多次赋值
按照位置一一对应传值
少一个多一个都不行

6.名称空间

# 名称空间的定义
名称空间就是用来存储变量名与数据值绑定关系的地方(我们也可以简单的理解为就是存储变量名的地方)

\'\'\'内置名称空间\'\'\'
解释器运行自动产生 里面包含了很多名 eg:print input len
    
\'\'\'全局名称空间\'\'\'
py文件运行产生 里面存放文件级别的名字 eg: name = \'almira\'里面的name就是
    
\'\'\'局部名称空间\'\'\'
函数体代码运行时产生
# 名称空间的存活周期以及作用范围
内置名称空间  Python解释器启动自动创建 关闭则自动销毁 解释器级别全局有效
全局名称空间  py文件执行则自动创建 运行结束则自动销毁 py文件级别全局有效
局部名称空间  函数体代码运行就创建 运行结束则自动销毁 函数体代码全局有效

7.名字的查找顺序以及实际案例

涉及到名字的查找 首先要搞明白自己在哪个空间 其实名字的查找顺序是可以打破
# 在局部名称空间中的时候
局部名称空间>>>全局名称空间>>>内置名称空间
# 在全局名称空间中的时候
全局名称空间>>>内置名称空间
1.相互独立的局部名称空间默认不能够互相访问
	 def func1():
    	name = \'jason\'
    	print(age)

    def func2():
       age = 18
       print(name)
2.局部名称空间嵌套
	先从自己的局部名称空间查找 之后由内而外依次查找
"""
函数体代码中名字的查找顺序在函数定义阶段就已经固定死了
	x = \'干饭了\'
    def func1():
        x = 1
        def func2():
            x = 2
            def func3():
                print(x)
                x = 3
            func3()
        func2()

    func1()
"""

8.global与nonglobal

# global 局部名称空间直接修改全局名称空间中的数据
money = 666

def index():
    global money
    money = 123

index()
print(money)
# nonglobal 内层局部名称空间修改外局部名称空间中的数据 
def index():
    name = \'jason\'
    def inner():
        nonlocal name
        name = \'kevin\'
    inner()
    print(name)

index()

9.函数名的多种用法

函数名其实绑定的也是一块内存地址
只不过该地址里面存放的不是数据值而是一段代码
函数名加括号就会找到该代码并执行
以下有四种函数名的用法

·可以当做变量名赋值
·可以当做函数的参数
·可以当做函数的返回值
·可以当做容器类型数据

10.闭包函数

什么是闭包函数?
·定义在函数内部的函数
·用到外部函数的名称空间中的名字

闭包函数实际应用?
·是另外一种给函数体代码传参的方式

# 形如
def outer():
    print(\'from outer\')
    def inner():
        print(\'from inner\')
        

二、关于装饰器

1.装饰器简介

# 概念
在不改变被装饰对象原代码和调用方式的情况下给被装饰对象添加新的功能
# 本质
并不是一门新的技术 而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果
# 口诀
对修改封闭 对扩展开放

2.装饰器的模板(重点 务必掌握)

def outer(func):
    def inner(*args, **kwargs):
        # 执行被装饰对象之前可以做的额外操作
        res = func(*args, **kwargs)
        # 执行被装饰对象之后可以做的额外操作
        return res
    return inner

3.关于语法糖

# 单层语法糖
语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给@函数调用
# 多层语法糖
加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形 index = outter1(wrapper2)

4.递归函数

  1. 直接或者间接调用自己
  2. 每次调用都必须比上一次简单且需要有一个明确的约束条件
  3. 递归:一层层往下
  4. 回溯:基于明确的结果一层层网上

最大递归深度:其实就是python解释器添加的安全措施
官网提供的最大递归深度为1000 实际测试的时候可能会出现996 997 998

def get_age(n):
    if n == 1:
        return 18
    return get_age(n-1) + 2
res = get_age(5)
print(res)

5.匿名函数

函数定义
没有名字的函数 需要使用关键字lambda
匿名函数一般不单独使用 需要配合其他函数一起用

语法结构	lambda 形参:返回值
	
使用场景	lambda a,b:a+b

6.常见内置函数

map()  # 映射
max()  # 最大值
min()  # 最小值
reduce()  # 传多个 返回一个值
abs()  # 绝对值
all()  # 所有数据值对应的布尔值为True结果才是True 否则返回False
any()  # 所有数据值对应的布尔值有一个为True结果才是True 否则返回False
bytes()  # 转换成bytes类型
callable()  # 判断名字是否可以加括号调用
chr(97)  # 基于ASCII码表做转换 数字转换字符
ord(\'a\')  # 基于ASCII码表做转换 字符转换数字
dir()  # 返回括号内对象能够调用的名字 
divmod()  # 元组 第一个数据为整除数 第二个是余数
round()  # 四舍五入
enumerate()  # 枚举
eval()  # 能够识别字符串中的python并执行
exec()  # python内置函数exec支持动态执行python代码
hash()  # 哈希加密
pow()  # 幂指数(次方)
sum()  # 求和
range()  # 能返回一系列连续添加的整数,能够生成一个列表对象
open()  # 打开
id()  # 用于获取对象的内存地址
input()  # 获取用输入
isinstance()  # 用来判断一个函数是否是一个已知的类型
bin()  # 返回一个整数的二进制表示形式的字符串
oct()  # oct() 函数将一个整数转换成 8 进制字符串
hex()  # 将10进制整数转换成16进制,以字符串形式表示
int()  # 将数字或者字符串转换成int类型数据

7.重要内置函数

zip()  # 打包成元组,返回列表,如果长度不一致,则与短的iterable对齐
filter()  # 用于过滤序列,将满足条件的元素取出来构成新的序列
sorted()  # 排序 默认是升序

以上是关于Python基础之函数的主要内容,如果未能解决你的问题,请参考以下文章

Python基础之函数

Python基础之函数

Python基础之:函数

python基础之函数

python基础之函数

Python入门基础之函数切片