2017-02-01 134 views
1

嵌套if else可以如何以更好的方式完成? 我希望尽量减少重复代码为print "run dozer()"更好的嵌套if else方法

print "some mechanical stuffs before this" 
if a == 1: 
    if b == 2: 
     print "run car()" 
    else: 
     print "run dozer()" 
else: 
    print "run dozer()" 
print "more mechanical stuffs after this" 
+0

看起来不错,有什么问题呢? – MSeifert

+0

@MSeifert:在“运行推土机()”的情况下有一小部分代码重复。人们可以优化这一点。但的确,这不是一个真正的问题。 –

+0

哦,我没有发现代码重复。这应该在问题中提到:) – MSeifert

回答

0

出现两次是"run dozer()",所以我们可以在哪里,这是印刷的情况下,做分析的唯一的代码片段:这种情况如果任a != 1b != 2。在另一种情况下,它打印"run car()"。所以:

if a != 1 or b != 2: 
    print "run dozer()" 
else: 
    print "run car()" 
+0

不明白反转逻辑的意思 – wim

+0

@wim:分析“通用代码路径”是什么。由于''运行推土机''是唯一代码重复的代码片段,因此我对此进行了分析。并且条件是,当'a!= 1或b!= 2'时,这是成立的。 –

5
if a == 1 and b == 2: 
    print "run car()" 
else: 
    print "run dozer()" 
1

这也许不是在这种情况下是一个好主意,但是你可以只通过所有(预期)的情况下运行的代码(0代表一事─1a和不可─2b) :

for a in (0, 1): 
    for b in (0, 2): 
     print('a = ', a, ', b = ', b, sep='') 

     if a == 1: 
      if b == 2: 
       print("run car()") 
      else: 
       print("run dozer()") 
     else: 
      print("run dozer()") 

这给你的所有组合的列表:

a = 0, b = 0 
run dozer() 
a = 0, b = 2 
run dozer() 
a = 1, b = 0 
run dozer() 
a = 1, b = 2 
run car() 

这会给你一个应该触发run cara=1, b=2的组合列表。一个解决办法是使用元组比较:

if (a, b) == (1, 2): 
    print('run car') 
else: 
    print('run dozer') 

在这种情况下,这是很微不足道,但这种做法可能是比较复杂的,更深层次的嵌套if S,更多的变量,更多的情况下相当senseable(或如果你只是想好奇:-))

1

,你可以写在一行相同的逻辑:

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)] 

(此答案由TemporalWolf的评论启发)


为了为了进一步减少代码,你可以做字符串格式为:

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(大Observationist),因为a=1b=2另一个注解;这可以放在单个布尔条件内:0<a<b<3。因此,该代码可进一步降低至39字节

print'run %sr()'%('doze','ca')[0<a<b<3] 
+1

代码高尔夫版本:'print“run”+(“doze”,“ca”)[(a,b)==(1,2)] +“r()”'*请勿这样做* – TemporalWolf

+1

@TemporalWolf更新版的答案稍微好一些; –

+2

如果a&b是ints:'print'运行%sr()“%(”doze“,”ca“)[0 TemporalWolf