Python函数之yield关键字的使用详解
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语句,使得代码更加简洁。
