欢迎访问宙启技术站
智能推送

生成器函数:yield语句和生成器对象

发布时间:2023-05-31 01:07:52

一、什么是生成器函数

生成器函数是一种特殊的函数,它不像普通函数一样执行完毕后直接返回结果,而是可以通过yield语句来返回一个值,并暂停执行,等待下次调用时继续执行,直到函数结束或清除操作。

二、yield语句的作用

yield语句是生成器函数的核心特性,它用来返回值并暂停函数执行,等待下次调用时从暂停处继续执行,直到所有值都被返回或函数被清除。

在生成器函数中,可以使用多个yield语句来返回不同的值,每次调用生成器函数都会从上一次yield语句执行的位置继续向下执行,直到遇到下一个yield语句或函数结束。

yield语句也可以用来接收外部传入的参数,如下所示:

def my_generator():
    value = yield
    print("Received value:", value)
    
g = my_generator()
next(g)  # 先执行一次,启动生成器函数
g.send("Hello")

在上面的代码中,my_generator函数中使用yield语句来接收外部传入的参数,调用生成器函数时需要先执行一次next函数来启动生成器函数,并可使用send函数将参数传入。

三、生成器对象的特点

生成器函数可以用来创建生成器对象,生成器对象具有以下特点:

1. 生成器对象可以迭代,可以使用for循环或next函数来获取每次返回的值;

2. 生成器对象只能正向迭代一次,一旦遍历完毕,就不能再次迭代;

3. 生成器对象可以作为函数返回值,从而实现一种延迟计算的效果;

4. 生成器对象可以用于协程,通过yield语句可以实现异步调用。

四、使用生成器函数的示例

生成器函数的应用场景很广泛,下面是一些示例:

1. 生成斐波那契数列

def fibonacci(n):
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b
        
for i in fibonacci(10):
    print(i)

运行结果:

0
1
1
2
3
5
8

2. 生成随机密码

import random
import string

def random_password(length):
    while True:
        yield ''.join(random.choices(string.ascii_letters + string.digits, k=length))
        
for i in random_password(8):
    print(i)

运行结果:

ykwf2L33
qv3ehAc4
dK4glcwv

3. 生成随机数列

def random_list(length, start, end):
    while True:
        yield [random.randint(start, end) for _ in range(length)]
        
for i in random_list(5, 0, 10):
    print(i)

运行结果:

[8, 5, 8, 5, 4]
[6, 6, 7, 3, 0]
[4, 4, 1, 9, 4]

五、总结

生成器函数和yield语句是Python中的一个很强大的特性,通过它可以快速、简洁地生成各种不同类型的数据结构,特别是在大数据量、高计算量的情况下,可以大大提高程序效率和性能。