当前位置: 首页 > 科技观察

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

时间:2023-03-16 23:36:13 科技观察

在一些编程语言中,如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: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:breakGuidovanRossum,之父Python他也不同意,他的原话是:Guido'sreplyPleaserejectthePEP。沿这些思路的更多变体不会使语言更优雅或更容易学习。他们只会让一些草率的人省去一些打字的时间,同时让其他必须阅读/维护他们的代码的人想知道这意味着什么。简单翻译一下,这种do-while语法并没有让Python更加优雅易用,反而给阅读/维护代码造成了理解负担。就我个人而言,我也不赞成引入PEP-315的可选do-while语法,尽管它比固定形式的do-while结构更加灵活和优雅。最后总结一下,do-while作为一种常见的循环结构,已经在其他语言中使用了。它甚至开发了do{...}while(0)的典型用法,但是do-while可以解决的几个问题要么是Python中不存在的(宏定义,汇编指令),要么已经有更合适和低成本的实现(跳跃控制)。看完这篇文章,你还有什么补充内容吗?作者简介▽猫下豌豆花,广东人,毕业于武汉大学,现为苏飘程序员。他有一些极客思维和人文情怀。有的温度,有的态度。本文转载自微信公众号“蟒猫”,可通过以下二维码关注。转载本文请联系Python猫公众号。