当前位置: 首页 > 后端技术 > Java

为什么Python不设计do-while循环结构?

时间:2023-04-02 00:26:42 Java

在一些编程语言中,如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:while:这不是简单的从其他语言翻译成Python,它保留了while语句后的Python缩进用法,不会造成直译的突兀。添加while循环本身已经支持的可选else子句,所以while的完整语法结构如下:while_stmt:["do"":"suite]"while"expression":"suite["else"":"suite](PS。在本系列的下一篇文章中,我们将解释为什么Python支持while-else语法)也就是说,在保持原有while循环语法不变的情况下,PEP-315提出支持while前面可选的do子句。do子句只会执行一次,当其中出现break时,会跳出整个do-while循环;当do子句中出现continue时,会跳出do子句,进入while的条件判断。有了do子句,就很容易实现do{...}while(0)的跳转控制效果。然而,这个PEP遭到了一些核心开发者的反对。反对意见是,在不引入新的关键字和语法的情况下,使用现有语法也可以很好地实现相同的功能:whileTrue:ifnot:breakinPythonFatherGuidovanRossum也反对.他的原话是:请拒绝PEP。沿这些思路的更多变体不会使语言更优雅或更容易学习。他们只会让一些草率的人省去一些打字,同时让其他必须阅读/维护他们的代码的人想知道这意味着什么。简单翻译一下,这种do-while语法并没有让Python更加优雅易用,反而给阅读/维护代码造成了理解负担。就我个人而言,我也不赞成引入PEP-315的可选do-while语法,尽管它比固定形式的do-while结构更加灵活和优雅。最后总结一下,do-while作为一种常见的循环结构,已经在其他语言中使用了。它甚至开发了do{...}while(0)的典型用法,但是do-while可以解决的几个问题要么是Python中不存在的(宏定义,汇编指令),要么已经有更合适和低成本的实现(跳跃控制)。看完这篇文章,你还有什么要补充的吗?欢迎交流讨论。如果你对Python语言设计相关的话题感兴趣,欢迎订阅Github上的《Python为什么》系列文章(https://github.com/chinesehua...)相关阅读:为什么Python有一个奇怪的“..。“目的?为什么Python函数默认返回None?为什么Python之父不喜欢lambda匿名函数?为什么从Python的内置类型继承是一个问题?!为什么Python推荐蛇形命名法?