2017-09-14 18 views
0

以下のコードは、1〜5の範囲の数値を反復して、forEachInRangeThisNumberLoopThreeTimes関数に数値を渡して呼び出します。この関数は数値を受け取り、各繰り返しを最後に返すnumbersリストに3回追加してループします。returnの代わりにyieldを使用する方法

印刷し
def forEachInRangeThisNumberLoopThreeTimes(number): 
    numbers = [] 
    for each in range(number): 
     for i in range(3): 
      numbers.append(i) 
    return numbers 


result = [] 
for number in range(1, 5): 
    print number, forEachInRangeThisNumberLoopThreeTimes(number) 

1 [0, 1, 2] 
2 [0, 1, 2, 0, 1, 2] 
3 [0, 1, 2, 0, 1, 2, 0, 1, 2] 
4 [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2] 

代わりに私がyieldを使用したいresult変数にそれぞれ番号を付加する:

def forEachInRangeThisNumberLoopThreeTimes(number): 
    for each in range(number): 
     for i in range(3): 
      yield i 

今、私が実行したとき:

for number in range(1, 5): 
    result = forEachInRangeThisNumberLoopThreeTimes(number) 

resultは、私が期待するものではありません。

1 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0> 
2 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0> 
3 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0> 
4 <generator object forEachInRangeThisNumberLoopThreeTimes at 0x104ebfaf0> 

どこにエラーがありますか?

答えて

4

yieldは、関数がジェネレータオブジェクトを返すように指定します。それはiterableインターフェースに準拠して、あなたはそれから厳格なリストが必要な場合は、明示的にリストを作成:

result = list(forEachInRangeThisNumberLoopThreeTimes(number)) 

あるいは

result = [x for x in forEachInRangeThisNumberLoopThreeTimes(number)] 
2

を、私は、これはあなたが探しているものだと思う:

def forEachInRangeThisNumberLoopThreeTimes(number): 
    for each in range(number): 
     for i in range(3): 
      yield i 

result = [] 
for num in forEachInRangeThisNumberLoopThreeTimes(5): 
    result.append(num) 

または

result = list(forEachInRangeThisNumberLoopThreeTimes(number)) 

yieldを使用する場合は、反復可能関数のように扱う必要があります。

0

関数内でyieldを使用すると、それがジェネレータになります。そのため、これらの出力を得ているのです。

より簡単な例を使用して、ジェネレータを正しく使用する方法を説明します。 のは、我々は次の発電機があるとしましょう:私はx = example_generator()を呼ぶよとき今

def example_generator(): 
    yield 1 
    yield 2 
    yield 3 

を、x発電ない値を保持します。1.

私は値1を取得したい場合は、I

x = example_generator() 
first_val = next(example_generator()) 

に今first_valが再びnext()を呼び出して、値1を持っているだろう、あなたは値2を取得します。発電機がなくなったとき、あなたはちょうど

for value in example_generator(): 
    print(value) 

この場合のあなたがループ意志のため

1 
2 
3 

と買ってあげることができStopIterationを避けるためにStopIteration例外

を取得しますStopIterationを処理してください。

あなたは基本的に発電機を使用することの利点を失っているlistとしてそれを取得するために探しているなら、それは私はあなたが理解できるように、これは明らかに十分な説明をした期待し

list(example_generator()) 

によって行うことができますPythonでジェネレータを使う方法幸せを生み出す!

関連する問題