在Python中,yield是一个重要的关键字,它与生成器和懒惰计算密切相关。
yield允许函数在迭代过程中产生值,而不必一次性将所有值计算出来。这种特性在处理大数据集或无限序列时尤其有用。那么我们来看下概念以及如何来使用?
一、基本带概念与代码演示
1.yield
的基本概念
yield
是一个关键字,用于定义生成器函数。生成器函数可以被暂停和恢复,允许逐个生成值而不需要一次性计算所有值。当生成器函数执行到yield
语句时,它将生成一个值,并保存其状态,然后等待下一次调用来继续执行。
2.生成器的工作原理
生成器是一种特殊类型的迭代器,由生成器函数创建。生成器函数包含至少一个yield
语句,它可以返回一个值,并在下一次迭代时从yield
语句处继续执行。这允许生成器函数的状态保持不变,而值可以逐个生成。
看下一个例子:
代码语言:javascript复制def demo():
yield 100
yield 110
yield 120
demo=demo()
print(next(demo))
print(next(demo))
print(next(demo))
看下结果如何打印的
代码语言:javascript复制100
110
120
上面代码,demo是一个生成器函数,它包含三个yield语句。当我们创建生成器对象demo并调用next()函数时,生成器函数在每次调用后从yield语句处继续执行,并生成相应的值。打印出来的就是最后的结果。
二、创建生成器
2.1 生成器函数
生成器函数是一种包含yield语句的函数,用于生成值。生成器函数的执行可以被多次暂停和继续,每次暂停都会生成一个值。
以下是一个生成器函数的示例,用于生成斐波那契数列:
斐波那契数列的概念参考:https://baike.baidu.com/item/斐波那契数列/99145
代码语言:javascript复制def fai():
a,b=0,1
while True:
yield a
a,b=b,a b
te=fai()
for _ in range(10):
print(next(te))
结果:
代码语言:javascript复制0
1
1
2
3
5
8
13
21
34
三、yield的高级用法
3.1 生成器的状态保存
生成器函数在每次执行时都会保持其状态。这意味着它可以用于生成无限序列或大数据集,而不必将所有数据存储在内存中。
假设我们想要一个id的生产器,下一次取的时候是自动加 1的,如何来实现?
代码语言:javascript复制def id_next():
num=1
while True:
yield num
num =1
ids=id_next()
for _ in range(5):
print(next(ids))
看下结果:
这样是不是一个简单的id生长器就完成了。
3.2 生成器的数据过滤
yield可以与条件结合使用,用于过滤生成的值。这允许生成器仅生成符合特定条件的值。
我们想要打印出来前10个的奇数,如何打印呢
代码语言:javascript复制def event():
enum=0
while True:
if enum%2!=0:
yield enum
enum =1
rand=event()
for _ in range(10):
print(next(rand))
打印结果:
代码语言:javascript复制1
3
5
7
9
11
13
15
17
19
这里面我们用了生成器取过滤数据,当我们的数据满足的时候呢,我们就打印。
3.3 生成器的懒惰计算
生成器的懒惰计算是一种在需要时计算值的方式,而不是一次性计算所有值。这在处理大型数据集或无限序列时非常有用。
代码语言:javascript复制def sqlue(limit):
for i in range(1,limit 1):
yield i **3
gen=sqlue(5)
for i in gen:
print(i)
结果打印:
代码语言:javascript复制1
8
27
64
125
懒惰计算在处理大量数据时节省内存和计算资源。