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

49 浏览
0 Comments

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

这个问题已经有了答案

Python 中的 \"yield\" 关键字是什么意思?

警告:极其新手的问题

我似乎一直把函数当作一道食谱。在我的世界里,程序就是一个食谱盒子,其中一些食谱(函数)需要调用其他食谱(其他函数)。处理器通过将指令写入 RAM 并按照指令逐步执行主配方来开始执行。例如,早餐薄煎饼。你从 Julia Childs 中调用早餐薄煎饼食谱。你需要先做一次薄煎饼面糊。然后,当你还有薄煎饼面糊时,你可以迭代制作薄煎饼。同时,还可以制作各种水果制品。

嗯,我显然不理解。我刚刚在 pythontutor.com 上运行了 python wiki 解决方案的 Project Euler Problem 2(小于 400 万的偶数斐波那契数之和),然后我想到了一些事情。似乎每次你召唤一个食谱,你不仅使用相同的处理器,而且你得到一个有一些锅的侏儒来处理那个函数。锅是变量,侏儒解决他的食谱,并且如果调用函数需要返回值,则侏儒将这些锅的内容显示给调用者。调用者可能会回去,找出更多的东西,并向他的调用者显示返回值。

假设 Al 叫 Bob 做薄煎饼。Bob 制作面糊并叫 Charlie 煮。Charlie 煮了一张薄煎饼,把它送给 Bob,Bob 把它交给 Al,然后回到 Charlie。Charlie 仍然存在!Al 不知道 Bob 把 Charlie 放在了厨房里,但即使 Charlie 已经做了第一张薄煎饼,他仍然在厨房里,知道如何制作薄煎饼,也知道还剩多少薄煎饼面糊。即使他已经返回了第一张薄煎饼。

有人能帮我弄清楚这个吗?

这是来自 Python wiki 的代码:

 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

admin 更改状态以发布 2023年5月24日
0
0 Comments

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

0
0 Comments

一个简单的答案。

如果你有一个生成值序列的函数,你可以使用 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

每次调用 yield 时,函数会在某个地方被冻结。当它再次被调用时,它将从上次的状态继续,而不是重新开始(除非它已经消耗完所有元素)。

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

请注意,这种方法可以迭代无限序列,而无需使用无限的内存。

def inf():
    x = -1
    while True:
        x = x + 1
        yield x
for i in inf():
    if i < 10:
        print(i)
    else:
        break

0