当前位置: 技术文章>> 100道python面试题之-如何使用Python的yield关键字创建生成器?
文章标题:100道python面试题之-如何使用Python的yield关键字创建生成器?
在Python中,`yield` 关键字用于从函数中返回一个生成器(generator)。生成器是一种特殊的迭代器,它允许你逐个地生成并返回元素,而不是一次性生成一个完整的列表,这样可以节省内存空间。使用 `yield` 的函数称为生成器函数,它返回一个迭代器对象。
### 如何使用 `yield` 创建生成器
下面是一个简单的例子,展示了如何使用 `yield` 关键字来创建一个生成器,该生成器用于生成一个范围内的数字:
```python
def count_to_n(n):
for i in range(n):
yield i
# 使用生成器
gen = count_to_n(5)
# 遍历生成器
for num in gen:
print(num)
```
输出将会是:
```
0
1
2
3
4
```
在这个例子中,`count_to_n` 是一个生成器函数,它使用 `yield` 来逐个返回从0到n-1的整数。当调用这个函数时,它不会立即执行循环中的所有迭代,而是返回一个生成器对象 `gen`。然后,你可以通过遍历这个生成器对象来逐个获取值。
### 生成器的高级用法
生成器不仅限于简单的迭代。它们还可以包含复杂的逻辑,并在每次迭代时根据需要生成值。此外,`yield` 语句还可以用于在生成器内部接收外部传入的值(通过 `send()` 方法),但这通常用于更高级的用例,如协程。
### 示例:使用 `yield` 和 `send()`
```python
def simple_coroutine():
print('Coroutine started')
x = yield
print('Received:', x)
# 创建一个生成器
my_coro = simple_coroutine()
# 启动协程
next(my_coro) # 调用 next() 来执行到第一个 yield 语句
# 发送值给协程
my_coro.send(10)
```
输出:
```
Coroutine started
Received: 10
```
注意,在首次迭代生成器之前(即在首次调用 `send()` 之前),你通常需要调用 `next(my_coro)` 来启动生成器。`send()` 方法可以发送值给生成器,而 `yield` 表达式会接收这个值。然而,`send(None)` 等同于 `next(my_coro)`。
这就是如何在Python中使用 `yield` 关键字来创建和使用生成器的基本介绍。生成器是Python中一个非常强大且有用的特性,特别是在处理大量数据或需要延迟计算时。