目录
用两层函数,最外层函数用来接受需要增加新功能的函数,并将内层函数返回
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生成一个值后,函数都将冻结,即在此停止执行
- 被重新唤醒后,函数将从停止的地方开始继续执行