我对以下语法感到困惑:
def getClassiness(self):
classiness_points = {
"tophat": 2,
"bowtie": 4,
"monocle": 5
}
classiness = sum(classiness_points.get(item, 0) for item in self.items)
return classiness
我理解以下一个,但两个都是正确的。
def getClassiness(self):
classiness_points = {
"tophat": 2,
"bowtie": 4,
"monocle": 5
}
classiness = 0
for item in self.items:
classiness += classiness_points.get(item, 0)
return classiness
我想我不明白的是生成器表达式是如何工作的。我知道 sum() 将一个可迭代对象作为其参数并返回元素的总和。我会想到:
classiness = sum(classiness_points.get(item, 0) for item in self.items)
return classiness
这样更好,
classiness = sum( for item in self.items: classiness_points.get(item, 0))
return classiness
因为我习惯把表达式放在for循环之后 它必须只是语法。
假设这个输入:
classiness_points = {'tophat': 2, 'bowtie': 4, 'monocle': 5}
items = ['tophat', 'monocle', 'shirt']
生成器所做的几乎与列表理解相同:
[classiness_points.get(item, 0) for item in items]
# [2, 5, 0]
除了它只在请求时生成项目,
sum
通过迭代生成器的项目来完成。
sum(classiness_points.get(item, 0) for item in items)
# 7
所以,这或多或少等同于:
sum([classiness_points.get(item, 0) for item in items])
除了一种情况,python 会预先生成一个列表以传递给
sum
。在另一个 sum
中,它自己迭代生成器的元素。