発電

2016-06-27 4 views
0
私は発電機がどのように動作するかの一般的な理解を持っている

発電

def enum(seq): 
    n = 0 
    for i in seq: 
     yield n, i 
     n += 1 
def fibonacci(): 
    i = j = 1 
    while True: 
     r, i, j = i, j, i + j 
     yield r 

コードのこのブロックで何が起こっているかを理解しようとしている

が、私はちょうどラインについて混同してるの理解のフィボナッチ数:

r, i, j = i, j, i +j 

何が起こっているのですか?ありがとう。

+0

可能なDupe? http://stackoverflow.com/questions/14836228/is-there-a-standardized-method-to-swap-two-variables-in-python – mgilson

+0

標準的なタプルの割り当てとアンパック、Python3の方がはるかに強力になっています:https ://www.python.org/dev/peps/pep-3132/ – AChampion

答えて

0

「タプル割り当て」と呼ばれます。あなたが値を交換したい場合は

a, b, c = 1, 2, 3 

(a, b, c) = (1, 2, 3) 

、あるいはこのような:

多くの場合、あなたはこれのように書き換えることができ

a = 1 
b = 2 
c = 3 

のような複数の割り当てが発生します。

a, b = b, a 

はい、これも機能します。

あなたのケースでは、いくつかの交換といくつかの追加が同時に行われています*。 rは返される値、iは次のステップで返される値、j - は後で返されます。 jの後に返されるものは何ですか? i + jなど。

0

これは標準的な「アンパックアサイン」です。右側の3つの値が計算され、その値が場所にバインドされます(この場合はすべて単純名ですが、理論的にはコンテナ要素) 左側の。この特定のケースでは、一般的な場合には、それはあなたがそうでない場合は、一時的な変数を使用せずに、安全に行うことができませんでした、単一のステートメントで物事を行うことが可能だということ、しかし、

r = i 
i = j 
j = i+j 

ノートに広く同等です。古典「為替二つの変数は、」

tmp = i 
i = j 
j = tmp 

のように、一時的に必要ですが、Pythonであなただけの

i, j = j, i 

を使用することができ、すべてがちょうど(TM)動作します。

0

ライン

r, i, j = i, j, i+j 

はシーケンス開梱文です。

Let i = j = 1

  1. まず、右側i, j, i+jが評価され、タプル(1, 1, 2)にパックされます。
  2. そしてタプル名riにアンパック、およびjようr = 1i = 1、及びj = 2れます。

これは、python docsのセクション5.3の最後で簡単に説明します。