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的异步协程技术有了asyncawait的新语法,作为语法糖让代码变得更加美观。yield虽然用得少了,不过“知道但不用”和“不知道”是两回事,我们依然需要了解它。

引用