对函数的进一步了解
-
函数的参数
-
形参角度:
-
动态参数
当给函数传入的参数数目不定时,之前的传参方式解决不了问题.
def chi(*args): # 定义一个函数的时候,* 将实参角度所有的位置参数聚合到一个元组中. print('我请你吃:', args) chi('蒸羊羔', '蒸熊掌', '蒸鹿尾')
def func(**kwargs): # 函数定义时,**将实参的所有的关键字参数聚合成了一个字典给了kwagrs print(kwargs) func(name='小明', age='18', hobby='唱跳rap篮球') def func(*args, **kwargs): # 万能参数 print(args, kwargs)
-
形参的顺序:
-
位置参数 => *args => 默认值参数 => **kwargs
-
仅限关键字参数:
在 *args 和 **kwargs 中间
-
-
-
-
*的魔法用法
def func(*args, **kwargs): print(args) print(kwargs) l1 = [1, 2, 3] l2 = ['小明', '小红', '小丽'] dic = {'k1': 'v1', 'k2': 'v2'} func(*l1, *l2) # 函数的执行时: * 代表打散 func(**dic) # 函数的执行时: ** 代表打散 (key不能是int型) 函数外: a, b, *c = [1, 2, 3, 4, 5, 6] # 处理剩余元素,列表形式 print(a, b, c)
-
命名空间与作用域
-
命名空间:
- 全局命名空间:我们直接在py文件中,函数外声明的变量
- 内置命名空间:python最开始会开辟一个自己的命名空间 -- 内置命名空间
- 局部命名空间:函数内部声明的变量
- 加载顺序: 内置命名空间 => 全局命名空间 => 局部命名空间
- 取值顺序: 局部命名空间 => 全局命名空间 => 内置命名空间
-
作用域:
-
作用域: 变量或函数的声明周期
-
全局作用域: 内置命名空间 全局命名空间
-
局部作用域: 局部命名空间
globals() # 查看全局作用域中的内容 locals() # 查看的是当前作用域中的内容
-
-
-
函数的嵌套
# 函数可以互相嵌套: def outer(): def inner(): print('我是内部') print('我是外部') inner() outer()
-
拓展
- global
- 在局部作用域中可以更改全局作用域的变量(限于字符串,数字)
- 利用global在局部作用域也可以声明一个全局变量
- nonlocal
- 不能更改全局变量
- 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
- global