Python 中的函数如何在返回后记住它的值?
Python 中的函数如何在返回后记住它的值?
这个问题已经有了答案:
警告:极其新手的问题
我似乎一直把函数当作一道食谱。在我的世界里,程序就是一个食谱盒子,其中一些食谱(函数)需要调用其他食谱(其他函数)。处理器通过将指令写入 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
一个简单的答案。
如果你有一个生成值序列的函数,你可以使用 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