pt1
和pt2
是由{int}组成的两个tuple
。
pairs = zip(pt1, pt2)
sum_sq_diffs = sum((a - b)**2 for a, b in pairs)
return (sum_sq_diffs)
我的问题涉及第二行。什么是a和b?如果你打印它们:
print list((a,b) for a, b in pairs))
你得到[(pt1x,pt2x),(pt1y,pt2y)]
如果我拿两个元组并减去它们,就会出错。那么sum_sq_diffs = sum((a - b)**2 for a, b in pairs)
怎么会导致错误呢?它似乎是tuple
而b
是tuple
。
答案 0 :(得分:2)
您了解pairs
是元组列表。
现在,第二行是列表推导,相当于
sum_sq_diffs = 0
for a, b in pairs:
sum_sq_diffs += (a - b)**2
现在,在迭代单个元素时,python会为你做一个“元组解包”,并分别将(x,y)提取到局部变量a
和b
。
这恰当地称为元组解包。元组解包要求左侧的变量列表与元组的长度具有相同的元素数。请注意,多重赋值实际上只是元组打包和元组解包的组合!
这是一个快速演示,应该证明这一点:
>>> pt1 = [1, 2, 3]
>>> pt2 = [4, 5, 6]
>>> pairs = zip(pt1, pt2)
>>> pairs
[(1, 4), (2, 5), (3, 6)]
>>> sum_sq_diffs = sum((a - b)**2 for a, b in pairs)
>>> sum_sq_diffs
27
>>> sum_sq_diffs_2 = 0
>>> for a, b in pairs:
... print a, b
... sum_sq_diffs_2 += (a - b)**2
...
1 4
2 5
3 6
>>> sum_sq_diffs_2
27
>>>
答案 1 :(得分:0)
对应该是元组列表。
a,b应该一次解开那些元组。所以他们应该是标量。
关于列表推导和生成器表达式有很多相似之处。我不喜欢他们的一件事是,当你对他们的行为方式有疑问时,你最终会把它们重写为循环。
但我的确建议将你的理解重写为循环,并插入打印(a,b)或打印a,b。这可能有所帮助。