2013-10-19 44 views
3

我有2個不同的碼:For循環清晰度

def bar(a): 
    return [ x**3 for x in a ] 

而且

def cube(a): 
    for x in a: 
     return x**3 

如果我定義巴(a)爲([1,2,3,4]),我的輸出將是[1,8,27,64]。 如果我將cube(a)定義爲([1,2,3,4]),那麼我的輸出結果就是1. 這是爲什麼?他們是不是應該給出相同的結果?對於x中的每個x,「a中的x」是否表示進行以下迭代?

+1

如果你想把第二個return語句改成yield語句,你的思維方式實際上是一個生成器。 – roippi

回答

3

這是因爲您在第二種情況下從for循環的第一次迭代中return

在第一種情況下,你使用列表理解

def bar(a): 
    return [ x**3 for x in a ] 

,你建立多維數據集的列表,並返回,而在第二種情況下

def cube(a): 
    for x in a: 
     return x**3 

開始遍歷列表,但是在第一次迭代本身中從函數返回。

使用for x in a的等效方法是

def cube(a): 
    final = [] 
    for x in a: 
     final.append(x**3) 
    return final 
+0

謝謝,我明白了。感謝您的澄清。 –

5

一個循環中返回不創建一個列表,它只是返回一個值,中止循環。你的第一個例子工作正常,因爲它是一個列表理解 - 它創建一個列表並返回它。

+0

所以通過插入一個列表作爲我的變量(a)不會自動返回我的輸出列表。 –

+0

@MichelTamer:嗯,'a'可能是一個列表(或其他可迭代的),但'x'將是一個單一的值。您立方體,然後返回該值。 –

2

適當的第二個版本居然是:

def cube(a): 
    li = [] 
    for x in a: 
     li.append(x**3) 
    return li 

,而不是你擁有什麼。您應該返回項目列表,您的版本將簡單地返回循環中的第一個輸出項目。

更壓縮形式:

cube = lambda a: [x**3 for x in a] 

事實上,你可以只使用列表comprehesions /發電機語法直接,如果你不使用超過一次於此。