这行在这个Python脚本中怎么工作?

4 投票
4 回答
2769 浏览
提问于 2025-04-16 19:25
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()为真的字符串(这样做的目的是确保每个字符串里有内容,而不是只有空格)。

(如果你不知道什么是生成器,可以看看这个链接。)

撰写回答