【发布时间】:2016-09-03 22:52:49
【问题描述】:
我想压缩一些看起来像这样的湿代码:
if slips[i] < 3000:
ac.setBackgroundColor(wheel['slip'], 0, 0, 0)
# setBackgroundOpacity deliberately omitted here
elif slips[i] < 3700:
ac.setBackgroundColor(wheel['slip'], .2, .4, .2)
ac.setBackgroundOpacity(wheel['slip'], 1)
elif slips[i] < 4100:
ac.setBackgroundColor(wheel['slip'], 0, 1, 0)
ac.setBackgroundOpacity(wheel['slip'], 1)
elif slips[i] < 4500:
ac.setBackgroundColor(wheel['slip'], 0, 0, 1)
ac.setBackgroundOpacity(wheel['slip'], 1)
else:
ac.setBackgroundColor(wheel['slip'], 1, 0, 0)
ac.setBackgroundOpacity(wheel['slip'], 1)
每次重复这段 sn-p 代码时,唯一改变的是背景画布(在本例中为 wheel['slip']),以及 if elif else 中的数字。
我首先想到的是做一些可以像这样使用的东西:
if_replacer(wheel['slip'], slips[i], 3000, 3700, 4100, 4500)
def if_replacer(canvas, value, *args):
# idunno
我的问题是,我将如何以编程方式生成 if elif else's?我知道我可以像这样对其进行硬编码:
def if_replacer(canvas, value, c1, c2, c3, c4):
if value < c1:
ac.setBackgroundColor(canvas, 0, 0, 0)
return
elif value < c2:
ac.setBackgroundColor(canvas, .2, .4, .2)
elif value < c3:
ac.setBackgroundColor(canvas, 0, 1, 0)
elif value < c4:
ac.setBackgroundColor(canvas, 0, 0, 1)
else:
ac.setBackgroundColor(canvas, 1, 0, 0)
ac.setBackgroundOpacity(canvas, 1)
但我很感兴趣是否有一种简洁的 Pythonic 方法来完成此任务。
编辑:很多优秀的答案,但可惜我只能将其中一个标记为已接受(尽管所有有效的解决方案都被赞成)。我接受了我在代码中实现的答案,但对于任何偶然发现这个问题的人来说,请看看其他解决方案,它们都很出色。并且,感谢所有写答案的人。
【问题讨论】:
-
你是不是故意省略了第一种情况下的
ac.setBackgroundOpacity(wheel['slip'], 1)? -
@TrevorMerrifield 他们在他们的“硬编码”示例中似乎是特殊的外壳......所以我猜这不仅仅是一条缺失的线......但我们永远不知道......跨度>
-
@TrevorMerrifield 是的,这是故意的
-
我会使用部分函数来减少重复,但否则我认为您现有的结构是最清晰的(即目前最可维护的)。
标签: python if-statement dry