这行代码在这个python脚本中是如何工作的

这行代码在这个python脚本中是如何工作的,python,Python,我知道这段代码是做什么的,但我不明白为什么它是这样放在一起的,所以有人能给我解释一下在末尾添加“if”语句的逻辑吗 告诉脚本使用文件中的迭代生成字典,然后只添加 food = dict(line.split(":", 1) for line in open("file") if line.strip()) 工作?难道不需要在那句话之后再加些什么吗??它告诉脚本什么,因为它之后没有条件 我知道这段代码是有效的,因为我试过了,但我对它的工作原理感到困惑。这是一个错误 添加尾随的if将检查每个元素在

我知道这段代码是做什么的,但我不明白为什么它是这样放在一起的,所以有人能给我解释一下在末尾添加“if”语句的逻辑吗

告诉脚本使用文件中的迭代生成字典,然后只添加

food = dict(line.split(":", 1) for line in open("file") if line.strip())
工作?难道不需要在那句话之后再加些什么吗??它告诉脚本什么,因为它之后没有条件

我知道这段代码是有效的,因为我试过了,但我对它的工作原理感到困惑。

这是一个错误

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


您只得到奇数

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

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

>>> [i for i in range(10) if i%2]
[1, 3, 5, 7, 9]
返回一个生成器,该生成器包含0到99之间可被3整除的每个数字

在您的特定示例中,
if line.strip()
只将最终生成器过滤为
line.strip()
为真的字符串(其目的可能是确保每个字符串中都有一些内容,而不是空白)


(如果您不知道生成器是什么,)

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

这使用列表理解语法(或者更准确地说,在本例中,它是生成器理解)。有点像这样:

(i for i in range(100) if i % 3 == 0)
[if]中的

对于
iterable
中的每个项目,它将为该项目设置
名称
,并计算
表达式
,但仅当
条件
为真时


它的作用是:在文件中的行上迭代。如果该行为空,则跳过该行。如果该行不是空的,它将在冒号上拆分该行,最多包含两个项目。在它迭代了所有内容之后,它将把它变成一个
dict

查找“生成器表达式”。这是一种特殊的语法。实际上,它是一个生成器表达式。是的,但是OP不知道什么是列表|生成器理解,所以更容易理解列表。它们是相关的,但概念完全不同。现在有点困惑总比以后一瘸一拐好——这是同一个概念。从概念上讲,列表理解是一个提供给
list
的生成器表达式。但是求值的不同确实使它们有了相对不同的概念。好吧,我理解,但最后的if不是意味着只添加带空格的内容,还是我需要学习生成器中的某些内容?…@Igxjames
if line.strip()
表示在去掉空格后该行的求值是否为true。如果它处于正常的if状态,它的工作原理也是一样的。
(i for i in range(100) if i % 3 == 0)
<expression> for <name> in <iterable>[ if <condition>]