我有一个函数,可以查看值是更大,更小还是等于零,并且根据结果返回三种颜色中的一种。此外,如果存在某个属性,它不会返回三种颜色中的一种,而是单独的第四种颜色。我这样解决了:
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等的值添加其他颜色,此时代码将变得更长,对于我认为可以更优雅地解决的事情来说,更长的时间。
我想我在这里查看所有相关帖子,所以我希望这不是重复的。
答案 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)
不确定这是否是你想要的。