在python中检查值是否大于、小于或等于零的更好方法

在python中检查值是否大于、小于或等于零的更好方法,python,if-statement,idioms,Python,If Statement,Idioms,我有一个函数,它可以查看一个值是否大于、小于或等于零,并根据结果返回三种颜色中的一种。此外,如果存在某个属性,则它不会返回三种颜色中的一种,而是返回单独的第四种。我是这样解决的: def set_colour(x, trigger=False): if x > 0.0: colour = 'green' elif x < 0.0: colour = 'red' else: colour = 'black'

我有一个函数,它可以查看一个值是否大于、小于或等于零,并根据结果返回三种颜色中的一种。此外,如果存在某个属性,则它不会返回三种颜色中的一种,而是返回单独的第四种。我是这样解决的:

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
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) ]
def set_颜色(x,触发器=False):
如果x>0.0:
颜色=‘绿色’
elif x<0.0:
颜色=‘红色’
其他:
颜色=‘黑色’
如果触发:
颜色=‘蓝色’
返色
但是我不喜欢它。有没有更好的方式更优雅、更高效、更通俗? 我发现post非常有趣,但不能使用字典,因为我没有检查静态值,而是比较值

为了使用字典解决方案,是否有可能为所有大于零的数字定义一个变量进行测试?也许是和lambda?我试过一些东西,但没有成功

目前,我的解决方案可能运行良好,但在未来,对于小于-1.0、-2.0或更大的1.0或2.0等值,可能会添加其他颜色。在这一点上,代码将变得越来越长,因为我觉得可以更优雅地解决某些问题


我想我在这里检查了所有相关的帖子,所以我希望这不是一个重复的帖子。

您可以使用嵌套条件表达式,如下所示

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"
def set_颜色(x,触发器=False):
如果触发:返回“蓝色”
如果x>0.0,则返回“绿色”,如果x<0.0,则返回“红色”,否则返回“黑色”
断言设置颜色(无,真)=“蓝色”
断言设置颜色(0.0,真)=“蓝色”
断言设置颜色(0.0,False)=“黑色”
断言设置颜色(0.01,False)=“绿色”
断言设置颜色(-0.01,False)=“红色”

这是我唯一要做的更改:

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'
def set_颜色(x,触发器=False):
如果触发:
返回“蓝色”
elif x>0.0:
返回“绿色”
elif x<0.0:
返回“红色”
其他:
返回“黑色”
您可以使用
符号()
函数和索引查找:

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]
也就是说,我不确定这有多“好”。“聪明”!=通常情况下“更好”

编辑备选方案,允许您轻松扩展多种颜色范围:

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'
colorRanges=(
#开始,颜色
(-2,‘红色’),
(0,'黄色'),
(1,'橙色'),
)
def设置颜色(x,触发器=假):
如果触发:返回“蓝色”
如果x==0.0:返回“黑色”
对于“开始”,颜色范围中的颜色:
如果x<开始:返回颜色
返回“绿色”

这使您可以轻松定义颜色范围,但我没有更好地处理角盒的好主意。

这非常可读且易于扩展:)

def set_颜色(x,触发器=False):
颜色=‘黑色’
颜色=‘绿色’,如果x>0.0,则为其他颜色
颜色=‘红色’,如果x<0.0,则为其他颜色
颜色=‘蓝色’,如果触发其他颜色
返回颜色

您不能因为需要一些条件而运行。但是,您可以在列表中列出条件,在另一个列表中列出相应的颜色,然后调用条件。这样,您就可以在某种程度上将条件与代码分开。这是因为函数是Python中的第一类值

您可以这样做:

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

不确定这是否是你想要的

为什么您认为您的解决方案不优雅、不高效或不符合Python?我觉得很好。我觉得很完美,很清楚,很中肯。我不会碰这个代码。你可以把
if trigger
放在最上面,去掉
color
变量,立即返回所需的颜色。可能只是
返回“blue”
更快,因为它似乎比X更优先,但否则,就可以了……现在就可以了。如果将来添加了其他颜色,则更改代码。另外,很难扩展到其他可能的范围。有趣!将来可能有用。非常感谢^_^谢谢在这种情况下,我将只实现这些微小的更改。只是我经常编写一些代码,结果证明这不是用python实现的最佳方式。所以我一直在挖掘,希望找到一个新的技巧。到目前为止,我只在单元测试中使用断言。我们必须研究它的其他可能性。谢谢^_^非常感谢。这是更好的阅读,尤其是如果不同颜色的列表变得更长。尽管如此,我还是更喜欢@Yuval-Adam的版本,因为它可能会因为即时回报而稍微快一点。虽然我在某个地方读到过,你不应该使用多重回报。但现在这是另一天的故事。^ u^:事实上,这正是我的想法,但我没能开始工作!虽然我必须使用@Yuval Adam的版本,因为它看起来确实更有效,但我真的很喜欢这个版本,我一定会玩它!多谢各位^_^不客气。跳出框框思考是很有趣的,你的问题似乎是一个完美的问题,可以使用一些我通常不会使用的Python功能。谢谢你的提问:)。