为什么在for循环前面有一个单词?

时间:2017-02-27 19:10:41

标签: python

我对python比较陌生,我看到这段代码检查偶数,特别是在创建列表时使用一行代码并对其中的偶数进行排序。

我以前常常看到:

列表中的项目:#etc etc

但为什么在for循环前面还有另一个'num':

a = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] even_numbers = [num for num in a if num % 2 is 0] # on this line print(even_numbers)

5 个答案:

答案 0 :(得分:0)

以下代码行,

even_numbers = [num for num in a if num % 2 is 0]

相当于:

even_numbers = []
for num in a:
    if num % 2 == 0:
        even_numbers.append(num)

所以,这部分 - even_numbers.append(num)等同于:

even_numbers = [num for ...]

因此,列表num中也可以被2整除的数字a会添加到列表even_numbers中。

答案 1 :(得分:0)

这实际上不是for循环,它是list comprehensionnum前面的for是用于新列表中每个元素的表达式。

答案 2 :(得分:0)

[num for num in a if num % 2 is 0]

Python中,这被称为“列表理解”。它是实现以下代码的简便方法:

even_numbers = []
for num in a:
    if num % 2 == 0:
        even_numbers.append(num)

答案 3 :(得分:0)

在你的简单案例中,有点难以理解为什么你会想要额外的num。因此,让我们想象一些更有趣的东西,你有一个数字列表,正面和负面,以及你想要迭代列表中数字的绝对值

在这种情况下,你可以写:

 absolutes = [abs(num) for num in a if num % 2 = 0]

这也是一个非常简单的案例,更典型的可能是:

 names = [company.name for company in companies if company.state = search_state]

换句话说,列表推导产生的项目不需要是原始列表中的相同项目或项目类型。

这是另一个不太明显的例子。它生成一串逗号分隔的问号,您可以使用IN运算符构建参数化SQL查询:

 qmarks = ','.join(['?' for param in param_list])

在这种情况下,从列表推导返回的项目甚至不是从原始列表中的项目派生的。

答案 4 :(得分:0)

在for循环中你会说:

mylist = []
for num in a:
    if num % 2 is 0:
        mylist.append(num)

使用语法,您会看到前面的num与第4行代码同义。

这种语法实际上是一个python列表理解,但它确实做了类似于上面的for循环。

这种语法的好处是它允许您在一行中快速/动态地创建/修改列表。

另一个可能帮助您理解为什么num位于前面的示例是一个简单的行,它将浮点数列表转换为整数列表。请注意,在此示例中,最后没有if语句,并且我已将输出float包装在int()强制转换中。

floats_list = [1.1, 2.2, 3.3, 4.4, 5.5]
ints_list = [ int(float) for float in floats_list ]