函数生成器代码
def num():
print("message 1")
yield 1
print("message 2")
yield 2
print("message 3")
yield 3
f = num()
x = next(f)
print(x)
x = next(f)
print(x)
x = next(f)
print(x)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
执行分析
- 在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 = maxNum
self.current = 0
def __iter__(self):
return self
def __next__(self):
result = self.current ** 2
self.current += 1
if self.current > self.maxNum:
raise StopIteration
return result
mySquare = MySquare(5)
for t in mySquare:
print(t)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
等价上面的代码
def funSquare(num):
for x in range(num+1):
yield x ** 2
print("**" * 10)
for x in funSquare(5):
print(x)