一,函数动态参数
首先要了解,动态参数只会出现在形参的位置:它诞生的意义在于之前讲的形参的位置参数,默认参数在有很多值需要传入的情况下会非常麻烦,定义许多参数,因此诞生了动态参数
动态参数:不论用户输入多少参数,都可以接收
1,动态参数分类:
1,形参接收动态位置参数
使用一个*号+变量名表示即可(但是程序员约定俗成使用“*args”表示);注意这里是把传入的值变成元组返回
2,形参接收动态关键字参数
使用两个**号+变量名即可(但是程序员约定俗成使用**kwargs表示):注意这里是把传入的值变成字典返回
动态参数示例:
def func(*x,**y): # 注意这里的变量名是可以随便写的 print(x) print(y) func(1,2,3,4,5,c=3,v=6) # 前面的单个字符是位置参数,后面的是关键字参数
2,动态参数优先级
上面讲了动态参数,那么它和之前讲的位置参数默认参数之间有什么关系呢? 她们之间存在优先级问题,看如下代码:
def func(*args,a,b): print(args) print(a) print(b) func(1,2,3,4,5) File "D:/python-file/python练习/练习测试.py", line 12, in <module> func(1,2,3,4,5) TypeError: func() missing 2 required keyword-only arguments: 'a' and 'b'
由上图可以看出,由于*args已经把全部的位置参数都取走了,导致后面的a,b根本无法取到值,因此报错。由此得出结论:位置参数优先级>动态位置参数
def func(a,b,*args): print(args) print(a) print(b) func(1,2,3,4,5) 打印结果: (3, 4, 5) 1 2
那么接下来再看动态关键字参数:
def func(**kwargs,b=1,c=2): print(kwargs) print(c) print(b) func(b=3,c=5) 报错信息: def func(**kwargs,b=1,c=2): ^ SyntaxError: invalid syntax
由上图看出,由于**kwargs已经把所有的关键字参数取走啦,之后定义的默认参数变得无意义。由此得出结论:默认参数优先级>动态关键字参数
def func(b=1,c=2,**kwargs): print(kwargs) print(c) print(b) func(b=3,c=5,v=6,h=9) 返回结果: {'v': 6, 'h': 9} # 注意此处返回的是一个字典 5 3
那么位置参数和默认参数的优先级关系呢:位置参数 > 动态位置参数 > 默认参数 > 动态关键字参数
二,函数的注释
就是对函数的描述信息:需要写在函数中(三个引号,和之前的多行注释一样)
def func(*args,b=1,c=2,**kwargs): ''' :param args: # 具体描述函数体的意思 :param b: :param c: :param kwargs: :return: ''' print(args) print(kwargs) print(c) print(b) func(1,2,3,4,5,b=3,c=5,v=6,h=9)
这里主要涉及一个方法:
不进入函数,查看函数的描述信息:print(‘函数名’.__doc__)【注意这里是双杠】
def func(*args, b=1, c=2, **kwargs): ''' :param args: # 具体描述函数体的意思 :param b: :param c: :param kwargs: :return: ''' print(args) print(kwargs) func(1, 2, 3, 4, 5, b=3, c=5, v=6, h=9) print(func.__doc__) 会在下面显示你的注释信息
三,命名空间
1,命名空间分类:
1,内置命名空间:python内置的一些方法,例如:list tuple
2,全局命名空间:在一个py文件中定义的变量,但是不在函数内就是全局命名空间
3,局部命名空间:在函数内的声明的变量
2,命名空间加载顺序:
当你打开一个py文件,首先开始加载内置命名空间 > 全局命名空间 > 局部命名空间
3,命名空间取值顺序:
和加载顺序正好相反:局部命名空间 > 全局命名空间 > 内置命名空间
三,函数的嵌套
顾名思义就是函数内部还存在函数
def func(): print('666') def func1(): print('您好') func1()
四,函数的返回值
return:可以使用return给调用者返回一个值,如果不写return默认返回None
五,global,nonlocal
global:调用全局变量
nonlocal:调用函数内最近的局部变量(如果在上一层没有找到,就一直往上层找,直到最后也没有找到就报错)【不会找全局变量】