2017-09-14 70 views
0

下面的代碼遍歷1到5之間的數字,調用forEachInRangeThisNumberLoopThreeTimes函數將其傳遞給一個數字。該函數接受一個數字並將其循環三次,將每次迭代附加到最後返回的numbers列表中。如何使用yield而不是return

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] 

相反追加後的數字result變量我想用yield

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,則必須將您的功能像iterable一樣處理。

0

在函數內部使用yield時,它變成了一個生成器,這就是爲什麼你得到這些輸出。

我將用一個更簡單的例子來解釋如何正確使用生成器。 比方說,我們有以下發電機:

def example_generator(): 
    yield 1 
    yield 2 
    yield 3 

現在,當我叫x = example_generator()x將舉行發電機不是值1

如果我想要得到的值1,我必須

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

現在first_val的值爲1,再打電話給next(),您將獲得價值2。當發電機用完後,你會得到一個StopIteration例外

爲了避免StopIteration你可以只

for value in example_generator(): 
    print(value) 

在這種情況下,你會得到

1 
2 
3 

和for循環會爲你處理StopIteration

如果您正在尋找得到它作爲一個list你基本上失去使用發電機的優點,但它可以通過

list(example_generator()) 

我希望這是一個足夠清晰的解釋,所以你能理解做爲自己如何在python中使用生成器。快樂生成!

相關問題