python之yield、yield from
该关键字用于函数中会把函数包装为生成器(generator),调用生成器函数时,会返回一个生成器对象,生成器函数是生成器工厂。
def func(): yield 1 yield 2 yield 3 for i in func(): print(i) g = func() print(next(g)) print(next(g)) print(next(g)) # 结果 ''' 1 2 3 1 2 3 '''简单理解,yield的功效为暂停和继续。
在一个函数中,程序执行到yield语句的时候,程序暂停,返回yield后面表达式的值;在下一次调用的时候,yield语句暂停的地方继续执行,如此循环,直到函数执行完。
next函数和send函数很相似,都能获得生成器的下一个yield后面表达式的值,不同的是send函数包含next()方法,不仅可以向生成器传参,然后执行next(),如果下个元素不存在,迭代越界,生成器对象会抛出StopIteration异常。
def foo(): print("starting...") while True: res = yield 4 print("res:", res) f = foo() print(next(f)) print("*"*20) print(f.send(7)) # 这里调用send()函数给生成器给res赋值7,然后继续调用next(f),返回4 # 结果 ''' starting... 4 ******************** res: 7 4 '''yield from x 表达式替代for循环,对x对象所做的第一件事是调用iter(x),从中获取迭代器,因此x可以是任何可迭代对象。任何可迭代对象都应该有一个__iter__方法(特殊情况时,只实现了__getitem__,未实现__iter__,对象也可以迭代),__iter__会返回一个迭代器。
def generate_color(): print("执行generate_color():") yield "红色" yield "橙色" yield "紫色" yield "黄色" class Colors: def __init__(self): print("执行__init__():") self.gen_colors = generate_color() def __iter__(self): yield from self.gen_colors colors = Colors() for color in colors: print(color) # 结果 ''' 执行__init__(): 执行generate_color(): 红色 橙色 紫色 黄色 '''