这篇教程python中*args与**kwarsg及闭包和装饰器的用法写得很实用,希望能帮到您。
*args与**kwarsg及闭包和装饰器
过程先理解闭包,再理解装饰器,不要忘了不定长参数 def func(): msg = '111' def func1(): print(msg) return func1 """1-理解闭包闭包即内部函数调用外部函数作用域里面的变量比如func1就是一个闭包函数"""func()()# 这里实际上是func1() """2-装饰器fn是被装饰的目标函数2.1-仅仅只是传递函数名的装饰器[基本不会用到]2.2-装饰带有参数的函数2.3-装饰带有返回值的函数2.4-装饰参数不确定的函数[可归类到装饰带有参数的函数里面]2.5-装饰器本身携带参数""" def decorator(fn): def wrapper(): print("添加的功能,装饰不带有参数的函数") return fn() return wrapper @decoratordef test(): print("原有功能") test()# 实际上是decorator(test) def decorator1(fn): def wrapper(n1,n2): print("添加的功能,装饰带有参数的函数") return fn(n1,n2) return wrapper @decorator1def test1(a,b): print("a+b=%s"%(a+b)) print("原有功能") test1(1,2)# 实际上是decorator1(test1(1,2)) def decoretor2(fn): def wrapper(): print("添加的功能,装饰带有返回值的函数") res = fn() return res return wrapper @decoretor2def test2(): print("原有功能") return "返回值001" a = test2() # 实际是decorator2(test2)print(a) def decorator3(fn): def warpper(*args,**kwargs): print("添加的功能,装饰不定长参数的函数") return fn(*args,**kwargs) return warpper @decorator3def test3(n1,n2,n3): print("原有功能") print(n1+n2+n3) test3(1,2,3)# 实际上是decorator1(test1(1,2,3)) def decorator4(home): def func_1(fn): def wrapper(*args,**kwargs): print("装饰器本身携带参数") print("目前家在%s"%(home)) return fn(*args,**kwargs) return wrapper return func_1 @decorator4(home='wuhan')def test4(n1,n2,n3): print("原有功能") print(n1+n2+n3) # test3(1,2,3)=decorator3(home="武汉")(test(1,2,3))()"""1-先调用decorator3(home="wuhan")2-执行func_1(test(1,2,3)) # 到这里其实就和前面的装饰器一样3-执行wrapper4-执行test(1,2,3)"""test4(1,2,3) 
Python fun(*args,**kwargs)中*args,**kwargs参数含义及用法
1. Python函数中的两种参数我们知道,在Python中有两种参数 - 位置参数(positional argument): 位置参数只能由参数位置决定
- 关键词参数(keyword argument): 关键词参数只需要用 keyword = somekey 的方法即可传参
位置参数只能由参数位置决定。这也就决定了位置参数一定要在前面,否则关键词参数数量的变化都会使得位置无法判断。
2. 理解函数调用中的**的作用是将tuple或者list中的元素进行unpack,分开传入,作为多个参数。 |