我有一个函数,它检查一个值是否大于、小于或等于零,并根据结果返回三种颜色中的一种。另外,如果某个属性存在,它不会返回三种颜色中的一种,而是返回单独的第四种颜色。我是这样解决的:
def set_colour(x, trigger=False):
if x > 0.0:
colour = 'green'
elif x < 0.0:
colour = 'red'
else:
colour = 'black'
if trigger:
colour = 'blue'
return colour
但我不喜欢。有没有更好的方法,更优雅,更有效和更Python?我发现这篇文章很有趣,但不能使用字典,因为我不是在检查静态值,而是在比较它的值。
是否有可能为所有大于零的数字定义一个变量,以便使用字典解决方案进行测试?也许和lambda一起?我试了些东西,但什么也没拿到。
目前,这个解决方案可能还可以工作,但在将来,可能会为小于-1.0、-2.0或大于1.0或2.0等的值添加其他颜色,此时,代码将变得越来越长,因为我觉得可以更优雅地解决某些问题。
我想我查了所有相关的帖子,希望这不是一个副本。
为什么你认为你的解决方案不优雅,不高效,或者不是Python?我觉得不错。
我觉得很完美,很清楚,很有意义。我不会碰这个密码的。
你可以把if trigger放在最上面,去掉color变量,立即返回所需的颜色。
也许只是return 'blue'更快,因为它似乎比x优先,但否则,它很好…
现在没事了。如果以后添加了其他颜色,请更改代码。
感谢大家的意见!我非常感激!^ ^ ^
这是我唯一的改变:
def set_colour(x, trigger=False):
if trigger:
return 'blue'
elif x > 0.0:
return 'green'
elif x < 0.0:
return 'red'
else:
return 'black'
正是我的观点:)
谢谢您!^^在这种情况下,我将只实现这些微小的更改。只是我经常写一些代码,结果证明这不是用Python来做的最好方法。所以我在挖掘,希望找到一个新的技巧。
您可以使用sign()函数和索引查找:
import math
def sign(v):
return int((1,v))
def set_color(x, trigger=False):
if trigger: return"blue"
return ('red', 'black', 'green')[sign(x)+1]
也就是说,我不确定这有多"好"。"聪明"!一般情况下为"更好"。
编辑备选方案,使您可以轻松地将其扩展到多种颜色范围:
colorRanges = (
# start, color
(-2, 'red'),
(0, 'yellow'),
(1, 'orange'),
)
def set_color(x, trigger=False):
if trigger: return"blue"
if x == 0.0: return 'black'
for start, color in colorRanges:
if x < start: return color
return 'green'
这允许您轻松定义颜色范围,但我没有更好地处理角情况的好主意。
而且很难扩展到其他可能的范围。
@怪胎:啊,我错过了。这给了我一个主意…
互动!将来可能会有用。谢谢!^ ^ ^
你不能逃避你需要一些条件的事实。但是,您可以在一个列表中列出您的条件,并在另一个列表中列出相应的颜色,然后调用这些条件。这样,您可以将条件从代码中分离出来。这是因为函数是Python中的第一类值。
你可以这样做:
conditions = [
lambda m: m < -3,
lambda m: m >= -3 and m < -2,
lambda m: m >= -3 and m < -2,
lambda m: m >= -2 and m < 0,
lambda m: m == 0,
lambda m: m >= 0 and m < 1,
lambda m: m >= 1 ]
colors = [
'color1',
'color2',
'color3',
'color4',
'color5',
'color6',
'color7' ]
def colVal(m): return colors[ [c(m) for c in conditions].index(True) ]
这里,colVal(-4)是'color1'等…
通过这种方式,您可以根据自己的意愿继续追加您的conditions列表,并且仍然保持其余代码的完整性。这是一个关于你能做什么的想法。但是,如何格式化代码取决于您自己。例如,您可以
def set_colour(x, trigger=False):
if trigger: return 'someColor'
else: return colVal(x)
但不确定这是否是你想要的。
:d这实际上正是我想的,但没能开始工作!虽然我必须使用@yuval adam的版本,因为它看起来更高效,但我真的很喜欢这个版本,我一定会使用它!非常感谢你!^ ^ ^
不客气。开箱思考很有趣,你的问题似乎是一个完美的问题,我通常不会使用一些Python的功能。所以谢谢你的问题:)。
这是很容易阅读和扩展的:)
def set_colour(x, trigger=False):
color = 'black'
color = 'green' if x > 0.0 else color
color = 'red' if x < 0.0 else color
color = 'blue' if trigger else color
return color
谢谢您!这是更好的阅读,尤其是如果不同颜色的列表变得更长。不过,我更喜欢@yuval-adam的版本,因为它可能会更快一点,因为即时回报。虽然我在某个地方读到过,你不应该使用多次退货。但现在这是另一天的故事。^ ^ ^
可以使用嵌套的条件表达式,如下所示
def set_colour(x, trigger=False):
if trigger: return"blue"
return"green" if x > 0.0 else"red" if x < 0.0 else"black"
assert set_colour(None, True) =="blue"
assert set_colour(0.0, True) =="blue"
assert set_colour(0.0, False) =="black"
assert set_colour(0.01, False) =="green"
assert set_colour(-0.01, False) =="red"
这比原始版本的可读性差得多。
@尤瓦拉丹,我同意。
到目前为止,我只使用Assert进行单元测试。必须研究它明显的其他可能性。谢谢!^ ^ ^