将 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
产生从 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
。
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]))
如果我提供这个功能:
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
产生从 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
。
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]))