动态传参, 名称空间, 嵌套, gloabal, nonlocal
一, 动态传参
1. *args
接收到的是元组
先用位置参数进行传参, 剩下的位置参数用*args进行传参
2. **kwargs
接收到的是一个字典
先用关键字参数进行传参, 剩下的参数用**kwargs进行传参
位置参数, *args, 默认值参数, **kwargs
形参的**kwargs后面再出现任何 位置参数 或 关键字参数 或 *args参数 都会报错, 显示语法错误
形参的*args参数 后面如果加上 位置参数 会报错, 因为位置参数接不到传参, 显示位置参数没接到传参的错误
实参的位置参数必须全部在关键字参数前
def func(a, *args, b='abc, **kwargs):
print(a, args, b, kwargs)
形参*args, **kwargs聚合
实参*lst, **dic打散
实参的打散: func(*lst, **dic)
def func(**kwargs):
print(kwargs)
func(qwe='123', asd='456')
def func(**kwargs):
print(kwargs)
func('qwe'='123', 'asd'='456') # 字符串可以作为字典的键, 但是这里会报错, 因为如果字符串要传到函数中去, 需要键是一个变量
函数注释:
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只能读取上一层或全局命名空间的变量, 是不会改变上一层函数或全局命名空间的变量的