我正盯着我制作的一段Python代码,虽然这是正确的,但却很丑陋。有更多的pythonic方式吗?
r = self.get_pixel(x,y, RED)
g = self.get_pixel(x,y, GREEN)
b = self.get_pixel(x,y, BLUE)
t = function(r,g,b)
if t:
r2, g2, b2 = t
self.set_pixel(x,y,RED, r2)
self.set_pixel(x,y,GREEN, g2)
self.set_pixel(x,y,BLUE, b2)
问题是重复get_pixel
和set_pixel
的方法调用。供您参考:
RED, GREEN, BLUE = range(3)
另请注意,我希望保持代码清晰度和清晰度。
答案 0 :(得分:5)
当您使用self
时,get_pixel
等似乎是您的类的方法。而不是列表推导和zip()
以及其他解决方法,请查看API并修复它们。两个建议:
get_pixel_colors(x, y)
。然后你可以写r, g, b = self.get_pixel_colors(x, y)
self.set_pixel_colors(x, y, r, g, b)
更好的是,您可以使用*args
表示法:
old_colors = self.get_pixel_colors(x, y)
new_colors = function(*old_colors)
if new_colors:
self.set_pixel_colors(x, y, *new_colors)
答案 1 :(得分:4)
我会使用命名元组来表示颜色,并将类更改为使用颜色属性而不是单独的get_pixel(x,y,c)
。
例如:
from collections import namedtuple
Color = namedtuple('Color', 'red green blue')
#...
color = self.get_pixel(x, y)
t = function(*color)
if t:
self.set_pixel(x, y, color)
编辑:感谢John Machin在此处提出的更正建议。他的回答也让我更深入地了解了这种方法的原因。我想补充一点,namedtuple
的优势在于我希望拥有color.red
,color.green
,color.blue
这样的字段。 YMMV。
答案 2 :(得分:1)
要调用具有不同参数的函数并收集结果,您可以使用列表推导:
r1, r2, r3 = [foo(x) for x in [x1, x2, x3]]
要为其副作用调用一个函数,我建议不要使用列表推导而是使用普通的for循环:
ijs = [(i1, j1), (i2, j2), (i3, j3)]
for i, j in ijs:
bar(i, j)
但是你的问题并不是你不应该单独为每种颜色调用你的设定像素。如果可能,请更改您的API,以便您可以按照 John Machin 的建议执行此操作:
old_colors = self.get_pixel_colors(x, y)
new_colors = function(*old_colors)
if new_colors:
self.set_pixel_colors(x, y, *new_colors)
答案 3 :(得分:1)
colors = (RED, GREEN, BLUE)
r, g, b = [self.get_pixel(x, y, col) for col in colors]
t = function(r, g, b)
for col, rgb in zip(colors, t):
self.set_pixel(x, y, col, rgb)