yield关键字详解与三种用法

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/

点赞(119) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部