yield是Python中的关键字,用于生成器函数中,在迭代过程中返回值,同时还保持了函数的状态,即函数可以从上次离开的地方继续执行。yield关键字的出现,可以使得程序写出更加高效、优美、易读的代码。
在Python中,yield有三种用法:
1. 生成器函数的定义
在函数中使用yield关键字,将函数转换为生成器函数。生成器函数每次调用返回一个生成器(也就是迭代器),通过调用生成器的__next__()方法,可以获取生成器的下一个值。生成器函数可以用来生成序列,不必将所有的值存储在内存中,非常适合处理大数据量的情况。
示例代码如下:
```python
def generate_sequence(start, end):
current = start
while current <= end:
yield current
current += 1
seq = generate_sequence(1, 5) # 调用生成器函数生成一个迭代器
print(next(seq)) # 输出 1
print(next(seq)) # 输出 2
print(next(seq)) # 输出 3
print(next(seq)) # 输出 4
print(next(seq)) # 输出 5
```
上面的代码中,generate_sequence()是一个生成器函数,通过yield关键字实现了每次生成一个数。调用该函数会返回一个生成器对象,而不是一般的函数返回值。使用next()函数逐步获取生成器的值。
2. yield的生成器表达式
除了定义生成器函数之外,还可以使用生成器表达式,直接生成一个生成器(迭代器)。
示例代码如下:
```python
gen = (i*i for i in range(10) if i%2 == 0)
print(next(gen)) # 输出 0
print(next(gen)) # 输出 4
print(next(gen)) # 输出 16
print(next(gen)) # 输出 36
print(next(gen)) # 输出 64
```
上面的代码中,使用生成器表达式创建生成器,并通过next()函数逐个获取生成器的值。
3. 双向通信
生成器函数中,使用yield语句实现了一种类似于协程的机制,可以在生成器函数和外部代码之间进行双向通信。
示例代码如下:
```python
def coroutine():
while True:
x = yield
print("Received: ", x)
cr = coroutine()
next(cr) # 预先调用一次next()方法,启动生成器
cr.send(1) # 通过send方法将1发送给生成器
cr.send(2) # 通过send方法将2发送给生成器
```
上面的代码中,coroutine()是一个生成器函数,使用yield实现了双向通信。当执行到yield语句时,函数挂起,等待接收外部代码通过send()方法传递的值。在外部代码中,使用next()方法启动生成器,并通过send()方法将值传递给生成器。
总结:
yield是Python中比较重要的关键字之一,其可以通过生成器函数、生成器表达式等方式生成迭代器。生成器的优势在于可以一边生成值一边遍历,不需要将所有的值先生成后再输出,能够节省内存空间。同时,yield还可以实现双向通信,使得代码的可读性和可维护性都得到了提高。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复