首页 » Web前端 » phpdowhilefalse技巧_Python 为什么不设计 dowhile 轮回结构

phpdowhilefalse技巧_Python 为什么不设计 dowhile 轮回结构

访客 2024-11-23 0

扫一扫用手机浏览

文章目录 [+]

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

流程图如下(Java 示例):

phpdowhilefalse技巧_Python 为什么不设计 dowhile 轮回结构

// 打印小于 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”并不是一个有效的关键字。

phpdowhilefalse技巧_Python 为什么不设计 dowhile 轮回结构
(图片来自网络侵删)

那么,为什么 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 { // 实行步骤 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 语法支持:

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 也持反对见地,他的原话是:

Guido的回答

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 措辞设计干系的话题感兴趣,欢迎订阅 Github 上的《Python为什么》系列文章(https://github.com/chinesehuazhou/python-whydo)

关联阅读:

Python 为什么会有个奇怪的“...”工具?

Python 函数为什么会默认返回 None?

Python 之父为什么嫌弃 lambda 匿名函数?

为什么继续 Python 内置类型会出问题?!

Python 为什么推举蛇形命名法?

标签:

相关文章

网站SEO优化关键词布局的艺术与步骤

网站SEO优化已成为企业获取流量、提升品牌知名度的重要手段。关键词布局作为SEO优化的核心环节,其重要性不言而喻。本文将深入探讨关...

Web前端 2025-04-09 阅读1 评论0

网站编辑与SEO协同发展的密不可分关系

网站编辑和SEO(搜索引擎优化)这两个职业逐渐成为互联网行业的热门话题。许多人认为,网站编辑和SEO是两个独立的领域,但实际上,它...

Web前端 2025-04-09 阅读1 评论0