2013-11-22 1 views
8

私はpython gurusの初心者の質問があります。Python - メイン関数の外に出るように、サブ関数内のyieldのグループを整理する方法はありますか?

私はそうのような繰り返し歩留まり-アクションの多くを保持する機能Aを持っている:

yield a 
yield b 
yield c 

ようなので、それが見えます:

def funA(): 
    … 
    yield a 
    yield b 
    yield c 
    … 
    yield a 
    yield b 
    yield c 
    … 
    yield a 
    yield b 
    yield c 

が関数内のすべての繰り返し収量を入れてどのような方法がありますそしてそのような何か?:

def funA(): 
    … 
    yield funB() 
    … 
    yield funB() 
    … 
    yield funB() 

アップデートを行う

yield a 
yield b 
yield c 

これは単なる例ですが、実際のアプリケーションでは、主要ジェネレーターで1回以上繰り返す収量の複雑なシーケンスです(したがって、歩留まりの整理については問題にならない)が、サブジェネレーターについてです。だから私はコードの重複を避けたい。

+0

なぜこれを行うのですか?それはかなり恐ろしいように聞こえる。あなたは本当に1つの関数で1つ以上の歩留まりを持つべきではありません。さもなければ、あなたはその点を打ちのめすのです。 – Falmarri

+1

私はitertoolsがここに行く方法だと思っています。 – munk

+1

これを行うことは可能ですが、本当に必要なのはループ内の 'yield 'です。 – user2357112

答えて

13

最新の最大のpython(> = 3.3)を使用している場合は、yield fromという構造があります。

yield from funB() 

それは正確に何をしたいん:あなたは、サブ発電機としての機能を呼び出すと、それはあなたに与えるすべてをバック与えることができます。

あなたがpythonの以前のバージョンを使用している場合は、私はあなたがそれを手動で行う必要があるでしょう怖い:

for x in funB(): yield x 

することができます。このようなグループにそれらを、スペースを節約するために:

groups = [funA, funB, funC] 
for group in groups: 
    for item in group(): 
     yield item 
+0

はい!ありがとう!それは私が必要とするものであり、悲しいことに私は2.7バージョンを使用しています。 –

+0

こういう結論を下すことは可能ですか?私たちがpythonを持っているならば<3.3。サブジェネレータを使わず、歩留まりを繰り返すほうが良いでしょうか?それで、以前のように機能が残った –

+0

逆に、私はあなたの考えが良かったと思います。無限の「収率」の流れは、目には難しい。グループ化の可能性について上記の私の編集を参照 – slezica

2

itertools.chainあなたは

import itertools 

def funA(): 
    for x in range(10): 
     yield x 

def funB(): 
    for x in range(10,20): 
     yield x 

def funC(): 
    for x in range(20,30): 
     yield x 

def funs(): 
    for x in itertools.chain(funA(), funB(), funC()): 
     yield x 

print [x for x in funs()] 

出力を探している機能である:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29] 
関連する問題