这行如何在这个python脚本中工作

时间:2011-06-12 18:16:23

标签: python

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

我知道这段代码的作用但是我不明白为什么它这样放在一起,所以有人可以向我解释在最后添加“if”语句的逻辑。

如何告诉脚本使用文件工作中的迭代来创建字典,然后添加

if line.strip() 

工作?那句话之后没有什么需要去的吗?它是什么告诉剧本,因为之后没有条件?

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

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

(如果你不知道发电机是什么,see this。)

答案 1 :(得分:1)

这是comprehension

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

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

而你只有奇数

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这使用列表理解语法(或者更确切地说,在这种情况下,它是生成器理解)。它有点像这样:

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

对于iterable中的每个项目,它会将name设置为该项目并评估expression,但前提是condition是真实的。

它是做什么的:它迭代文件中的行。如果该行为空,则跳过该行。如果该行不为空,则会将其拆分为最多包含两个项目的冒号。迭代完所有内容后,它会将其变为dict