函数进阶
-
动态参数(形参第三种传参方式)
*1.1 args 动态位置参数,可将不定数目的位置参数全部接收
从实参角度来看:定义函数时,*将所有的位置参数聚合到一个元组中,并赋值给args。
def eat(*args): print(args) print(f'我请你吃:{args}') eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅') 结果: ('蒸羊羔', '蒸熊掌', '蒸鹿尾', '烧花鸭', '烧企鹅') 我请你吃:('蒸羊羔', '蒸熊掌', '蒸鹿尾', '烧花鸭', '烧企鹅')
**1.2 ****kwargs动态关键字参数,可将不定数目的关键字参数全部接收
从实参角度来看:定义函数时,*将所有的关键字参数聚合成一个字典,并赋值给kwargs。
def func(**kwargs): print(kwargs) func(name='alex',age=84,hobby='唱跳rap篮球') 结果: {'name': 'alex', 'age': 84, 'hobby': '唱跳rap篮球'}
*args与**kwargs合称为万能参数
def func(*args,**kwargs): print(args,kwargs) func(1,2,4,'fjdksal',age=84,hobby='唱跳rap篮球') 结果: (1, 2, 4, 'fjdksal') {'age': 84, 'hobby': '唱跳rap篮球'}
1.3 *的其他用法
在函数中,当函数执行时*可以将参数打散
def func(*args): print(args) # (1, 2, 3,'太白', 'wusir', '景女神') l1 = [1, 2, 3] l2 = ['太白', 'wusir', '景女神'] func(*l1,*l2) 结果: (1, 2, 3, '太白', 'wusir', '景女神')
def func(**kwargs): print(kwargs) func(**{'name':"alex"},**{'age': 73,'hobby': '吹'}) 结果: {'name': 'alex', 'age': 73, 'hobby': '吹'}
在函数外可以处理剩余元素
a,*c,b, = [1,2,3,4,5] #1 [2, 3, 4] 5
1.4 仅限关键在参数(形参第四种传参)
def func(a,b,*args,sex='man',c,**kwargs,): print(a) print(b) print(sex) print(c) print(args) print(kwargs) func(1,2,4,5,6,67,c=666,name='太白',age=18,) 结果: 1 2 man 666 (4, 5, 6, 67) {'name': '太白', 'age': 18}
1.5 形参的顺序
*args不能放在位置参数前面,会使后面的位置参数接收不到值;不能放到默认参数之后,这样要接到值就要改变默认参数
**kwargs只能放在最后
最终顺序为:位置参数,*args,默认参数,仅限关键字参数,**kwargs
-
空间角度研究函数
全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。
临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。
内置名称空间:input,print,内置函数等。
-
取值顺序和加载顺序
加载顺序:上面这三个空间,谁先加载到内存。
内置名称空间 ----> 全局名称空间 ----> (函数执行时)临时名称空间
取值顺序:(就近原则)
-
作用域
全局作用域:全局名称空间,内置名称空间。
局部作用域:局部名称空间。
作用于法则:
在开始编写函数之前,所有的代码都是位于一个模块的顶层(也就是说,并不是嵌套在def之中的),所以目前使用的变量名要么是存在于模块文件本身,要么就是python内预先定义好的。函数定义了本地作用域,而模块定义了全局作用域。
- 内嵌的模块是全局作用域。每一个内嵌模块都是一个全局作用域
- 全局作用域的作用范围仅限于单个文件
- 每次对函数的调用都创建了一个新的本地作用域,本地作用域实际上对应的是函数的调用
- 函数中赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量
- 所有其他变量名都可归纳为本地、全局或者内置的。在函数内部的尚未赋值的变量名是一个在一定范围内的(在这个def内部)的本地变量、全局(在一个模块的命名空间内部)或者内置(由python的预定义_builtin_模块提供的)变量。
-
内置函数
globals 全局作用域所有的内容
locals 当前位置的变量与值的对应关系
-
高阶函数
函数的内嵌
def fun2(): print(2) def func3(): print(6) print(4) func3() print(8) print(3) fun2() print(5) 结果: 3 2 4 6 8 5