【发布时间】:2013-04-02 12:58:04
【问题描述】:
警告:极端的新手问题
我似乎一直将函数视为一种配方。在我的世界里,程序是一个食谱盒,一些食谱(功能)调用其他食谱(其他功能)。处理器通过将指令写入 RAM 并处理它们来开始执行主配方。比如早餐薄饼。你叫 Julia Childs 的早餐薄饼食谱。你必须做一次可丽饼面糊。然后,当你还有可丽饼面糊时,你会反复制作可丽饼。同时,您可以制作各种水果制品。
好吧,我显然不明白。我刚刚通过 pythontutor.com 将 python wiki 解决方案运行到 Project Euler Problem 2(斐波那契数的总和小于 400 万)。我认为我发生了一些事情。似乎每次你想出一个食谱时,你不只是使用相同的处理器,你会得到一个带有一些罐子的侏儒来处理那个功能。罐子是变量,gnome 计算出他的配方,如果调用函数期望返回值,则 gnome 将这些罐子的内容显示给调用者。然后调用者可能会返回,找出更多的东西,并向他的调用者显示返回值。
假设 Al 打电话给 Bob 做薄饼。鲍勃做了面糊并叫查理做饭。查理做了一个可丽饼,把可丽饼端给鲍勃,鲍勃把它给了艾尔,然后又回到查理身边。谁还在!艾尔不知道鲍勃把查理藏在厨房里,但即使在查理做了第一个可丽饼之后,他仍然在厨房里,知道如何制作可丽饼,并且知道他还剩下多少可丽饼面糊。即使他已经归还了第一个可丽饼。
有人可以帮我解决这个问题吗?
这是来自 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())))
【问题讨论】:
-
您的困惑是可以理解的。除了
yield关键字之外,程序确实按照您认为应该的方式工作(有点)。yield,正如您所描述的,在水槽下存储了一个 gnome。在您学习的过程中,您可能会选择避免使用yield,或者您可能会选择专门阅读它。 -
这里有 generators。每次遇到
yield关键字时,生成器都会被置于冰上,将控制权交还给在它们上面循环的任何东西。 -
我必须非常诚实。你极端的烹饪类比让我完全困惑。
-
你开始与查理和他的可丽饼一起进入有状态的函数,这正在接近面向对象的领域,但在大多数情况下,你的类比是成立的。正如所指出的,yield 和生成器使类比复杂化,因为它们也以有状态的方式起作用。
标签: python