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

7 python loops do-while

在C中有一个聪明的技巧,让你通过转向避免金字塔式代码:

if (check1())
  if (check2())
    if (check3())
      do_something();
Run Code Online (Sandbox Code Playgroud)

成:

do {
  if (!check1())
    break;

  if (!check2())
    break;

  if (!check3())
    break;

  do_something();
} while (0);
Run Code Online (Sandbox Code Playgroud)

在Python中没有do-while构造的最简洁的方法是什么?

注意:我不一定要求在Python中实现do-while循环的方法,而是一种避免上述金字塔样式代码的技术.

更新:似乎有一些混乱.我使用循环的唯一原因是能够在身体的任何一点突破,这应该只执行一次.

基本上我在Python中做的是这样的:

while True:
    if not check1():
        break

    if not check2():
        break

    if not check3():
        break

    do_domething()
    break
Run Code Online (Sandbox Code Playgroud)

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

Blu*_*eft 7

Pythonic的写作方式是

if check1() and check2() and check3():
    do_something()
Run Code Online (Sandbox Code Playgroud)

在Python中,我们强调代码的清晰性和简单性,而不是使用聪明的编程技巧.


[编辑] 如果您需要"创建变量并在第一次检查中使用它",那么您将使用金字塔样式:

if check1():
    #variables and stuff here
    if check2():
        #variables and stuff here
        if check3():
            doSomething()
Run Code Online (Sandbox Code Playgroud)

或者,正如@Blender建议的那样,将其重构为一个单独的方法.与使用不打算循环的循环相比,这些都是更简单,更清晰的方式来传达您的意图.

  • @jxh:如果你不希望维护你的代码,当然,做你想做的事.当Brandon发布原始C代码时,几乎所有人都误解了它.无论您的语言如何,这都不是良好代码的标志. (2认同)

Ble*_*der 5

颠倒你的条件,尽早爆发.如果你很好地构建你的代码,你首先不必担心if楼梯:

def do_bigger_something():
    if not check1():
        return

    if not check2():
        return

    if not check3():
        return

    do_something()
Run Code Online (Sandbox Code Playgroud)

很有可能如果你的代码的一部分做了很多这些检查,那么它应该变成一个函数.


jxh*_*jxh -2

在 C 中,do ... while(0)当 C 程序员想要行为类似于 a 的东西时,通常会使用您所展示的构造goto,但使用实际的东西goto是不可能的(由于各种原因)。所以,breakout of thedo ... 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()
Run Code Online (Sandbox Code Playgroud)

C 构造的最直接翻译可能do ... while(0)是具有单次迭代的循环。不要这样做。

for x in range(1):
    if not check1():
        break
    if not check2():
        break
    if not check3():
        break
    do_something()
Run Code Online (Sandbox Code Playgroud)