小伙伴们,让我们一起认识一下 Python 的 yield 是什么存在吧,上干货喽~
yield 是 Python 中用于定义生成器(generator)的关键字。生成器是一种特殊的迭代器,可以逐步生成值,而不是一次性生成所有值。yield 的使用使得函数可以暂停执行并保存当前状态,稍后可以从暂停的地方继续执行。
1. yield 的基本用法
- 当一个函数中包含 yield 时,这个函数就变成了一个生成器函数。
- 调用生成器函数时,不会立即执行函数体,而是返回一个生成器对象。
- 每次调用生成器的 __next__() 方法(或使用 next() 函数)时,函数会执行到 yield 语句,返回 yield 后面的值,并暂停执行。
- 下次调用 __next__() 时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 或函数结束。
例如:
def simple_generator():
yield 1
yield 2
yield 3
# 创建生成器对象
gen = simple_generator()
# 逐步获取值
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
2. 生成器的特点
- 惰性求值:生成器不会一次性生成所有值,而是按需生成。
- 节省内存:适合处理大量数据或无限序列。
- 可迭代:生成器实现了迭代器协议,可以用 for 循环遍历。
例如:
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
# 使用 for 循环遍历生成器
for num in count_up_to(5):
print(num)
# 输出:
# 1
# 2
# 3
# 4
# 5
3. yield 与 return 的区别
- return 会终止函数并返回值,函数状态会被销毁。
- yield 会暂停函数并返回值,函数状态会被保留,下次可以继续执行。
4. 生成器的应用场景
- 处理大数据集:避免一次性加载所有数据到内存。
- 无限序列:例如斐波那契数列。
- 协程:通过 yield 实现简单的协程。
示例:斐波那契数列
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 获取前 10 个斐波那契数
fib = fibonacci()
for _ in range(10):
print(next(fib))
# 输出:
# 0
# 1
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# 34
5. yield from
- yield from 用于简化生成器的嵌套,可以将另一个生成器的值直接 yield 出来。
示例:
def generator1():
yield from range(3)
def generator2():
yield from generator1()
yield from range(3, 6)
for value in generator2():
print(value)
# 输出:
# 0
# 1
# 2
# 3
# 4
# 5
6. 生成器与协程
- 通过 yield 可以实现简单的协程(coroutine),用于任务切换。
- Python 3.5 引入了 async 和 await,提供了更强大的协程支持。
示例:简单协程
def coroutine():
print("Start")
x = yield
print("Received:", x)
# 创建协程
c = coroutine()
next(c) # 启动协程,执行到 yield
c.send(10) # 发送值给 yield,继续执行
# 输出:
# Start
# Received: 10
7.好了,做一下小结
- yield 用于定义生成器,生成器可以逐步生成值,节省内存。
- 生成器适合处理大数据集、无限序列和实现协程。
- yield from 可以简化生成器的嵌套。
- 生成器是 Python 中非常强大且灵活的工具!
爱学习的小伙伴,关注不迷路哟~
python