关于if语句:检查python中值是否大于、小于或等于零的更好方法

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'


您可以使用sign()函数和索引查找:

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

这里,colVal(-4)'color1'等…

通过这种方式,您可以根据自己的意愿继续追加您的conditions列表,并且仍然保持其余代码的完整性。这是一个关于你能做什么的想法。但是,如何格式化代码取决于您自己。例如,您可以

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"