-
动态参数
位置动态参数:
1 def fun(*args): 2 print(args) 3 fun(1, 2, 3) 4 # 结果 5 # (1, 2, 3)
*args是位置动态参数,可接收所有位置参数并得到一个元祖
*定义的时候是聚合的作用,调用的时候使用是打散
1 lst = [1, 2, 3] 2 def fun(*args): 3 print(*args) #打散 4 fun(*lst) #打散 5 # 结果 6 # 1 2 3
关键字动态参数:
1 def fun(**kwargs): 2 print(kwargs) 3 fun(a=1, b=2, c=3) 4 # 结果 5 # {'a': 1, 'b': 2, 'c': 3}
**kwargs是关键字动态参数,可以接收所有关键字参数并得到一个字典
**kwargs 定义的时候是聚合
*kwargs 使用的时候 打散字典的键
1 dic = {'a': 1, 'b': 2} 2 def fun(**kwargs): 3 print(*kwargs) #将字典的键打散 4 fun(**dic) 5 # 结果 6 # a b
1 dic = {'a': 1, 'b': 2} 2 def fun(**kwargs): 3 print(kwargs) 4 fun(**dic) 5 # 结果 6 # {'a': 1, 'b': 2}
当位置参数,位置动态参数,关键字参数,动态关键字参数都存在的时候,定义传参时要遵循如下顺序:
位置参数>位置动态参数>关键字参数>动态关键字参数
当*args与**kwargs一起使用的时候可以万能传参
1 def func(*args,**kwargs): 2 pass
-
函数的注释
1 def func(*args,**kwargs): 2 ''' 3 #很重要 写函数一定要写注释 4 :param args: 要标识的内容 5 :param kwargs: 要标识的内容 6 :return: 要标识的内容 7 ''' 8 pass
如何查看函数的注释:
函数名.__doc__
1 def func(*args,**kwargs): 2 ''' 3 #很重要 写函数一定要写注释 4 :param args: 要标识的内容 5 :param kwargs: 要标识的内容 6 :return: 要标识的内容 7 ''' 8 pass 9 10 print(func.__doc__)
-
名称空间
内置空间:Python关键字是存在内置空间的
全局空间:py文件中顶头写的内容就存在全局空间
局部空间:函数内写的变量存在局部空间
当函数找值时是先从局部空间找,找不到再去全局空间找,再找不到再去内置空间去找
当程序加载时先加载内置空间,再加载全局空间,再加载局部空间
作用域名称空间:
内置空间 + 全局空间 == 全局作用域空间
局部空间 == 局部作用域空间
局部作用域的变量在全局作用域或者其他的局部作用域是不能使用的
1 # globals() 查看全局空间的内容 2 a = 10 3 b = 20 4 print(locals())
1 # locals() 查看全局空间的内容 2 def func(): 3 a = 10 4 print(locals()) 5 6 7 func()
1 # global 可在局部空间修改全局变量 2 a = 10 3 def func(): 4 global a 5 a = 5 6 print(a) 7 8 9 func()
1 # nonlocal 在局部空间里,修改离它最近的上一级,上一级不存在就继续往上找直到最外层局部空间 2 def func(): 3 a = 5 4 def foo(): 5 def fun(): 6 nonlocal a 7 a = 2 8 fun() 9 foo() 10 print(a) 11 12 13 func()
-
函数的嵌套
1 def f1(): 2 print("函数f1") 3 4 5 def f2(): 6 print("函数f2") 7 f1() 8 9 10 f2()
1 def f1(): 2 print("f1") 3 def f2(): 4 print("f2") 5 def f3(): 6 print("f3") 7 def f4(): 8 print("f4") 9 f4() 10 f3() 11 f2() 12 f1()