参考文章:csdn:(116条消息) Python函数学习-生成器函数_火星有星火的博客-CSDN博客
1.生成器是什么?
在Python中,生成器(generator)是一种特殊的迭代器,它是通过函数来实现的。生成器函数在执行过程中可以暂停和继续执行,可以动态地生成一系列值,而不需要一次性生成所有值,从而节省了内存空间和计算资源。
2.生成器函数和普通函数的区别
生成器函数与普通函数的区别在于,生成器函数中使用了yield语句来产生值,而不是使用return语句返回值。当生成器函数被调用时,它会返回一个生成器对象,而不是直接执行函数体中的代码。当生成器对象被迭代时,生成器函数中的代码会逐行执行,直到遇到yield语句,此时会暂停执行并将yield后面的值作为迭代器的下一个值返回。下一次迭代时,生成器函数会从yield语句后面的代码继续执行,直到再次遇到yield语句,以此类推。
3.以下是一个简单的生成器函数的示例,它生成了从0开始的自然数序列:
return
numbers = natural_numbers()
难到numbers不应该等于函数natural_numbers的返回值None吗?
虽然有显式return语句(可以没有return),但是当python编译是执行到yield语句时,就会给函数natural_numbers打上生成器标签,于是调用该生成器函数natural_numbers可以返回一个生成器对象存到numbers。
def natural_numbers():
n = 0
while True:
yield n
n += 1
return
numbers = natural_numbers()
通过迭代器的方式---next()方法依次获取序列中的值:
yield、return都不是生成器函数的返回值,只有当我对生成器对象使用nexth函数的时候,才会开始运行生成器函数本体
print(next(numbers)) # 输出:0
print(next(numbers)) # 输出:1
print(next(numbers)) # 输出:2
由于生成器对象是一种迭代器,因此可以在for循环中使用,例如:
for n in natural_numbers():
if n > 10:
break
print(n)
4.生成器函数执行逻辑
for i in range(5):
yield i #执行了5次yield语句。
def gen():
print('line 1')
yield 1
print('line 2')
yield 2
print('line 3')
return 3
yield 4
5.next()
next(gen()) # line 1
next(gen()) # line 1
line 1
1
line 1
1
g = gen()
print(g)
print(next(g)) # line 1
print(next(g)) # line 2
line 1
1
line 2
2
print(next(g)) # StopIteration
line 3
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
in
----> 1 print(next(g)) # StopIteration
StopIteration: 3
StopIteration: 3
6.作用
def counter():
i = 0
while True:
i += 1
yield i
def inc(c):
return next(c)
c = counter()
print(inc(c))
def inc():
def counter():
i = 0
while True:
i += 1
yield i
c = counter()
return lambda : next(c)
foo = inc()
print(foo()) # 1
print(foo()) # 2
print(foo()) # 3
def fib():
x = 0
y = 1
while True:
yield y
x, y = y, x+y
foo = fib()
for _ in range(5):
print(next(foo))
7.生成器函数语法糖-yield from
def inc():
for x in range(1000):
yield x
def inc():
yield from range(1000) ## 解释器优化的语法糖