Python中的函数在返回后如何记住它的值?

2024-10-03 23:18:17 发布

您现在位置:Python中文网/ 问答频道 /正文

警告:极端新手问题

我好像一直在想函数是一个配方。在我的世界里,程序是一个配方框,一些配方(函数)调用其他配方(其他函数)。处理器通过将指令写入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())))

这是http://pythontutor.com/visualize.html


Tags: 函数comnumberdef配方处理器seqyield
3条回答

简单的回答。在

如果您有一个生成一系列值的函数,您可以使用yield在generator中对其进行转换。在

def func():
    for i in range(3):
        yield i

list(func()) ==> [0,1,2]

for el in func():
    print(el) # 0
              # 1
              # 2

每次称产量时,函数在某个地方冻结。当它再次被调用时,它将从上一个状态继续,并且不会重新开始(除非它已经完成了对元素的消费)。在

如果你调用这个函数,你会得到一个generator,这是一个你可以迭代的东西。在

注意,通过这种方式,您可以迭代无限序列,而不需要使用无限内存。在

^{pr2}$

这是因为那些函数不是函数,而是generatorsyield语句返回一个值,但不从函数返回。每次在生成器上调用next时,它将从上次调用继续执行生成器,直到它再次到达yield语句。在

原则上,你的第一个假设是正确的:函数的变量只有在函数执行时才可用。但是,在您的例子中,您使用的是yield语句。因此,函数调用返回一个迭代器,当调用该迭代器时,返回下一个yield语句的值。在

有关迭代器是什么和做什么的进一步解释,请查看this post。在

相关问题 更多 >