2015-07-20 72 views
-2

如果我養活這個功能:寫一個for循環作爲列表理解,返回意外的值?

​​

這些數字:

even([5, 4, 3, 2, 1]) 

我得到[0,2,4]。 0從哪裏來?

+1

試試這個 - 「[我爲我在數字,如果我%2 == 0]'。你正在迭代索引範圍內的數字,而不是它自己的值。 – Kamehameha

+0

數字= [我爲我在數字,如果我%2 == 0] 打印(數字),這工作完全謝謝你 – ibrahim

+0

是的。這應該工作。要知道爲什麼,請查看很好解釋的答案:) – Kamehameha

回答

4

你循環一個range()請致電。這種介於0生成一個整數和len(numbers)價值,你在通過:

>>> numbers = [5, 4, 3, 2, 1] 
>>> [i for i in range(len(numbers))] 
[0, 1, 2, 3, 4] 

由於此範圍內開始在00被認爲甚至,你會得到包括在結果中。您的numbers列表的長度爲5,因此range()的計數從0到4(最終值從不包含在結果範圍內)。

如果你想遍歷numbers本身,不使用range()

[i for i in numbers if i % 2 == 0] 

的Python for環路Foreach loop constructs;他們可以直接在列表中循環,不需要生成索引。

1

函數range產生從0N(不包括N)的值。

所以調用

range(len (numbers)) 

會產生價值[0, 1, 2, 3, 4]

如果你的目的是過濾掉奇數號碼,你可以修改你的函數

def even(numbers): 
    return [i for i in numbers if i%2 == 0] 

>>> even([5,4,3,2,1]) 
[4, 2] 
1

range()產生數默認情況下從0到n,其中n是傳遞的參數值。您通過了len([5, 4, 3, 2, 1]),評估結果爲5

0

寫入範圍(len(數字))將循環遍歷從0開始的「列表大小」時間的循環,而不管列表內部是什麼。因此,將其更改爲以下內容:

def even(numbers): 
    numbers = [i for i in numbers if i % 2 == 0] 
    return numbers 
print(even([5,4,3,2,1]))