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