返回顶部
首页 > 资讯 > 后端开发 > Python >Python不设计do-while 循环结构的理由有哪些
  • 699
分享到

Python不设计do-while 循环结构的理由有哪些

2023-06-28 11:06:19 699人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍了python不设计do-while 循环结构的理由有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在某些编程语言中,例如 C/C++、C#、P

这篇文章主要介绍了python不设计do-while 循环结构的理由有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

在某些编程语言中,例如 C/C++C#PHP、Java、javascript 等等,do-while 是一种基本的循环结构。

它的核心语义是:先执行一遍循环体代码,然后执行一遍条件语句,若条件语句判断为真,则继续执行循环体代码,并再次执行条件语句;直到条件语句判断为假,则跳出循环结构。

流程图如下(Java 示例):

Python不设计do-while 循环结构的理由有哪些

// 打印小于 20 的数字public class Test {   public static void main(String[] args){      int x = 10;      do {         System.out.print("value of 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) 用法。这在很多开源项目源码中都能找到踪迹,例如 linuxRedis 以及 CPython 解释器,等等。

这里面的数字 0 表示布尔值 False,意味着循环只会执行一遍,然后就跳出。

这样的写法是不是很诡异?所谓“循环”,一般就意味着程序体会被反复执行多次,但是,do {...} while (0) 却偏偏只需要它执行一遍,这初看起来是有点多余啊。

这种写法主要用在宏函数的定义中,可以解决宏代码块的编译问题,使代码按照我们的意图而合理分块。

另外,do {...} while (0) 结合 break 使用,还可以实现很优雅的跳转控制效果。

在下面的示例中,步骤 1、4 和 5 要求必须执行,而步骤 2 取决于步骤 1 的执行结果,步骤 3 则取决于步骤 2 的执行结果。

do {  // 执行步骤 1   if (条件1失败) {    break;  }  // 执行步骤 2   if (条件2失败) {    break;  }  // 执行步骤 3   if (条件3失败) {    break;  }} while(0);// 执行步骤 4// 执行步骤 5

在这种场景中,我们确实只需要按照顺序执行一遍。do-while 结构很清晰,避免造成多层条件嵌套或者设置诸多额外标记的局面。

最后还有一点,在汇编层面,do-while 比 while 更接近汇编语言的逻辑,可以节省使用指令,在过去的低内存时代,算得上是一种优化写法。

分析完 do-while 的好处后,让我们回到主题:Python 为什么不需要设计 do-while 循环语法呢?

首先,Python 离底层应用编程太远了,就不用考虑汇编指令的优化了,同时,它也不涉及宏的使用。

至于“条件前置”和“条件后置”的区别,其实并没有太大影响,而且,由于 Python 使用简洁优雅的缩进加冒号语法来划分代码块,导致直译过来的 do-while 语法看起来会很怪异(注意,直译的 while 的条件后没有其它内容):

do:    passwhile False

想要引入新的语法特性,必然要遵守既定的风格习惯。其它语言的 do-while 结构直译成 Python 的话,肯定不合适。

事实上,在 2003 年时,有一个 PEP 提议给 Python 加上 do-while 语法支持:

Python不设计do-while 循环结构的理由有哪些

PEP-315 Enhanced While Loop

该 PEP 提议增加一个可选的 do 子句,支持将 while 循环扩展成这样子:

do:    <setup code>while <condition>:    <loop body>

这不是简单地从其它语言翻译成 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 遭到了一些核心开发者的反对。

反对的理由是,不需要引入新的关键字和语法,仅使用现有语法就能很好地实现同样的功能:

while True:    <setup code>    if not <condition>:        break    <loop body>

Python 之父 Guido van Rossum 也持反对意见,他的原话是:

Python不设计do-while 循环结构的理由有哪些

Please reject the PEP. More variations along these lines won't make the
language more elegant or easier to learn. They'd just save a few hasty
folks some typing while making others who have to read/maintain their code wonder what it means.

简单翻译一下,这种 do-while 语法并不会使 Python 更优雅好用,反而会产生阅读/维护代码的理解负担。

就个人的感觉而言,我也不赞成引入 PEP-315 那种可选的 do-while 语法,虽然它比固定形式的 do-while 结构更为灵活和优雅一点。

最后稍微总结一下,do-while 作为一种常见的循环结构,在其它语言中有所发挥,它甚至还发展出了 do {...} while (0) 的典型用法,但是,do-while 能够解决的几个问题要么在 Python 中并不存在(宏定义、汇编指令),要么就是已经有更为合适而低成本的实现(跳转控制)。

感谢你能够认真阅读完这篇文章,希望小编分享的“Python不设计do-while 循环结构的理由有哪些”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网Python频道,更多相关知识等着你来学习!

--结束END--

本文标题: Python不设计do-while 循环结构的理由有哪些

本文链接: https://lsjlt.com/news/318705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python不设计do-while 循环结构的理由有哪些
    这篇文章主要介绍了Python不设计do-while 循环结构的理由有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在某些编程语言中,例如 C/C++、C#、P...
    99+
    2023-06-28
  • Python 不设计 do-while 循环结构的理由
    在某些编程语言中,例如 C/C++、C#、PHP、Java、JavaScript 等等,do-while 是一种基本的循环结构。 它的核心语义是:先执行一遍循环体代码,然后执行一遍条...
    99+
    2024-04-02
  • python有哪些循环结构
    python中的循环结构有以下几种for…in…循环for…in…循环可以对元组、列表、字符串进行循环,只要可以遍历、可循环的的内容均可作为循环体存在。for…in…循环语法:for 参数 in 循环体:passwhile循环while循环...
    99+
    2024-04-02
  • python循环结构有哪些
    本篇内容主要讲解“python循环结构有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python循环结构有哪些”吧!1、求两个数最大公约数num1 = int(inpu...
    99+
    2023-06-25
  • c语言for、while和do-while循环之间的区别有哪些
    这篇文章主要介绍c语言for、while和do-while循环之间的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!for,while,do-while区别循环结构初始化变量:for循环当中定义的初始化变量,...
    99+
    2023-06-26
  • python中有哪些常见的循环结构
    这篇文章将为大家详细讲解有关python中有哪些常见的循环结构,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pytho...
    99+
    2023-06-14
  • python中while循环的要素有哪些
    本篇文章给大家分享的是有关python中while循环的要素有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python有哪些常用库python常用的库:1.requesu...
    99+
    2023-06-14
  • python的while循环练习题有哪些
    这篇文章主要介绍“python的while循环练习题有哪些”,在日常操作中,相信很多人在python的while循环练习题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python的while循环练习题...
    99+
    2023-06-21
  • Python循环嵌套结构有哪些优缺点
    Python循环嵌套结构的优点包括:1. 可以通过嵌套循环实现复杂的迭代操作,使代码更加简洁和可读。2. 允许在循环中进行多层次的条...
    99+
    2023-09-13
    python
  • python不支持的数据结构有哪些
    python不支持char和byte类型的数据结构python中没有char和byte类型来保存单一字符或8比特整数,python中支持int、float、str、list、tuple、dict、set七种数据结构。...
    99+
    2024-04-02
  • sql设计表结构的常见问题有哪些
    这篇文章主要介绍sql设计表结构的常见问题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.sql改写遇到表字段经常要增加的业务怎么设计表结构?2.业务问题是什么?简单说就是有...
    99+
    2024-04-02
  • Python异常处理的关键词与结构有哪些
    这篇文章主要介绍“Python异常处理的关键词与结构有哪些”,在日常操作中,相信很多人在Python异常处理的关键词与结构有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python异常处理的关键词与结构...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作