Python 嵌套if-else的更好方法
如何以更好的方式完成嵌套if-else? 我想尽量减少Python 嵌套if-else的更好方法,python,if-statement,Python,If Statement,如何以更好的方式完成嵌套if-else? 我想尽量减少打印“run dozer()” 唯一出现两次的代码片段是“run dozer()”,因此我们可以对打印的情况进行分析:如果a!=1或b!=2。在另一种情况下,它会打印“run car()”。因此: if a != 1 or b != 2: print "run dozer()" else: print "run car()" 在这种情况下,这可能不是一个好主意,但您可以在所有(预期的)情况下运行代码(0对于a表示非-1,对于
打印“run dozer()”
唯一出现两次的代码片段是
“run dozer()”
,因此我们可以对打印的情况进行分析:如果a!=1
或b!=2
。在另一种情况下,它会打印“run car()”
。因此:
if a != 1 or b != 2:
print "run dozer()"
else:
print "run car()"
在这种情况下,这可能不是一个好主意,但您可以在所有(预期的)情况下运行代码(
0
对于a
表示非-1
,对于b
表示非-2
):
这将为您提供所有组合的列表:
a = 0, b = 0
run dozer()
a = 0, b = 2
run dozer()
a = 1, b = 0
run dozer()
a = 1, b = 2
run car()
这将为您提供一个组合列表,这些组合将触发运行汽车
:a=1,b=2
。一种解决方案是使用元组比较:
if (a, b) == (1, 2):
print('run car')
else:
print('run dozer')
在这种情况下,这非常简单,但这种方法对于更复杂、更深嵌套的
非常敏感,如果s、更多变量、更多情况(或者如果您只是想好奇:-)您可以在一行中编写相同的逻辑,如下所示:
print "run car()" if a == 1 and b == 2 else "run dozer()"
因为Python将True
/False
视为0和1。您可以使用这些布尔值作为索引,从元组中提取字符串,如下所示:
print ("run dozer()", "run car()")[(a, b) == (1, 2)]
(这一回答的灵感来源于作者的评论)
为了进一步减少代码,您可以执行以下字符串格式设置:
print "run %sr()" % ("doze", "ca")[(a, b) == (1, 2)]
# OR, via using `str.format()`
# print "run {}r()".format(("doze", "ca")[(a, b) == (1, 2)])
但不要这样做。它的可读性不如前一个
编辑:根据大观察家TemporalWolf的另一条评论,因为a=1
,和b=2
;这可以放在一个布尔条件中,因为:0看起来不错,有什么问题?@MSeifert:在“run dozer()”的情况下有一点代码重复。可以对此进行一些优化。但事实上,这并不是一个真正的问题。哦,我还没有发现代码重复。这应该在问题中提到:)让我继续编辑问题。print(“run dozer()”,“run car()”)[a==1和b==2]
@wim:好的,我们的想法是分析“公共代码路径”是什么。由于“run dozer”
是唯一具有重复代码的代码片段,因此我对该片段进行了分析。条件是当a!=1或b!=2
.code高尔夫版本:打印“run”+(“doze”,“ca”)[(a,b)==(1,2)]+“r()”
不要这样做please@TemporalWolf更新了答案,版本稍好一些;再次从您的评论中得到启发:)如果a&b是整数:print“run%sr()”%(“doze”,“ca”)[0第一个非常好!但我认为教人如何用布尔值索引元组是不明智的。但是0我同意MSeivert,code Golf是不合适的话题。另外,如果您愿意,请将其分开:print[“玩家%s获胜!”(1+(4256>>len(b*2+a)-9&1),“平局!”[a==b]
它告诉你谁赢,给出“石头”、“布”、“剪刀”作为输入a/b
print "run car()" if a == 1 and b == 2 else "run dozer()"
print ("run dozer()", "run car()")[(a, b) == (1, 2)]
print "run %sr()" % ("doze", "ca")[(a, b) == (1, 2)]
# OR, via using `str.format()`
# print "run {}r()".format(("doze", "ca")[(a, b) == (1, 2)])
print'run %sr()'%('doze','ca')[0<a<b<3]