我对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)
答案 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 comprehension。 num
前面的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 ]