如何在Python中编写C的do-while(0)?

时间:2013-07-19 18:25:08

标签: python loops do-while

在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

我只是想知道是否有更清洁的方式。

8 个答案:

答案 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()