在一些编程语言中,如C/C++、C#、PHP、Java、JavaScript等,do-while是一种基本的循环结构。它的核心语义是:先执行循环体的代码,再执行一次条件语句。如果判断条件语句为真,则继续执行循环体的代码,再次执行条件语句;直到判断条件语句为假,则跳出循环结构。流程图如下(Java示例)://打印小于20的数字publicclassTest{publicstaticvoidmain(String[]args){intx=10;do{System.out.print("valueofx:"+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失败){break;}//执行步骤2if(条件2失败){break;}//执行步骤3if(条件3失败){break;}}while(0);//Executestep4//Executestep5在这个场景下,我们真的只需要按顺序执行一次即可。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:
