这行代码在Python脚本中的作用是什么?

4
food = dict(line.split(":", 1) for line in open("file") if line.strip())

我知道这段代码的作用,但我不明白为什么要像这样组合它。所以,有人可以解释一下在结尾处添加“if”语句的逻辑吗?
通过迭代从文件中创建一个字典,然后只需添加...,这是如何运作的?
if line.strip() 

"work?"这个语句后面不需要加任何条件语句。它告诉脚本执行这个操作。

我知道这段代码可以运行,但我不明白它是如何运作的。


查找“生成器表达式”。这是一种特殊的语法。 - Rafe Kettler
4个回答

6

if语句用作生成器表达式的过滤器。在生成器表达式的结尾处,可以使用if语句来指定每个项需要满足的条件,以便包含在最终生成器中。

您可能更好地理解一个更简单的例子:

(i for i in range(100) if i % 3 == 0)

返回一个生成器,其中包含从0到99中每个可以被3整除的数字。

在您特定的示例中,if line.strip() 过滤了最终的生成器,以仅包含 line.strip() 为 True 的字符串(其想法可能是确保每个字符串中除了空格符之外还有其他内容)。

(如果您不知道生成器是什么,请参阅这里。)


好的,我明白了。但是,最后的if语句是否意味着只添加带有空格的内容,还是这是我需要学习生成器中的内容? - lgxjames
@Igxjames if line.strip() 的意思是如果在去除空格之后,该行代码为真,那么该条件就成立。如果它放在普通的 if 语句中也是同样的效果。 - Rafe Kettler

2

if line.strip() 只是检查字符串是否为空或仅包含空格。在结尾添加 if 语句只是生成器表达式的语法工作方式;在迭代文件中的行时,将排除 if 语句为 false 的行。


1

这是一个理解

添加一个尾随的if将检查每个元素是否在您的条件内有效,并将其添加到列表中(在您的情况下,是生成器)。

>>> [i for i in range(10) if i%2]
[1, 3, 5, 7, 9]

你只得到了奇数


2
实际上,这是一个生成器表达式。 - Rafe Kettler
1
是的,但是楼主不知道什么是列表|生成器推导式,所以理解列表更容易。 - JBernardo
2
它们是相关的,但完全不同的概念。现在有点困惑比以后受到限制要好。 - Rafe Kettler
1
这是相同的概念。它们在评估上有所不同。 - JBernardo
从概念上讲,列表推导式是一个生成器表达式提供给 list。但是它们在评估方面的差异使它们成为相对不同的概念。 - user395760

1

这里使用了列表推导式语法(或者更准确地说,在这种情况下,它是一个生成器推导式)。大致如下:

<expression> for <name> in <iterable>[ if <condition>]

对于iterable中的每个项目,它将把name设置为该项目并评估expression,但仅在condition为真时。

所以它的作用是:迭代文件中的行。如果该行为空,则跳过它。如果该行不为空,则将其拆分为最多两个项目的冒号。在迭代完所有内容后,它将把它转换为一个dict


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接