将 for 循环编写为列表理解,返回意外值?

Writing a for loop as a list comprehension, returning unexpected values?

如果我提供这个功能:

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从哪里来?

您循环 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;他们可以直接在列表上循环,不需要生成索引。

函数 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]

range() 默认生成从 0 到 n 的数字,其中 n 是传递的参数值。您传递了 len([5, 4, 3, 2, 1]),其计算结果为 5

Writing range(len(numbers)) 将从 0 开始迭代循环 "the size of the list" 次,而不管列表中的内容是什么。因此将其更改为以下内容:

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