写一个for循环作为列表理解,返回意外值?

时间:2015-07-20 11:20:47

标签: python for-loop list-comprehension

如果我提供此功能:

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

这些数字:

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

我得到[0,2,4]。 0来自哪里?

4 个答案:

答案 0 :(得分:4)

您循环 range()来电。这会产生0到您传入的len(numbers)值之间的整数:

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

由于此范围从0开始,而0被认为是偶数,因此您可以将结果包含在内。您的numbers列表长度为5,因此range()计数从0到4(结束值永远不会包含在结果范围内)。

如果您想循环遍历numbers,请不要使用range()

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

Python for循环是Foreach loop constructs;它们可以直接在列表上循环,不需要生成索引。

答案 1 :(得分: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]

答案 2 :(得分:1)

range()默认生成从0到n的数字,其中n是传递的参数值。您通过len([5, 4, 3, 2, 1])评估为5

答案 3 :(得分: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]))