在Python中使用+ =运算符时,您可以这样做
>>>a=42
>>>a+=1
>>>a
43
现在让我说我有
>>>a=1
>>>b=1
>>>c=1
并且想做
>>>a, b, c += 1, 2, 3
简而言之
>>>a+=1
>>>b+=2
>>>c+=3
现在我的代码看起来像
rt, gt, bt = 0,0,0
for yi in range(self.ysize):
for xi in range(self.xsize):
ri, gi, bi, = self.pix[xi, yi][:3]
rt += ri
gt += gi
bt += bi
num_pixels = self.xsize*self.ysize
r = rt/num_pixels
g = gt/num_pixels
b = bt/num_pixels
return int(r), int(g), int(b)
我希望能够在一行中设置三个值,以便代码更清晰。
有没有办法使用+ =这个?
有没有办法做到这一点简洁明了(没有定义一个函数来为我做)
有没有更好的方法来循环二维数组并平均元组?
您可以使用numpy
来获取此行为:
x = np.arange(5)
x += np.arange(5)
print x
array([0, 2, 4, 6, 8])
包装/拆包步骤:
vals = np.array([a, b, c])
vals += 1, 2, 3
# now you can use vals[0] for a, vals[1] for b and vals[2] for c
# but if you want to keep using a,b,c variable names:
a,b,c = vals
最简洁的答案是不。扩充赋值不能与元组解包一起使用
如果使用它,numpy
解决方案很棒,但是你也可以通过简单地不使用+=
在一行上执行计算:
rt, gt, bt = rt + ri, gt + gi, bt + bi
或者,如果你使用rt
,gt
和bt
的列表,你可以使用map
和zip
:
sums = [0, 0, 0]
for yi in range(self.ysize):
for xi in range(self.xsize):
sums = map(sum, zip(sums, self.pix[xi, yi][:3])
sums = list(sums) # alternatively: rt, gt, bt = sums
事实上,使用此方法可能会将代码减少为:
sums = [0, 0, 0]
for yi in range(self.ysize):
for xi in range(self.xsize):
sums = map(sum, zip(sums, self.pix[xi, yi][:3])
num_pixels = self.xsize*self.ysize
return tuple(map(lambda x:int(x/num_pixels), sums))