警告:极端新手问题
我好像一直在想函数是一个配方。在我的世界里,程序是一个配方框,一些配方(函数)调用其他配方(其他函数)。处理器通过将指令写入RAM并处理它们来开始执行主配方。比如,早餐薄饼。你叫朱莉娅·查尔兹的早餐薄饼食谱。你得做一次绉面糊。然后,当你仍然有绉面糊,你迭代地做薄饼。同时,你可以做各种各样的水果制品。在
我显然不明白。我刚刚运行了pythonwiki解决方案来实现EulerProblem 2(小于400万的偶数斐波纳契数之和)的项目pythontutor.com网站. 我想我突然想到了什么。似乎每次你变出一个食谱,你不只是使用同一个处理器,你得到了一个侏儒与一些罐工作的功能。pots是变量,gnome会计算出他的配方,如果调用函数需要返回值,则gnome会向调用者显示这些pots的内容。然后调用者可以返回,找出更多的东西,并向调用者显示返回值。在
所以假设艾尔打电话给鲍勃做薄饼。鲍勃做面糊,叫查理来煮。查理做了一个薄饼,把它给了鲍勃,鲍勃把它给了艾尔,然后回到查理身边。谁还存在!艾尔不知道鲍勃把查理藏在厨房里了,但即使查理做了第一道绉纱,他还是在厨房里,知道怎么做绉纱,知道他还剩下多少绉面糊。尽管他已经归还了第一条绉纱。在
有人能帮我弄清楚吗?在
下面是pythonwiki中的代码
def fib():
x,y = 0,1
while True:
yield x
x,y = y, x+y
def even(seq):
for number in seq:
if not number % 2:
yield number
def under_a_million(seq):
for number in seq:
if number > 1000000:
break
yield number
print sum(even(under_a_million(fib())))
简单的回答。在
如果您有一个生成一系列值的函数,您可以使用yield在
generator
中对其进行转换。在每次称产量时,函数在某个地方冻结。当它再次被调用时,它将从上一个状态继续,并且不会重新开始(除非它已经完成了对元素的消费)。在
如果你调用这个函数,你会得到一个
generator
,这是一个你可以迭代的东西。在注意,通过这种方式,您可以迭代无限序列,而不需要使用无限内存。在
^{pr2}$这是因为那些函数不是函数,而是generators。
yield
语句返回一个值,但不从函数返回。每次在生成器上调用next
时,它将从上次调用继续执行生成器,直到它再次到达yield
语句。在原则上,你的第一个假设是正确的:函数的变量只有在函数执行时才可用。但是,在您的例子中,您使用的是
yield
语句。因此,函数调用返回一个迭代器,当调用该迭代器时,返回下一个yield
语句的值。在有关迭代器是什么和做什么的进一步解释,请查看this post。在
相关问题 更多 >
编程相关推荐