这行在这个Python脚本中怎么工作?
food = dict(line.split(":", 1) for line in open("file") if line.strip())
我知道这段代码的功能,但我不明白为什么要这样写。有人能给我解释一下在最后加上“if”语句的逻辑吗?
让脚本通过从文件中迭代来创建一个字典是怎么回事,然后又加上
if line.strip()
这样就能工作?难道在这个语句后面不需要加点什么吗?它在告诉脚本什么,因为后面没有条件?
我知道这段代码能运行,因为我试过,但我对它是怎么工作的感到困惑。
4 个回答
1
这是一个列表推导式。
在后面加上一个 if
,就会检查每个元素是否符合你的条件,如果符合,就把它加到一个列表里(在你的例子中,是一个生成器)。
>>> [i for i in range(10) if i%2]
[1, 3, 5, 7, 9]
这样你就只得到了奇数。
2
if line.strip()
这个判断就是用来检查字符串是否为空或者只包含空格。如果在最后加上这个判断,是因为生成器表达式的语法就是这样;在读取文件的每一行时,只有那些通过这个判断的行才会被保留,判断为假的行会被排除掉。
6
if语句就像是生成器表达式的一个筛选器。在生成器表达式的最后,你可以加一个if语句,来指定每个项目需要满足的条件,才能被包含在最终的生成器中。
你可能会更好理解一个简单的例子:
(i for i in range(100) if i % 3 == 0)
这个例子返回一个生成器,里面包含从0到99之间所有能被3整除的数字。
在你提到的例子中,if line.strip()
是用来筛选最终生成器的,只保留那些line.strip()
为真的字符串(这样做的目的是确保每个字符串里有内容,而不是只有空格)。
(如果你不知道什么是生成器,可以看看这个链接。)