[译]关于Python Generators的常见误解

栏目: Python · 发布时间: 6年前

内容简介:作者:python-generators/几天前,我收到了下面的信:

作者: Jeff Knupp

python-generators/

几天前,我收到了下面的信:

Jeff

看起来你知道迭代器。也许你可以解释某个奇怪的行为。如果你运行下面的代码,你会发现该函数处理得不一样,因为它在某处有一个 yield ,即使它完全不可到达。

def func ():

print ( "> Why doesn't this line print?" )

exit () # Within this function, nothing should matter after this point.  The program should exit

yield "> The exit line above will exit ONLY if you comment out this line."

x = func()

print (x)

在我运行这个代码时,我从 print() 调用得到以下输出:

因此,这里发生了什么?为什么不打印 func() 里的那一行?即使 yield 是完全不可到达的,它看起来影响了这个函数执行的方式。

Yield如何影响函数

为了解释为什么会发生这种行为,让我们回顾一下 yield 。任何包含 yield 关键字的函数自动被转换为一个 generator 。它返回的是一个 generator 迭代器。我们的打印输出实际上暗示了这一点:

$ python yield.py

在执行 x = func() 时,我们实际上没有执行 func() 里的任何代码。相反,因为 func() 是一个 generator ,返回了一个 generator 迭代器。因此,虽然这可能看起来像一个函数调用,它实际上给予我们用来生成该 generator 产生值的 generator 迭代器。

因此,我们实际上应该如何“调用”一个 generator 呢?通过在一个 generator 迭代器上调用 next() 。在上面的代码中,将对由 func() 返回的 generator 迭代器执行 next 调用,并绑定到 x

如果我们希望看到那个神秘的消息被打印出来,只要把最后一行代码改为 print(next(x))

当然,一遍一遍地调用 next() 意味着作为一个迭代器处理是有点麻烦。幸运地, for 循环支持在 generator 迭代器上的迭代。设想如下的一个玩具 generator 实现:

def one_to_ten ():

"""Return the integers between one and ten, inclusive."""

value = 1

while value <= 10 :

yield value

value += 1

我们可以下面的方式在一个 for 循环里调用它:

for element in one_to_ten():

print (element)

当然,我们可以更啰嗦地写为:

iterator = one_to_ten()

for element in iterator:

print (element)

这类似于原始代码所做的。它只是从不使用 x 来实际执行这个 generator 里的代码。

总结

我希望这能澄清关于 Python yield generators 的某些常见问题。这个话题更深入的教程,参考 Improve Your Python: 'yield' and Generators Explained


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

维多利亚时代的互联网

维多利亚时代的互联网

[英] 汤姆·斯丹迪奇 / 多绥婷 / 后浪丨江西人民出版社 / 2017-8 / 38.00元

人类历史上的第一次大连接 回顾互联网的前世 预言互联网的未来 ……………… ※编辑推荐※ ☆《财富》杂志推荐的75本商务人士必读书之一 ☆ 回顾互联网的前世,颠覆你的思维,升级你对互联网的认知 ☆ 人类历史上一次全球大连接是维多利亚时期的电报时代,那时候也有疯狂的资本、 巨大的泡沫、网络新型犯罪、网络亚文化崛起……现在的互联网时代就是电报时代的重演;回顾那......一起来看看 《维多利亚时代的互联网》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具