返回顶部
首页 > 资讯 > 后端开发 > Python >Python中不支持 switch 语句的原因是什么
  • 108
分享到

Python中不支持 switch 语句的原因是什么

2023-06-16 03:06:22 108人浏览 泡泡鱼

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

摘要

这期内容当中小编将会给大家带来有关python中不支持 switch 语句的原因是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、switch 是什么?switch 的语法格式如下:switch(e

这期内容当中小编将会给大家带来有关python中不支持 switch 语句的原因是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1、switch 是什么?

switch 的语法格式如下:

switch(expression){     case value1:        // 语句        break; // 可选     case value2:        // 语句        break; // 可选     default: // 可选        // 语句 }

使用流程图来表示,大概是这样的:

Python中不支持 switch 语句的原因是什么

它的用法不难理解:switch 语句的值满足哪一个 case 情况,就会执行对应的代码块,执行时遇到 break 就跳出,否则就继续执行下一个 case  分支;一般会在最后放一个 default 分支,作为兜底。

大多数语言都提供了 switch 语句或者极其相似的东西,例如,在 C/C++/Java /Go 等静态语言中,它们都支持 switch-case  结构;在 Ruby 中有类似的 case-when 结构,在 shell 语言中,有相似的 case-in 结构,在 Perl 中,有  switch-case-else……

switch 语句的好处是支持“单条件多分支”的选择结构,相比 if-else 的二分选择结构,在某些时候会更为简洁清晰。

但是,在 Python 中,我们看不到 switch-case 或者相近的语法结构,这是为什么呢?

2、Python 为什么不支持 switch?

官方文档中有一篇 FAQ 包含了这个问题:Why isn’t there a switch or case  statement in Python?

Python中不支持 switch 语句的原因是什么

FAQ 即 Frequently Asked Questions 的缩写,表示常见问题,官方列了 27  个常见问题,完整清单在此:https://mp.weixin.qq.com/s/zabIvt4dfu_rf7SmGZXqXg

该文档给出了几个建议,告诉了我们几个 switch/case 的替代方案:

  • 使用 if-elif-else 条件判断语句

  • 使用字典,将 case 值与调用的函数映射起来

  • 使用内置 getattr() 检索特定的对象调用方法

曾有人提出过一些提案(即 PEP-275 和 PEP-3103),想给 Python 引入 switch  语法,然而,对于“是否以及如何进行靶场测试”,大家没有达成一致的共识。

靶场测试,即 range test,指的是对武器弹药的技术性能作各种测试验证,与药物的临床试验一样,都是在最终产品交付前的一项关键性测试。

官方文档对于“为什么 Python 不引入 switch”的解释,实际上来源于 Python 之父 Guido van Rossum 在 PEP-3103  中的意见:

Python中不支持 switch 语句的原因是什么

出处:Https://www.python.org/dev/peps/pep-3103

A quick poll during my keynote presentation at PyCon 2007 shows this proposal  has no popular support. I therefore reject it.

我在 PyCon 2007 的主题演讲中做了一个快速的民意调查,结果表明这个提案没有得到广泛的支持。因此,我拒绝了它。

简而言之,PEP 提案有了,语法实现也有了雏形,但是核心开发者们似乎没有达成一致意见,最终导致提案流产了。

3、PEP-275 与 PEP-3103 说了什么?

PEP-3103 是在 2006 年提出的,PEP-275 则是在 2001  年提出的,它们的共同之处是提出了引入 switch 语句的某种必要性、分析了好几种备选的实现方案,然而,结局是都被拒绝了。

Python中不支持 switch 语句的原因是什么

出处:https://www.python.org/dev/peps/pep-0275

那么,我们就先来回顾一下核心开发者们都做出了哪些讨论,看一看如果 Python 要实现 switch 结构,会是怎么样子的?(PS:PEP  里还涉及其它内容,本文只摘取与 switch 直接相关的部分)

PEP-275 提出的语法结构如下:

switch EXPR:     case CONSTANT:         SUITE     case CONSTANT:         SUITE     ...     else:         SUITE

其中 else 分支是可选的,如果没有它,并且前面的分支都不满足的话,就什么也不做。另外 case 值 constant 支持不同类型,因为 expr  表达式的类型是动态的。

PEP-275 还提出让 switch 不支持掉落(fall-through)行为,即每个 case 分支相互独立而完整,不用像 C 语言那样需要写  break。

该 PEP 还列举了一些其它的 issue:

  • 重用现有关键字,不引入“switch”和“case”

  • 使用新的关键字,避免与 C 的 switch 概念混淆

  • 支持单分支多值选择(例如:case 'a', 'b', 'c': …)

  • 还有建议支持范围取值判断(例如:case 10..14: …)

除了首选方案,该 PEP 还记录了几种风格各异的语法方案:

case EXPR:     of CONSTANT:         SUITE     of CONSTANT:         SUITE     else:         SUITE  case EXPR:     if CONSTANT:          SUITE     if CONSTANT:         SUITE     else:         SUITE  when EXPR:     in CONSTANT_TUPLE:         SUITE     in CONSTANT_TUPLE:         SUITE     ... else:      SUITE

PEP-275 记录下了不少重要的思路和问题,为 PEP-3103 的出现做了很好的铺垫。

那么,我们再来看看由 Guido 编写的 PEP-3103 说了些什么吧。

它首先认可了 PEP-275 中的两个基础设定,例如,实现“隐式的 break”,不让 case 分支出现 fall-through  这种转移控制权的情况(其它语言似乎都要求显式地写 break);else 分支是可选的,复用 else 关键字,而不用引入“default”。

对于 PEP-275 提倡的那种风格,Guido 比较认可,但也认为它的问题是缩进层次太多,因此建议减少代码分支缩进的空格数,例如本来缩进 4  空格,改为缩进 2 空格。

PEP-3103 还列举了另外三种实现方案,分析了它们的差异以及问题,具体内容从略,这里只给大家看看它们的风格:

# case 分支不缩进 switch EXPR: case EXPR:     SUITE case EXPR:     SUITE .... else:     SUITE  # switch 语句后不加冒号 switch EXPR case EXPR:     SUITE case EXPR:     SUITE .... else:     SUITE  # 省略 case 关键字 switch EXPR:     EXPR:         SUITE     EXPR:         SUITE     ...     else:         SUITE

在基础语法之外,Guido 花了很多篇幅来讨论扩展语法(Extended Syntax),即在一个 case 分支中实现匹配多个值的复杂情况:

case EXPR, EXPR, ...:  # Guido 优选的 case in EXPR_LIST:  case *EXPR:  case [*]EXPR, [*]EXPR, ...:  case *(EXPR, EXPR, ...):

他重点考虑到的问题包括:switch 中表达式的结果是元组或可迭代对象的情况、case 的值被看成元组解包的情况、在 case  分支作“*”星号操作……

接着,Guido 又用了非常非常多的篇幅来分析该如何实现 switch,其中讨论到的主要思路有:

  • 使用等价的 if-elif 链来定义 switch 语句(可能会做些优化)

  • 同上,另外所有表达式都必须是可哈希的(hashable)

  • 看作是预先计算的字典的分派(dispatch)

PEP 中这部分的内容非常多,因为在每个思路上,Guido 还考虑到了好几种实现路径,这导致了他在复杂分析后的结论是:It is too early to  decide( 现在做决定为时尚早)。

阅读完 PEP-3103 后,我总体的感觉是:Guido 的思路非常发散、层次丰富,但是,缺少了他在面对其它问题时那“快刀斩乱麻”式的洞察力。

也就是说,在诸多的可能性方案中,他力求面面俱到,最终无法说服自己做出一个独裁的决定。阻力主要来自于他自己,而不是其他人。

不过,之所以会出现这种情况,也许跟他的预设立场有关:他似乎认为“Python is fine without a switch  statement”,因此尽管写了很长的 PEP,但只是在把问题复杂化,把议题搁置起来。

最后,他在 PyCon 上做了一个小范围调查,借此“名正言顺”地拒绝了自己发起的 PEP,试图堵住众人的悠悠之口……

4、未来会有 switch 语句么?

归结起来,之所以 Python 没有 switch 语句,原因有:switch 的实现细节/功能点未经敲定、没有  switch 也挺好的、有其它不错的方法替代 switch、Guido 的小任性……

但是,我们还是要追问一句:未来会有 switch 语句么?或者类似的多分支选择结构?

为什么要有此一问呢?原因是有太多语言自带 switch 语句,而且也有很多人尝试编写提供 switch 功能的库(我记得在 PyCoder's  Weekly 里曾见到过两次)。

我(Python猫)本人自始至终并不喜欢 switch,几乎可以肯定地说,Python 未来也不会有 switch,但是,它很可能会引入一个类似于  switch 且更为复杂的语法结构!

2020 年 6 月,PEP-622 被提出了,它建议引入在 Scala、Erlang 和 Rust 等语言中的模式匹配语法(pattern  matching)。

Python中不支持 switch 语句的原因是什么

截至 2020 年 10 月,该 PEP 已被分解成另外三个  PEP(634-636),目前都处于草案阶段。考虑到核心开发者们的参与情况以及话题讨论的情况,这些提案极有可能会在未来版本(比如正在开发中的  3.10)中实现。

以一个求平均数的函数为例,模式匹配语法可以实现成这样:

def average(*args):     match args:         case [x, y]:           # captures the two elements of a sequence             return (x + y) / 2         case [x]:              # captures the only element of a sequence             return x         case []:             return 0         case x:                # captures the entire sequence             return sum(x) / len(x)

上述就是小编为大家分享的Python中不支持 switch 语句的原因是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网Python频道。

--结束END--

本文标题: Python中不支持 switch 语句的原因是什么

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

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

猜你喜欢
  • Python中不支持 switch 语句的原因是什么
    这期内容当中小编将会给大家带来有关Python中不支持 switch 语句的原因是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、switch 是什么switch 的语法格式如下:switch(ex...
    99+
    2023-06-16
  • Python为什么不支持switch语句
    一、简洁性和可读性 Python的设计哲学之一是代码的简洁性和可读性。引入”switch”语句可能会增加语言的复杂性,并且可以用其他方式更清晰地表达相同的逻辑。Python鼓励使用”if-elif-else”语句来处理多个条件情况,这种方式...
    99+
    2023-10-29
    不支持 语句 Python
  • Java不支持多继承的原因是什么
    这篇文章主要介绍“Java不支持多继承的原因是什么”,在日常操作中,相信很多人在Java不支持多继承的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java不支持多继承的原因是什么”的疑惑有所帮助!...
    99+
    2023-07-05
  • php中switch语句的工作原理是什么
    这篇文章主要介绍“php中switch语句的工作原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php中switch语句的工作原理是什么”文章能帮助大家解决问题。php中switch语句用于...
    99+
    2023-06-26
  • 为什么微软不支持php8背后的原因是什么?
    微软不支持php8的背后原因是什么? 随着PHP 8的发布,许多开发者对于微软不支持这个最新版本的PHP表达了惊讶和疑惑。作为一家技术巨头,微软一直以来都在支持并积极推动开发者生态系统的发展,为什么会选择不支持PHP 8呢? 首...
    99+
    2024-01-26
    微软 PHP 不支持
  • java中switch语句的作用是什么
    java中switch语句的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应...
    99+
    2023-06-14
  • js中switch语句的特性是什么
    这篇文章主要介绍“js中switch语句的特性是什么”,在日常操作中,相信很多人在js中switch语句的特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中switch语句的特性是什么”的疑惑有所...
    99+
    2023-06-20
  • 聊聊Java的switch为什么不支持long
    目录Java为什么不浪(long)疑问分析编程思想汇总switch能否作用于Long,string上Java为什么不浪(long) 学而时习之不亦说乎,继续温习Java。 今天使用s...
    99+
    2024-04-02
  • PHP switch语句中不使用break的情况是什么
    这篇文章主要讲解了“PHP switch语句中不使用break的情况是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP switch语句中不使用break的情况是什么”吧!为什么不使...
    99+
    2023-07-05
  • php中switch语句是什么意思
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php中switch语句是什么意思?switch 语句用于基于不同条件执行不同动作。Switch 语句如果您希望有选择地执行若干代码块之一,请使用 Switch 语句。使...
    99+
    2018-12-19
    php switch
  • js的switch语句用法是什么
    switch语句是一种在多个条件下执行不同代码块的控制流语句。它的基本用法如下:```javascriptswitch (expre...
    99+
    2023-09-15
    js
  • JavaScript Switch语句的用法是什么
    JavaScript Switch语句用于在多个选项中选择一个执行的代码块。它根据表达式的值,在多个case中选择匹配的一个,并执行...
    99+
    2023-10-11
    JavaScript
  • PHP Switch语句的用法是什么
    PHP的Switch语句是一种选择结构,用于根据不同的条件执行不同的代码块。语法如下:```switch (expression) ...
    99+
    2023-10-12
    PHP
  • 为什么Python不支持i ++语法
    本篇内容介绍了“为什么Python不支持i ++语法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正常情况下,当有人问起++原因而不是Pyt...
    99+
    2023-06-16
  • java中switch语句的执行过程是什么
    今天就跟大家聊聊有关java中switch语句的执行过程是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编...
    99+
    2023-06-14
  • java中switch和if语句的区别是什么
    这期内容当中小编将会给大家带来有关java中switch和if语句的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程...
    99+
    2023-06-14
  • C++中Switch语句的优化措施是什么
    这篇文章主要介绍“C++中Switch语句的优化措施是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中Switch语句的优化措施是什么”文章能帮助大家解决问题。流程控制语句是C语言中最基本...
    99+
    2023-06-29
  • js中的switch语句有什么用
    本篇内容主要讲解“js中的switch语句有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js中的switch语句有什么用”吧!说明switch语句是一种与if语句密切相关的流控制语句,用...
    99+
    2023-06-20
  • java switch语句的执行过程是什么
    这篇文章主要介绍“java switch语句的执行过程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java switch语句的执行过程是什么”文章能帮助大家解决问题。1、语法switch(常...
    99+
    2023-06-30
  • MySQL慢SQL语句常见原因是什么
    这篇文章主要为大家展示了“MySQL慢SQL语句常见原因是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL慢SQL语句常见原因是什么”这篇文章吧。1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作