列表理解中初始变量的用途

Purpose of the initial variable in list comprehension

 evens_to_50 = [i for i in range(51) if i % 2 == 0]
 print evens_to_50

有人可以解释一下 i 紧接在右括号之后和此代码第一行中的 for 之前,或者分享 link 或解释此类代码的指南;我找到的只是一个一般性的解释(不是针对 python,而是针对一般的编程),但没有太具体;我理解(我认为)for i in range(51) if i % 2 == 0 但不是它之前的 i 部分。

当您编写列表推导式时,您必须为循环的每次迭代提供一个您希望返回的值(最终将填充结果列表的内容),然后您的循环就是 运行。最基本的形式是这样的:

[i for i in range(10)]

这就意味着 "use the value I'm iterating over as the return value each time and put that into my list." 你 不必 这么简单。例如,如果您要生成元组列表,它可能如下所示:

[(i, False) for i in range(10)]

您所指的 i 是将要插入到您正在创建的新列表中的值。列表推导式会为您创建一个新列表,而 i 就是新列表中的内容。要将您粘贴的列表理解分解为英语,您所说的(从左到右)是:

将值 i 放入新列表中,每个 i 的值都在 0 - 50 的数字范围内,但只有偶数,即 i % 2 = 0

或者重新写一遍:

对于0-50范围内的每个值(range(51)),只插入那些偶数(i % 2 = 0),插入每个数字(每个数字由i表示) 到新列表 ([]):

[i for i in range(51) if i % 2 == 0]

这是每次迭代时将包含在您的列表中的值。

例如,尝试将其更改为 i + 1,所有结果列表值都应增加 1。

左括号后的第一个 i 表示将存储在列表中的值。出现的其他 i's 只是循环变量。从技术上讲,它们都是循环控制变量,但是,第一个 i 将存储在列表中。

列表理解只是 shorthand 一些等效的 for 循环。

[i for i in range(3)]

表示:

result = []
for i in range(3):
    result.append(i)

列表理解只是一次性构建列表匿名,即没有为其分配名称(如上例中的result)。

第一个 i 所做的事情的答案是它回答了问题 "What do I add to the list on each iteration defined by the following loop?"

试试这些推导式看看你得到了什么:

['c' for i in range(3)]
[2*i for i in range(3)]
['hello'[i] for i in range(3)]