警告:極端な初心者の質問Pythonの関数は、返った後にその値をどのように覚えていますか?
私はレシピとして機能を考えていたようです。私の世界では、プログラムはレシピボックスであり、いくつかのレシピ(機能)は他のレシピ(他の機能)を必要とします。プロセッサは、命令をRAMに書き込んで処理してマスタレシピの実行を開始します。朝食クレープのように。ジュリアチャイルズから朝食クレープレシピを呼んでいます。あなたはクレープバターを一度作ってやる必要があります。それからあなたはまだクリープバッターを持っている間、あなたは繰り返しクリープを作ります。同時に、あなたが作ることができる様々な果物の準備があります。
私は明らかに分かりません。私はpythontutor.comを通してProject Euler Problem 2(フィボナッチ数も400万未満の合計)にpython wikiソリューションを実行しました。そして私は何かが私に起こったと思う。レシピを作成するたびに、同じプロセッサを使用するだけではなく、その機能を操作するためにいくつかのポットを備えたグノームが得られます。ポットは変数で、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())))
からのコードだと、ここhttp://pythontutor.com/visualize.html
あなたの混乱は理解できます。プログラムは、 'yield'キーワードを除いて、あなたが思うように(並べ替えて)動作します。あなたが説明するように、「収穫」はシンクの下にグノームを格納します。あなたが学んでいる間に、あなたは '収率'を避けることを選ぶかもしれません、またはあなたはそれを特に読むことを選択するかもしれません。 –
ここに*ジェネレータ*があります。ジェネレータは 'yield'キーワードを見つけるたびに氷の上に置かれ、何かをループしているところに制御を戻します。 –
http://www.jeffknupp.com/blog/2013/02/14/drastically-improve-your-python-understanding-pythons-execution-model/ – Torxed