Python中yield关键字
本文不大谈专业术语,仅用浅显的语言为诸君做一个介绍。此外如果有硬件开发经验,应该会对yield
关键字的作用很熟悉。因为该关键字的作用类似于单片机中的中断。
1. yield是什么
作为软件开发者,应该都清楚return
的用法:终止一个函数的运行,并返回一个值。yield
的作用与之类似:中止一个函数,并返回一个值。注意,这里是中止,这就是它们之间的区别所在。因为我们可以通过调用next
方法从中止处,也就是yield
所在的语句继续执行函数。是不是和单片机中断很像。
此外带yield
的函数可作为一个生成器使用,生成一个可迭代对象,可以使用迭代器进行迭代。
2. yield为什么存在
你在吃饭,这时突然来了一个电话,是你的老板打来的,你肯定要先接电话,接完电话才继续吃饭。因为接老板的电话比吃饭优先级更高,你需要及时响应,这就构成了一次中断。
graph TB
subgraph 函数
a[吃饭] -->|无事发生| b[吃饭]
end
subgraph 中断源
a -->|电话响了| c[接电话] -->|接完电话| b
end
在编程中,上面的情况就叫协程。在函数执行过程中,碰到了需要等待或者更高优先级的事务,中断当前执行并完成响应或执行其他操作,然后继续执行函数。
另外譬如有一个函数,功能是不断地进行计算,并返回结果。我们可以用一个列表将结果打包并返回,但是当计算次数极多时,则列表元素也很多,此时会消耗大量内存。
此时我们就可以用yield
关键字返回每一次的计算结果。使用迭代器进行迭代,此时消耗内存就少很多,调用也更灵活。
3. 为什么要了解yield
在Python 3.5版本之后,asyncio
的异步协程技术有了async
和await
的新语法,作为语法糖让代码变得更加美观。yield
虽然用得少了,不过“知道但不用”和“不知道”是两回事,我们依然需要了解它。