欢迎访问宙启技术站
智能推送

Python函数之yield关键字的使用详解

发布时间:2023-06-03 01:29:57

Python中yield关键字是一个很常见的关键字,它在函数中的使用非常灵活而且功能强大。yield的主要作用是生成器的使用。

1. 什么是生成器

生成器是Python中特有的一种迭代器,它是使用yield关键字实现的。使用生成器可以有效地节省内存,因为它不需要一次性生成所有元素,而是按需生成,避免了一次性占用大量内存。生成器也十分方便,可以通过for循环来遍历,也可以使用next()函数来逐个取值。

2. yield的作用

yield关键字的作用是将函数变成生成器,它能够通过yield语句暂停并保存函数的现场,等待下次调用时再恢复执行。这样就可以有效地实现迭代器的功能,因为每次调用生成器函数时,都会从上一次yield语句处继续执行。

3. yield用法示例

下面通过一个简单的例子来说明yield的用法。

def my_generator():
    print('starting')
    yield 1
    print('continue')
    yield 2
    print('stop')

gen = my_generator()

print(next(gen))
print(next(gen))
print(next(gen))

输出结果为:

starting
1
continue
2
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print(next(gen))
StopIteration

可以看到,当第三次调用next()函数时会抛出StopIteration异常,说明生成器已经遍历完了所有元素。

4. 生成器中使用send方法进行双向通信

除了使用next()函数来迭代生成器外,还可以使用send()方法实现双向通信。send()方法的作用是将一个值发送给生成器,并让生成器继续执行。使用send()方法时,生成器在遇到yield语句时,会将yield的值替换成send()方法中的参数。

例如:

def my_generator():
    print('starting')
    x = yield
    print('received', x)

gen = my_generator()

next(gen)
gen.send(1)

输出结果为:

starting
received 1

可以看到,当使用send()方法时,生成器会从上一次yield语句处继续执行,并将yield的值替换成send()方法中的参数。

5. yield from语句

Python3.3引入了yield from语句,它可以提高代码的可读性和可维护性。yield from可以将嵌套的生成器简化为单独的yield语句,使得代码更加简洁。

例如:

def sub_generator():
    yield 'sub generator'

def my_generator():
    yield 'starting'
    yield from sub_generator()
    yield 'ending'

for i in my_generator():
    print(i)

输出结果为:

starting
sub generator
ending

可以看到,yield from语句可以直接调用嵌套的生成器,使得代码更加简洁易读。

6. 小结

yield关键字的主要作用是生成器的使用,它可以将函数变成生成器,每次调用生成器函数时,都会从上一次yield语句处继续执行。使用生成器可以有效地节省内存,因为它不需要一次性生成所有元素,而是按需生成。除了使用next()函数来迭代生成器外,还可以使用send()方法实现双向通信。yield from语句可以将嵌套的生成器简化为单独的yield语句,使得代码更加简洁。