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