一, 动态传参
1. *args
接收到的是元组
先用位置参数进行传参, 剩下的位置参数用*args进行传参
2. **kwargs
接收到的是一个字典
先用关键字参数进行传参, 剩下的参数用**kwargs进行传参
顺序: 位置参数, *args, 默认值参数, **kwargs
def func(a, *args, b='abc, **kwargs):
print(a, args, b, kwargs)
形参*args, **kwargs聚合
实参*lst, **dic打散
实参的打散: func(*lst, **dic)
函数注释:
def func(a, b): ''' 计算两数之和 :param a: 第一个数 :param b: 第二个数 :return: 两个数的和 ''' return a+b
print(func.__doc__)
二. 命名空间
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间
函数调用, 局部命名空间包括嵌套的函数
作用域:
全局作用域: 内置命名空间 + 全局命名空间
局部作用域: 局部命名空间
print(globals()) 查看全局命名空间中的内容
print(locals()) 查看当前作用域中的内容
三. 函数嵌套
def a():
print('1')
def b():
print('2')
def c():
print('3')
c()
b()
a()
输出:1 2 3
global: 访问全局命名空间的变量, 并可以改变全局命名空间的变量
global a
nonlocal: 访问外层函数中最近一层的那个变量, 并可以改变那个变量
nonlocal b
不使用global或者nonlocal只能读取上一层或全局命名空间的变量, 是不会改变上一层函数或全局命名空间的变量的