day10 函数进阶
今日主要内容
1. 动态传参
形参: 1.位置参数 2. 默认值参数, 3. 动态传参
重点:动态传参: 1. *args: 动态接收位置参数 2. **kwargs: 动态接收关键字参数
顺序: 位置参数 > *args > 默认值参数 > **kwargs
无敌传参: def func(*args, **kwargs):
*, ** 在形参位置: 聚合作用 在实参位置: 打散作用(针对可可迭代对象list tuple str dict)
def fun(*args): print(args) lst = [1, 4, 7] fun(lst[0], lst[1], lst[2]) fun(*lst) # 可以使⽤*把⼀个列表按顺序打散 s = "⾂妾做不到" fun(*s) # 字符串也可以打散, (可迭代对象) def fun(**kwargs): #字典打散需要** print(kwargs) dic = {'a':1, 'b':2} fun(**dic)
实参: 1. 位置参数 2. 关键字参数 3. 混合参数
2. 名称(命名)空间和作用域:
名称空间: 存放名字和值的关系的空间
分类:
1. 全局命名空间: 在py文件中, 函数外声明的变量都属于全局命名空间
2. 局部命名空间: 在函数中声明的变量会存放在这里 写的代码从上到下
3. 内置命名空间: 存放在python解释器为我们提供的名字 函数, 类, 方法, 其他模块, 对象
加载顺序: 内置 全局 局部(函数执行的时候)
取值顺序: 局部 全局 内置
作用域: 作用范围
分类:
全局作用域: 全局 + 局部
局部作用域: 局部
globals() 查看全局作用域的名字
locals() 查看当前作用域的名字
参考: https://www.cnblogs.com/zhangxinhe/p/6963462.html
3. 函数的嵌套(难点)
明白每一层都会产生独立的的名称空间
4. 关键字 nonlocal global
global : 在局部引入全局的内容, 可以升华一个变量为全局变量
nonlocal : 在局部, 引入上一层名称空间的变量, 如果没有, 继续上一层......
a = 1 def fun_1(): a = 2 def fun_2(): nonlocal a a = 3 def fun_3(): a = 4 print(a) print(a) fun_3() print(a) print(a) fun_2() print(a) print(a) fun_1() print(a)
搞定这段就可以!!! (1234331)