food = dict(line.split(":", 1) for line in open("file") if line.strip())
我知道这段代码的作用,但我不明白为什么要像这样组合它。所以,有人可以解释一下在结尾处添加“if”语句的逻辑吗?
通过迭代从文件中创建一个字典,然后只需添加...,这是如何运作的?
if line.strip()
"work?"这个语句后面不需要加任何条件语句。它告诉脚本执行这个操作。
我知道这段代码可以运行,但我不明白它是如何运作的。
food = dict(line.split(":", 1) for line in open("file") if line.strip())
if line.strip()
"work?"这个语句后面不需要加任何条件语句。它告诉脚本执行这个操作。
我知道这段代码可以运行,但我不明白它是如何运作的。
if语句用作生成器表达式的过滤器。在生成器表达式的结尾处,可以使用if语句来指定每个项需要满足的条件,以便包含在最终生成器中。
您可能更好地理解一个更简单的例子:
(i for i in range(100) if i % 3 == 0)
返回一个生成器,其中包含从0到99中每个可以被3整除的数字。
在您特定的示例中,if line.strip()
过滤了最终的生成器,以仅包含 line.strip()
为 True 的字符串(其想法可能是确保每个字符串中除了空格符之外还有其他内容)。
(如果您不知道生成器是什么,请参阅这里。)
if line.strip()
的意思是如果在去除空格之后,该行代码为真,那么该条件就成立。如果它放在普通的 if 语句中也是同样的效果。 - Rafe Kettlerif line.strip()
只是检查字符串是否为空或仅包含空格。在结尾添加 if 语句只是生成器表达式的语法工作方式;在迭代文件中的行时,将排除 if 语句为 false 的行。
这是一个理解。
添加一个尾随的if
将检查每个元素是否在您的条件内有效,并将其添加到列表中(在您的情况下,是生成器)。
>>> [i for i in range(10) if i%2]
[1, 3, 5, 7, 9]
你只得到了奇数
list
。但是它们在评估方面的差异使它们成为相对不同的概念。 - user395760这里使用了列表推导式语法(或者更准确地说,在这种情况下,它是一个生成器推导式)。大致如下:
<expression> for <name> in <iterable>[ if <condition>]
对于iterable
中的每个项目,它将把name
设置为该项目并评估expression
,但仅在condition
为真时。
所以它的作用是:迭代文件中的行。如果该行为空,则跳过它。如果该行不为空,则将其拆分为最多两个项目的冒号。在迭代完所有内容后,它将把它转换为一个dict
。