要理解的快捷键yield
当您看到一个函数yield
语句,应用这个简单易懂的把戏来理解会发生什么:
- 插入一行
result = []
3⁄4 ̄ ̧漯B
- 替换各
yield expr
与result.append(expr)
.
- 插入一行
return result
函数的底部。
- - 耶 - 不再
yield
语句! 读取并找出代码 。
- 将函数与原始定义比较。
这个把戏也许能让你了解 函数背后的逻辑, 但实际发生什么了?yield
与以列表为基础的方法发生的情况大不相同。 在许多情况下, 收益率方法会提高记忆效率和速度。 在其他情况下, 这个把戏会使你陷入无穷无尽的循环中, 即使最初的函数效果很好。 阅读更多来学习...
不要弄乱你的循环器 循环器和发电机
首先,动态自动交换协议- 当你写作时
for x in mylist:
...loop body...
Python 执行以下两个步骤:
获得一个循环器用于mylist
:
调调iter(mylist)
->此返回一个带有next()
方法(或)__next__()
Python 3 中。
[这是大多数人忘记告诉你的一步]
使用迭代器绕过项目 :
继续叫next()
从第1步返回的迭代器上的迭代器 方法上的迭代器 。next()
指定用于x
并执行环环体。如果有例外StopIteration
从内部筹集next()
,这意味着循环器中没有更多的值,循环就退出了。
真相是 Python 随时随地执行上述两步环绕环绕对象的内容 - 所以它可能是循环的, 但它也可以是代码otherlist.extend(mylist)
(此处(此处)otherlist
是 Python 列表)。
给mylist
是易 易 易 性因为它执行了循环协议。在用户定义的类中,您可以执行__iter__()
使类的示例可易易易操作的方法。 此方法应该返回振动器对象。next()
两种方法都可实施。__iter__()
和next()
在同一类同级同级同级同级同级同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同班同同同班同班同班同班同班同同班同班同班同班同班同班同同同班同班同班同班同班同同班同同同同同班同班同班同班同同班同班同班同班同同同同同同同班同班同班同同同同同同同班同同同同同同班同__iter__()
返回返回self
。这将对简单案例有效,但当您想要两个迭代器同时绕过同一个对象时,则不会有效。
这就是传动程序,许多物体执行这个程序:
- 内置列表、词典、图普尔、设置和文件。
- 执行的用户定义的分类
__iter__()
.
- 发电机。
注 afor
循环不知道它处理的是什么样的物体 - 它只是遵循循环程序, 并且很乐意按项目逐项获得它调用的项目next()
. 内置清单逐项归还其物项,词典则逐项归还键键一个一个一个一个,文件返回线条一个一个一个一个一个,等等。 和发电机返回。 。 。yield
输入 :
def f123():
yield 1
yield 2
yield 3
for item in f123():
print item
取代yield
如果您有三种语句return
以 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国 国f123()
只有第一个被执行, 而功能会退出。 但是,f123()
没有普通函数为普通函数的普通函数为普通函数。f123()
被召唤的,被召唤的,被召唤的,被召唤的,无返回输出语句中的任何值。它返回生成对象。它返回一个生成对象。此外,函数并不真正退出 -它进入中止状态。当for
循环试图环绕到发电机对象上, 函数从中止状态恢复 。yield
执行下一行代码,在此情况下,ayield
语句,然后返回该语句,作为下一个项目返回该语句。这种情况发生到函数退出时,然后生成器产生StopIteration
,并循环出口。
因此,发电机对象有点像一个适配器—— 一方面,它展示了迭代程序,通过曝光__iter__()
和next()
保存for
循环快乐。 但是,在另一端, 它运行的函数足够从中获取下一个值, 并将其重新置于暂停模式 。
为什么使用发电机?
通常情况下, 您可以写入不使用发电机的代码, 但使用相同的逻辑逻辑。 一个选项是使用我之前提到的临时列表“ trick ” 。 这不会在所有情况下都有效, 例如, 如果您有无限循环, 或者当您有很长的列表时它可能无效地使用内存 。 另一种方法是执行一个新的可循环的类“ 某些东西 ” , 将国家保留在成员中, 并在成员中执行下一个逻辑步骤 。next()
(或)__next__()
Python 3 方法中的代码 。 取决于逻辑, 内部的代码 。next()
方法最终可能会看起来非常复杂,容易出现虫子。 这里的发电机提供了清洁和容易的解决方案。