更好的方法来检查python中的值是否更大,更小或相等

时间:2014-04-17 09:01:15

标签: python if-statement idioms idiomatic

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

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

但我不喜欢它。有更好的方式,更优雅,高效和pythonic? 我发现this帖子非常有趣但不能使用词典,因为我没有检查静态值但是比较了值。

为了使用字典解决方案,是否有可能为所有大于零的数字定义变量以进行测试?也许与lambda?我尝试了一些东西,但没有到达任何地方。

目前我的这个解决方案可能正常工作,但将来可能会为小于-1.0,-2.0或更大1.0或2.0等的值添加其他颜色,此时代码将变得更长,对于我认为可以更优雅地解决的事情来说,更长的时间。

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

5 个答案:

答案 0 :(得分:7)

这是我唯一的改变:

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 :(得分:4)

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

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]

那就是说,我不确定多少&#34;更好&#34;这是。 &#34;聪明&#34; !=&#34;更好&#34;在通常情况下。

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

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'

这使您可以轻松定义颜色范围,但我不会更好地处理角落情况。

答案 2 :(得分:1)

您可以使用嵌套条件表达式,例如

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"

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

你不能逃避你需要一些条件的事实。但是,您可以在列表中列出条件,在另一个列表中列出相应的颜色,然后调用条件。这样,您可以在某种程度上将您的条件与代码分开。这是因为函数是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)

不确定这是否是你想要的。