在C中有一个聪明的技巧,可以通过转动来避免金字塔式代码:
if (check1())
if (check2())
if (check3())
do_something();
成:
do {
if (!check1())
break;
if (!check2())
break;
if (!check3())
break;
do_something();
} while (0);
在Python中没有do-while构造的最简洁的方法是什么?
注意:我不一定要求在Python中实现do-while循环的方法,而是一种避免上述金字塔式代码的技术。
更新:似乎有些混乱。我使用循环的唯一原因是能够在身体的任何一点突破,这只能被执行一次。
基本上我在Python中所做的是:
while True:
if not check1():
break
if not check2():
break
if not check3():
break
do_domething()
break
我只是想知道是否有更清洁的方式。
答案 0 :(得分:7)
Pythonic的写作方式是
if check1() and check2() and check3():
do_something()
在Python中,我们强调代码的清晰度和简洁性,而不是使用聪明的编程技巧。
[编辑] 如果您需要“创建变量并在第一次检查中使用它”,那么您将使用金字塔式:
if check1():
#variables and stuff here
if check2():
#variables and stuff here
if check3():
doSomething()
或者,正如@Blender建议的那样,将它重构为一个单独的方法。与使用不打算循环的循环相比,这些都是更简单,更清晰的沟通方式。
答案 1 :(得分:5)
反转你的条件并尽早爆发。如果你很好地构建了代码,那么首先你不必担心if
个阶梯:
def do_bigger_something():
if not check1():
return
if not check2():
return
if not check3():
return
do_something()
如果你的代码的一部分做了很多这样的检查,很有可能它应该变成一个函数。
答案 2 :(得分:2)
if (check1() and check2() and check3()):
do_something()
答案 3 :(得分:1)
if check1() and check2() and check3():
do_something()
答案 4 :(得分:1)
我会说这些检查不是那么简单(可以使用简单的and
完成),重构代码并将其分解为函数而不是错误地使用循环这不是意思;
def doSomethingIfConditions():
if not check1():
return
if not check2():
return
if not check3():
return
doSomething()
...your code...
doSomethingOnConditions()
...your code...
答案 5 :(得分:0)
解决方案#1(直截了当):
while True:
if not check1():
break
if not check2():
break
if not check3():
break
do_something()
break
解决方案#2(更多pythonic):
for check in check1, check2, check3:
if not check():
break
else:
# the else part is only executed
# if we didn't break out the loop
do_something()
解决方案#3(更加pythonic):
if all(c() for c in check1,check2, check3):
# all(seq) will stop at the first false result
do_something()
答案 6 :(得分:0)
我不认为需要一个循环......无论如何你最终会突破它。
if all((check1(), check2(), check3())):
print "Do something"
如果需要,可以选择块式。
答案 7 :(得分:-3)
在C中,当C程序员想要的行为类似于do ... while(0)
,但使用实际的goto
时,通常会使用您显示的goto
构造。问题(出于各种原因)。因此,break
中的do ... while(0)
实际上是一种黑客行为。在Python中使用相同的习惯用法将使黑客行为永久化。
在C中,我通常会避免使用do ... while(0)
的这种特殊用法,而是选择检查功能。在Python中,这将是:
def do_checks():
if not check1():
return False
if not check2():
return False
if not check3():
return False
return True
if do_checks():
do_something()
C do ... while(0)
构造的最直接翻译可能是一次循环,只需一次迭代。 不要这样做。
for x in range(1):
if not check1():
break
if not check2():
break
if not check3():
break
do_something()