2016-05-01 19 views
1

私はジェネレータが初めてです。その後ジェネレータは期待どおりに動作しません

def make_all_pairs(list_): 
    pivot = list_.pop(0) 
    for el in list_: 
     pair = (pivot, el) 
     print pair 
    if len(list_) > 1: 
     make_all_pairs(list_)  

make_all_pairs(["a","b","c","d","e"]) 

('a', 'b') 
('a', 'c') 
('a', 'd') 
('a', 'e') 
('b', 'c') 
('b', 'd') 
('b', 'e') 
('c', 'd') 
('c', 'e') 
('d', 'e') 

:なぜ私は収量(パイソン2.7)

まず印刷で正しい機能を印刷を文が動作しない印刷で最初に正しい機能置き換えるないときすべての組み合わせを与えないジェネレータ

def make_all_pairs(list_): 
    pivot = list_.pop(0) 
    for el in list_: 
     pair = (pivot, el) 
     yield pair 
    if len(list_) > 1: 
     make_all_pairs(list_) 

x = make_all_pairs(["a","b","c","d","e"]) 
for el in x: 
    print el 

('a', 'b') 
('a', 'c') 
('a', 'd') 
('a', 'e') 
+0

ありがとう! – TomKivy

答えて

3

再帰を使用する場合、結果を再生成する必要があります。

def make_all_pairs(list_): 
    pivot = list_.pop(0) 
    for el in list_: 
     pair = (pivot, el) 
     yield pair 
    if len(list_) > 1: 
     for pair in make_all_pairs(list_): 
      yield pair 

これは、あなたがyield from反復可能オブジェクトをすることができますではなく、ループを有するPythonの3.Xに容易になります。

3

変更あなたのジェネレータ関数の最後の2行

if len(list_) > 1: 
    make_all_pairs(list_) 

あなたの印刷機能を返すか、何も得られませんが、あなたは、単に再帰的に呼び出すことができます

if len(list_) > 1: 
    for pair in make_all_pairs(list_): 
     yield pair 

へ。しかし、返り値または返り値を返す再帰関数の場合、それらの値は再帰から戻って返されなければならないので、返されるか、ここでは返されます。

1

のpython 2.7での答えは素晴らしいではありません:のpython 3.3およびそれ以上で

def make_all_pairs(list_): 
    pivot = list_.pop(0) 
    for el in list_: 
     pair = (pivot, el) 
     yield pair 
    if len(list_) > 1: 
     for pair in make_all_pairs(list_): 
      yield pair 


x = make_all_pairs(["a","b","c","d","e"]) 
for el in x: 
    print el 

通話のどんなネスティングからprintプリントがあなたがでているときに代わりに

5

から歩留まりを使用することができ、発電機が得最初のレベルからのみです。あなたは、「コールジェネレータは」得する複数の値を取得する必要がある場合は、次のように内側の発電機から値を消費し、それらを得るために持っている:

def make_all_pairs(list_): 
    pivot = list_.pop(0) 
    for el in list_: 
     pair = (pivot, el) 
     yield pair 
    if len(list_) > 1: 
     for itm in make_all_pairs(list_): 
      yield pair 

x = make_all_pairs(["a","b","c","d","e"]) 
for el in x: 
    print el 

警告:コードは、今以上の値が得られますが、I保証はありません、結果は正しいです。コード は、内部ジェネレータによって生成された値を処理する方法のみを示します。

注:Pythonの3では、あなたが使用することの代替構文答えをyield from

def make_all_pairs(list_): 
    pivot = list_.pop(0) 
    for el in list_: 
     pair = (pivot, el) 
     yield pair 
    if len(list_) > 1: 
     yield from make_all_pairs(list_) 
+0

ジェネレータで再帰を使用するのは悪い考えですか? – TomKivy

+2

@TomKivyいいえ、入れ子にされたジェネレータは問題ありません。正しく処理する必要があります。 –

関連する問題