2013-12-16 73 views
3

比方說,我寫一個for循環,將輸出所有的數字1到x:的「返回」功能只返回一個值

x=4 
for number in xrange(1,x+1): 
    print number, 
#Output: 
1 
2 
3 
4 

現在,把同樣的for循環到一個函數:

def counter(x): 
    for number in xrange(1,x+1): 
     return number 
print counter(4) 
#Output: 
1 

爲什麼我只有在將for循環放入函數時才獲得一個值?

我一直在迴避這個問題,將for循環的所有結果附加到列表中,然後返回列表。

爲什麼for循環添加所有的結果,而不僅僅是一個?:

def counter(x): 
    output=[] 
    for number in xrange(1,x+1): 
     output.append(number) 
    return output 

什麼是返回所有的值,附加到列表的最好方法似乎非常低效。

+2

'return'返回從功能。你可能對'yield'感興趣,但是這需要了解「return」的功能。 – squiguy

回答

8

return Python的equivilent不完全一樣的關鍵詞的名字所暗示的。當你點擊該語句時,它返回並且該函數的其餘部分不會被執行。

您可能想要的是yield關鍵字。這將創建一個生成器函數(一個返回生成器的函數)。生成器是可迭代的。每當執行yield表達式時,它們「產生」一個元素。

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

generator = func() 
for item in generator: 
    print item 
5

你想被稱爲發電機什麼:

def counter(x): 
    for number in xrange(1,x+1): 
     yield number 

你會再使用這樣的:

c = counter(5) 
next(c) # 1 
next(c) # 2 

你也可以通過做消耗整個發電機

xs = list(c) # xs = [1, 2, 3, 4, 5] 

請參閱:http://docs.python.org/2/tutorial/classes.html#generators瞭解更多信息。

return語句在Python中返回形式函數並且不保存任何狀態。每次調用函數時都會創建一個新的堆棧框架。 ,另一方面產量是(或多或少)的continutations

2

一旦return在一個函數中,函數結束,剩下的代碼將不再執行。 你的第二個解決方案是好的,如果你想更好的解決方案,你可以使用發電機:

def counter(x): 
    for number in xrange(1,x+1): 
     yield number 

然後你就可以使用它像這樣:

>>> for i in counter(5): 
...  print i 
... 
1 
2 
3 
4 
5