使用plus-equal来修改多个变量?

问题描述 投票:1回答:3

在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)

我希望能够在一行中设置三个值,以便代码更清晰。

有没有办法使用+ =这个?

有没有办法做到这一点简洁明了(没有定义一个函数来为我做)

有没有更好的方法来循环二维数组并平均元组?

python
3个回答
3
投票

您可以使用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 

2
投票

最简洁的答案是不。扩充赋值不能与元组解包一起使用


0
投票

如果使用它,numpy解决方案很棒,但是你也可以通过简单地不使用+=在一行上执行计算:

rt, gt, bt = rt + ri, gt + gi, bt + bi

或者,如果你使用rtgtbt的列表,你可以使用mapzip

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))
© www.soinside.com 2019 - 2024. All rights reserved.