今日大纲:
1.动态参数
2.聚合和打散
3.函数的注释
4.名称空间
5.函数的嵌套
6.global和nonlocal关键字
1.动态参数
不确定传参个数时候要用到,*args 和 **kwargs。
*args:接收的是实参里的位置参数,在函数内部是以元祖形式存储。
**kwargs:接收的是实参里的关键字参数,在函数内部是以字典形式存储。
def test(*args): print(args) test(1,2,3,4,5,2,3) # 以元祖形式存储 (1, 2, 3, 4, 5, 2, 3) def test2(**kwargs): print(kwargs) test2(a=1,b=2,c=3) # 以字典形式存储 {'a': 1, 'b': 2, 'c': 3}
传参的顺序:
形参: 位置参数 --> 动态位置参数 --> 默认参数 --> 动态(关键字)默认参数 实参: 位置参数 --> 关键字参数
2.聚合和打散
在函数形参定义*args以及**args,表示聚合。
在函数实参写*(可迭代对象),表示打散,形式为,如[1,2,3]表示成1,2,3
在函数实参写**(字典),也表示打散,形式为key=value...
def test(*args,**kwargs): print(args) print(kwargs) a = [1,2,3,4,5] b = {'a':1,'b':2,'c':3} test(*a,**b) # 相当于打散成1,2,3,4,5,'a'=1,'b'=2,'c'=3 """ result: (1, 2, 3, 4, 5) {'a': 1, 'b': 2, 'c': 3} """
注:字典的打散,字典的key必须是字符串。
3.函数的注释
定义完函数,在函数下面一行以6个双引号注释函数功能。
函数.__doc__ # 返回注释的内容
函数.__name__ # 返回函数名
def test(*args,**kwargs): """ 测试打散及聚合。 :param args: 接收的打散后的列表元素 :param kwargs: 接收的打散后的字典元素 :return: """ print(args) print(kwargs) a = [1,2,3,4,5] b = {'a':1,'b':2,'c':3} test(*a,**b) # 相当于打散成1,2,3,4,5,'a'=1,'b'=2,'c'=3 print(test.__doc__) print(test.__name__) """ 测试打散及聚合。 :param args: 接收的打散后的列表元素 :param kwargs: 接收的打散后的字典元素 :return: test """
4.名称空间
加载顺序:
内置名称空间 --> 全局名称空间 --> 局部名称空间
函数内的取值顺序:
局部名称空间 --> 全局名称空间 --> 内置名称空间
5.函数的嵌套
一个函数内的嵌套:
def t1(): def t2(): print(66) t2() t1()
多个函数之间的嵌套调用:
# 通过一个函数,在函数内调用其它函数
def t1(): t2() def t2(): print(66) t3() def t3(): print('t3') t1()
6.global、nonlocal
global:在函数内部修改全局名称空间里的变量,需要用此声明 global a,如果不存在该变量,则创建
nonlocal :在局部名称空间,修改离自己最近的变量,如果上层没有就继续往上找直到全局名称空间还未找到则报错。
global的例子:
def t(): a = 10 def t2(): global a a = 20 print('t2:',a) t2() print('t:',a) a = 1 print(a) t() print(a) # result: """ 1 t2: 20 t: 10 20 """
注:global只能修改全局名称空间里的变量
nonlocal的例子:
def t(): a = 10 def t2(): a = 20 def t3(): nonlocal a a = 30 print('t3:', a) print('t2:', a) t3() print('t2:', a) print('t:',a) t2() print('t:', a) a = 1 t() """ t: 10 t2: 20 t3: 30 t2: 30 #t2函数里的a被修改 t: 10 """
注:如果局部命名空间里没有a,会报错!