函数生成器代码
def num():print("message 1")yield 1print("message 2")yield 2print("message 3")yield 3f = num()
x = next(f)
print(x) x = next(f)
print(x) x = next(f)
print(x)
执行分析
- 在num函数中有yield关键字,此时,num就不是一个函数了,而是一个生成器,
- 当调用next函数的时候,会执行到第一个yield,因此会打印message 1,此时生成器返回了yield后面的值,即1
所以print(x)的时候打印了1
此时生成器对象卡在了 yield 1这行 - 当再次调用next函数的时候,代码是从上次卡在的地方继续执行,所有打印了message 2,并且生成器对象返回了2,此时生成器卡在了 yield 2
自定义类生成器代码
class MySquare:def __init__(self, maxNum: int):self.maxNum = maxNumself.current = 0def __iter__(self):return selfdef __next__(self):result = self.current ** 2self.current += 1if self.current > self.maxNum:raise StopIterationreturn resultmySquare = MySquare(5)
for t in mySquare:print(t)
等价上面的代码
def funSquare(num):for x in range(num+1):yield x ** 2print("**" * 10)
for x in funSquare(5):print(x)