目錄
用兩層函數,最外層函數用來接受需要增加新功能的函數,並將內層函數返回
def log_in(func):
"""實現裝飾器"""
def wrapper():
print('start...')
func()
print('end...')
return wrapper
@log_in #使用裝飾器
def hello_wrapper():
print("hello wrapper")
if __name__ == "__main__":
hello_wrapper()
多個裝飾器
def log(func):
"""實現裝飾器"""
def wrapper():
print('start...')
func()
print('end...')
return wrapper
def log_in(func):
"""實現裝飾器"""
def wrapper():
print('開始進入...')
func()
print('結束...')
return wrapper
@log #使用裝飾器
@log_in
def test():
print("test..")
if __name__ == "__main__":
test()
帶參數的裝飾器
例如給hello()函數增加功能
給不帶參數的函數增加功能,在不帶參數的裝飾器的基礎上,再套一層函數,即三層函數,最外層用來接受傳入的形參(非hello()函數的形參),第二層用來接受需要添加功能的函數
def log(name=None):
"""實現裝飾器"""
def decorator(func):
def wrapper():
print('{}.start...'.format(name))
func()
print('{}.end...'.format(name))
return wrapper
return decorator
@log("from hello")
def hello():
print("hello world")
if __name__ == "__main__":
hello()
給帶參數的函數增加功能,在最內層函數傳入參數。
def log(name=None):
"""實現裝飾器"""
def decorator(func):
def wrapper(*args, **kwargs):
print('{}.start...'.format(name))
func(*args, **kwargs)
print('{}.end...'.format(name))
return wrapper
return decorator
@log("from add")
def add(a, b):
print("{} + {} = {}".format(a, b, a + b))
if __name__ == "__main__":
add(5, 4)
給有返回值的函數增加功能,最內層函數需要添加return
def log(name=None):
"""實現裝飾器"""
def decorator(func):
def wrapper(*args, **kwargs):
print('{}.start...'.format(name))
res = func(*args, **kwargs)
print('{}.end...'.format(name))
return res
return wrapper
return decorator
@log("from add")
def add(a, b):
return a + b
if __name__ == "__main__":
a, b = 3, 5
print("{} + {} = {}".format(a, b, add(a, b)))
迭代器
- 迭代:意味着重複多次,就像循環那樣(list,tuple)
- 實現了方法__iter__的對象是可迭代的,而實現了方法__next__的對象是迭代器
- 調用方法__next__時(或next()),迭代器返回其下一個值
- 如果迭代器沒有可供返回的值,觸發Stoplteration異常 從迭代器創建序列 通過對可迭代對象調用內置函數iter,可獲得一個迭代器
生成器
- 生成器是一種使用普通函數語法定義的迭代器
- 包含yield語句的函數都被稱爲生成器
- 不使用return返回一個值,而是可以生成多個值,每次一個
- 每次使用yield生成一個值後,函數都將凍結,即在此停止執行
- 被重新喚醒後,函數將從停止的地方開始繼續執行