函数的动态形参, 作用域
一 动态形参
如果我们需要给? 一个函数传参, ? 而参数? 又是不确定的. 或者我给? 一个 函数传很多参数, 我的形参就要写很多, 很? 麻烦, 怎么办呢. 我们可以考虑使? 用动态参数
动态参数分成两种: 1. 动态接收位置参数, 按位置顺序接受实参 , 如果有位置参数必须写在动态参数前面 默认值参数写在最后方可生效, 传参是必须写 形参 = 值
- def func(*args):
- print(args)
- func(1,2,3,4,5)
- >>>(1,2,3,4,5) # 接收到的实参聚合成元组
- def func(a,*args)
- print(a,args)
- func("这样", 1,2,3,4,5)
>>> 这样 (1,2,3,4,5)
2 动态接收关键字参数
def func(**kwargs)
**kwargs 关键字的动态传参, 接收到的是字典
- def func(**kwargs): # key word arguments
- print(kwargs)
- func(a=10, b=20, jay="周杰伦", jj="林俊杰")
>>>{"a": 10, "b": 20, "jay": 周杰伦, "jj": "林俊杰"}
- func(张无忌 = dic['张无忌'], 谢逊 = dic['谢逊'], 范瑶 = dic['范瑶'])
- func(**dic) # 这里的 ** 是把字典打散. 字典的 key 作为参数的名字, 字典的值作为参数的值传递给形参
小结
在形参上
1. 位置参数
2. 默认值参数
3. 动态参数
1. *args 位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
2. **kwargs 关键字的动态传参. 系统会自动把所有的关键字参数聚合成字典
3. def func(*args, **kwargs): 无敌传参
4. 顺序: 位置参数, *args, 默认值, **kwargs
5. 在使用的时候, 可以任意的进行搭配
4. 在实参上. *, ** 表示的打散. 在形参. *,** 表示聚合
二 作用域 : 作? 用域就是作? 用范围, 按照? 生效范围来看分为 全局作? 用域和局部作? 用域
1 全局作? 用域: 包含内置命名空间和全局命名空间. 在整个? 文件的任何位置都可以使? 用 (遵循 从上到下逐? 执?).
局部作? 用域: 函数内部的变量命名空间 在函数内部可以使? 用.
在 python 解释器开始执? 行行之后, 就会在内存中开辟? 一个空间, 每当遇到? 一个变量量的时候, 就 把变量量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内 存, 表? 示这个函数存在了了, ? 至于函数内部的变量量和逻辑, 解释器是不关? 心的. 也就是说? 一开始 的时候函数只是加载进来, 仅此? 而已, 只有当函数被调? 用和访问的时候, 解释器才会根据函数 内部声明的变量量来进? 行行开辟变量量的内部空间. 随着函数执? 行行完毕, 这些函数内部变量量占? 用的空 间也会随着函数执? 行行完毕? 而被清空.
我们给存放名字和值的关系的空间起? 一个名字叫: 命名空间. 我们的变量量在存储的时候就 是存储在这片空间中的.
命名空间分类:
@. 全局命名空间 --> 我们直接在 py? 文件中, 函数外声明的变量量都属于全局命名空间
2. 局部命名空间 --> 在函数中声明的变量量会放在局部命名空间
3. 内置命名空间 --> 存放 python 解释器为我们提供的名字, list, tuple, str, int 这些都是内 置命名空间
@作? 用域命名空间:
1. 全局作? 用域: 全局命名空间 + 内置命名空间
2. 局部作? 用域: 局部命名空间
@加载顺序:
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间 (函数被执? 行行的时候)
@取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
@重要关键字
globals(): 查询全局变量命名空间的内容
locals() : 查询当前作用域变量命名空间的内容
global 表? 不再使? 用局部作? 用域中的内容了了. ? 而改? 用全局作? 用域中的变量
nonlocal 表? 示在局部作? 用域中, 调? 用? 父级命名空间中的变量, 引入最近的一层, 没有则创建
来源: http://www.bubuko.com/infodetail-2768160.html