在一些编程语言中,如C/C++、C#、PHP、Java、JavaScript等,do-while是一种基本的循环结构。它的核心语义是:先执行循环体的代码,然后执行一次条件语句,如果判断条件语句为真,则继续执行循环体的代码,再次执行条件语句;直到判断条件语句为假,则跳出循环结构。流程图如下(Java示例)://打印小于20的数字publicclassTest{publicstaticvoidmain(String[]args){intx=10;做{System.out.print("x的值:"+x);x++;System.out.print("\n");}while(x<20);}}Python不支持do-while结构,并且“do”不是有效的关键字。那么为什么Python不提供这种句法构造,这种现状背后的设计考虑是什么?在回答这个问题之前,我们再想想do-while语法能解决什么问题,看看使用这种结构能获得什么好处?最明显的好处是do-while语法保证循环体代码将首先执行。它可能在很多场景下用不到,但它不同于普通while循环或for循环语法的“前置条件”思想。它体现了一种“后置条件”的编程逻辑,也是一种通用的控制循环。方式。他们的关系好像有点像C/C++语言中i++和++i操作的区别。在一些特殊的场合,它可能会更有效率。除了这个特性,这个结构体最大的应用场景其实就是C/C++中do{...}while(0)的特殊用法。这可以在许多开源项目的源代码中找到,例如Linux、Redis和CPython解释器等。这里的数字0代表布尔值False,表示循环只会执行一次,然后跳出。这种写法很奇怪吗?所谓“循环”,一般是指程序体重复执行多次,而do{...}while(0)只需要执行一次,乍一看有点多余。这种写法主要用在宏函数的定义上,可以解决编译宏代码块的问题,使代码按照我们的意图合理的分成块。另外do{...}while(0)结合break也可以达到非常优雅的跳转控制效果。在下面的示例中,步骤1、4和5是必需的,而步骤2取决于步骤1的结果,步骤3取决于步骤2的结果。do{//执行步骤1if(条件1失败){休息;}//执行步骤2if(condition2fails){break;}//执行步骤3if(condition3fails){break;}}while(0);//执行第4步//执行第5步在这个场景下,我们真的只需要按顺序执行一次即可。do-while的结构非常清晰,避免了嵌套多级条件或者设置很多额外标志的情况。最后,还有一点。在汇编层面,do-while比while更接近汇编语言的逻辑,可以节省指令。在过去的低内存时代,可以算是一种优化的写法。分析完do-while的好处,我们回到正题:为什么Python不需要设计do-while循环语法?首先,Python离底层应用程序编程太远,不需要考虑汇编指令的优化,同时也不涉及宏的使用。至于“条件介词”和“条件后置”的区别,其实影响不大。而且,由于Python使用简洁优雅的缩进和冒号语法来划分代码块,所以do-while语法的直译看起来会很怪异(注意直译condition后没有其他内容):do:passwhileFalse如果要引入新的语法特征,就必须遵守既定的文体习惯。其他语言的do-while结构如果直接翻译成Python肯定是不合适的。事实上,在2003年,有一个PEP提议为Python添加do-while语法支持:PEP-315EnhancedWhileLoopPEP提议添加一个可选的do子句来支持while循环的扩展,如下所示:do:
