Better way to check if value is bigger, smaller or equal zero in python
我有一个函数,它检查一个值是否大于、小于或等于零,并根据结果返回三种颜色中的一种。另外,如果某个属性存在,它不会返回三种颜色中的一种,而是返回单独的第四种颜色。我是这样解决的:
1 2 3 4 5 6 7 8 9 10 11 12 | 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等的值添加其他颜色,此时,代码将变得越来越长,因为我觉得可以更优雅地解决某些问题。
我想我查了所有相关的帖子,希望这不是一个副本。
这是我唯一的改变:
1 2 3 4 5 6 7 8 9 | 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' |
您可以使用
1 2 3 4 5 6 7 | import math def sign(v): return int(math.copysign(1,v)) def set_color(x, trigger=False): if trigger: return"blue" return ('red', 'black', 'green')[sign(x)+1] |
也就是说,我不确定这有多"好"。"聪明"!一般情况下为"更好"。
编辑备选方案,使您可以轻松地将其扩展到多种颜色范围:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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中的第一类值。
你可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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) ] |
这里,
通过这种方式,您可以根据自己的意愿继续追加您的
1 2 3 | def set_colour(x, trigger=False): if trigger: return 'someColor' else: return colVal(x) |
但不确定这是否是你想要的。
这是很容易阅读和扩展的:)
1 2 3 4 5 6 7 | 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 |
可以使用嵌套的条件表达式,如下所示
1 2 3 4 5 6 7 8 9 | 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" |