Python中的yield关键字

2023-11-27 16:18:01 浏览数 (1)

在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

懒惰计算在处理大量数据时节省内存和计算资源。

0 人点赞