迭代器
from collections.abc import Iterable
gen = [1, 2, 3]
it = iter(gen) # 拿到迭代器
print(isinstance(gen, Iterable)) # 查看是否是可迭代对象
print(next(it)) # 迭代值
print(next(it))
print(next(it))
# 结果
True
1
2
3
生成器
生成器能够实时的返回结果,不用像普通函数执行那样,执行完才同一输出结果
# li = []
def builder(): # 当有yield关键字在函数中,该函数为生成器函数
for i in range(10000000000):
yield i
# li.append(i)
# return li
day = builder() # 返回的是生成器对象,因为函数中带有yield关键字
print(day)
for i in day:
print(i)
装饰器
把需要改写的函数传进去,把改写好的函数传出来
- 如此改写,不动原来函数,但需要修改接口
def wrapper(): get_print() return print("在已完成函数中,改写的函数") def get_print(): return print("已完成的函数") # get_print() # 原来的接口 wrapper() # 修改的接口 # 结果 已完成的函数 在已完成函数中,改写的函数
- 下面这样改写,不动原来函数,也不需要修改接口,但不够简便
def sayLocal(func): def wrapper(*args, **kwargs): # *args 为可变参数 func(*args, **kwargs) # **kwargs 为可变关键字参数,如 k=2,b=3等{k:2, b:3} return print("在已完成函数中,改写的函数") return wrapper def get_print(): return print("已完成的函数") get_print = sayLocal(get_print) # 可用语法糖 @sayLocal get_print() # 结果 已完成的函数
-
下面这样改写,不动原来函数,也不需要修改接口,也简便,完美
@wraps(func) 返回被装饰的函数属性
def sayLocal(func): @wraps(func) # 返回被装饰的函数属性 def wrapper(*args, **kwargs): # *args 为可变参数 func(*args, **kwargs) # **kwargs 为可变关键字参数,如 k=2,b=3等{k:2, b:3} return print("在已完成函数中,改写的函数") return wrapper # 装饰器 @sayLocal def get_print(): return print("已完成的函数") get_print()