Python 嵌套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,对于

如何以更好的方式完成嵌套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
,对于
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]