#閉包
'''
閉包
內部函數包含對外部變量的引用,
在通過python的語言介紹一下,一個閉包就是你調用了一個函數A,這個函數A返回了一個函數B給你。
這個返回的函數B就叫做閉包。
你在調用函數A的時候傳遞的參數就是自由變量。
print(f.__closure__) <cell at 0x101fa6318: int object at 0x101f96f50>
print(f.__closure__[0].cell_contents)
print(f.__closure__[2].cell_contents)
'''
x = 1
def A(x):
y = 2
z = 3
def B():
# x+=1 # 報錯 local variable 'x' referenced before assignment,
# 解決,聲明nonlocal x ,即可
print(x, y, z)
return B
f = A(4)
f()
#裝飾器
'''
裝飾器就是一種的閉包的應用,只不過其傳遞的參數是函數:
'''
def timer(func):
def wrapper(*args, **kwargs):
print("1")
res = func(*args,**kwargs)
print("2")
return res
return wrapper
@timer
def foo(a):
print(a)
# foo(3)
functools.wraps用法
"""
2.裝飾器wraps解釋
functools.wraps 是 裝飾器的裝飾器
functools.wraps 可以將原函數對象的指定屬性復制給包裝函數對象, 默認有 module、name、doc
"""
from functools import wraps
def logged(func):
@wraps(func)
def with_logging(*args, **kwargs):
print(func.__name__ + " was called")
return func(*args, **kwargs)
return with_logging
@logged
def f(x):
"""does some math"""
return x + x * x
print(f.__name__) # 加wraps裝飾器 f此時輸出是函數本身名字f
def logged(func):
def with_logging(*args, **kwargs):
print(func.__name__ + " was called")
return func(*args, **kwargs)
return with_logging
@logged
def f(x):
"""does some math"""
return x + x * x
print(f.__name__) # 不加wraps裝飾器,此時輸出with_logging