嵌套函数:在函数中定义函数
def A(k = "enter" ):
print("This is A function")
def B():
return "This is B function"
def C():
return "This is C function"
print(B())
print(C())
A()
>>> This is A function
>>> This is B function
>>> This is C function
函数返回函数:不需要在一个函数里去执行另一个函数,可以将其作为输出返回出来
def A(k = "enter" ):
def B():
return "This is B function"
def C():
return "This is C function"
if k == "enter":
return B
else:
return C
ans = A()
print(ans)
>>> <function A.<locals>.B at 0x000002591645C9D8>
#上面清晰地展示了ans现在指向到A()函数中的B()函数
print(ans())
>>> This is B function
在 if/else 语句中我们返回 B 和 C,而不是 B() 和 C()。这是因为当把一对小括号放在后面,这个函数就会执行;然而如果不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。
当写下 ans = A(), A()会被执行,而由于K 参数默认是 enter,所以函数 B 被返回了。如果把语句改为ans = A(“come in”),那么C函数将被返回。还可以打印出 A()(),这时会输出 This is B function。
def A(k = "enter" ):
def B():
return "This is B function"
def C():
return "This is C function"
if k == "enter":
return B
else:
return C
ans = A("come in")
print(ans)
print(A()())
>>> <function A.<locals>.C at 0x000001BF70322268>
>>> This is B function
函数作为参数传给另一个函数
def A(k = "enter" ):
return "This is A function"
def B(func):
print("This is B function" )
print(func())
B(A)
>>> This is B function
>>> This is A function
到这里其实已经创建了一个装饰器,装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。
def A(func):
def B():
print("B function start executing a func()" )
func()
print("B function finish executing a func()" )
return B
def C():
print("C function")
C()
>>> C function
C = A(C)
C()
>>> B function start executing a func()
>>> C function
>>> B function finish executing a func()
@A 只是一个简短的方式去说明C = A (C)
def A(func):
def B():
print("B function start executing a func()" )
func()
print("B function finish executing a func()" )
return B
@A
def C():
print("C function")
C()
>>> B function start executing a func()
>>> C function
>>> B function finish executing a func()
装饰器蓝本规范:
有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。
def decorator_name(func):
def decorated(*args, **kwargs):
if not can_run:
return "Function will not run"
return func(*args, **kwargs)
return decorated
@decorator_name
def a_func():
return("Function is running")
can_run = True
print(a_func())
>>> Function is running
can_run = False
print(a_func())
>>> Function will not run
装饰器使用场景
授权
def requires_auth(func):
def decorated(*args, **kwargs):
auth = request.authorization
if not auth or not check_auth(auth.username, auth.password):
authenticate()
return func(*args, **kwargs)
return decorated
日志
def logit(func):
def with_logging(*args, **kwargs):
print(func.__name__ + " was called")
return func(*args, **kwargs)
return with_logging
@logit
def addition_func(x):
return x + x
result = addition_func(4)
>>> addition_func was called
print(result)
>>> 8