yield(生成器)
v.
产生(收益、效益等),产生(结果);出产(天然产品,农产品,工业产品);屈服,让步;放弃,让出;给(大路上的车辆)让路;(受压)活动,弯曲,折断;<正式>被……替代;请(某人)讲话;停止争论
n.
产量;收益,利润,红利(或股息)率
翻译下:
就是代码运行一段时间之后产生了一些东西。
yield的函数则返回一个可迭代的 generator(生成器)对象。可以使用for循环,或者调用next()方法遍历生成器对象来提取结果。
class test():def __init__(self, data=1):self.data = datadef __next__(self): if self.data > 5:raise StopIterationelse:self.data += 1return self.data
t = test(3)
for i in range(3):print(t.__next__())
class Fibs:def __init__(self):self.a = 0self.b = 1def __next__(self):self.a, self.b = self.b, self.a + self.breturn self, self.a, self.bdef __iter__(self):print("A")return selffibs = Fibs()
print(fibs)
print("*************")
print(fibs.__iter__())
上面讲的是迭代器:
下面说生成器:
生成器是一种特殊的迭代器。当调用fib()函数时,生成器实例化并返回,这时并不会执行任何代码,生成器处于空闲状态,注意这里prev, curr = 0, 1并未执行。然后这个生成器被包含在list()中,list会根据传进来的参数生成一个列表,所以它对fib()对象(一切皆对象,函数也是对象)调用__next__方法。
def fib(end = 1000):prev,curr=0,1while curr < end:yield curr #这个yield,每次执行就会返回,并不会使程序结束prev,curr=curr,curr+prev#print(list(fib()))#这个yield,每次执行就会返回,并不会使程序结束,并将结果放在管道中,每执行一次就会返回一个当前的yield的值,如果执行结束。
a = fib()
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
#####
1
1
2
3