在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功能。谢谢你的提问:)。