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

Python 将for循环编写为列表理解,返回意外值?,python,for-loop,list-comprehension,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来自哪里?您在范围()上循环调用。这将生成介于0和传入的len(数字)值之间的整数: >>> numbers = [5, 4, 3, 2, 1] >>> [i for i in range(len

如果我输入此函数:

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

您在
范围()上循环调用。这将生成介于0和传入的
len(数字)
值之间的整数:

>>> 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(最终值从不包括在结果范围内)

如果要循环使用
数字
本身,请不要使用
range()


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

函数
范围
生成从
0
N
的值(不包括
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

写入范围(len(数字))将从0开始迭代循环“列表大小”次,无论列表中有什么内容。因此,将其更改为以下内容:

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

试试这个-
[i%2==0时,i代表i的数字]
。您正在迭代索引范围中的数字,而不是它本身的值。数字=[i for i in numbers if i%2==0]print(数字),这非常有效,谢谢。这应该行得通。要知道原因,请查看解释得很好的答案:)
def even(numbers):
    numbers =  [i for i in numbers if i % 2 == 0]
    return numbers
print(even([5,4,3,2,1]))