Python 为什么如此设计?

news2024/12/24 20:40:38

大概两年半前,我萌生了要创作一个新的系列文章的想法,也就是“Python为什么”,试图对 Python 的语法及特性提出“为什么”式的问题,以此加深对它的理解,探寻使用技巧、发展演变、设计哲学等话题。

一直以来,我都是一个有着较强问题意识的充满着好奇心的人,擅长于识别出相似东西的差异,并从差异性上发现事物的独特意义。

于是,当将 Python 与其它编程语言作比较时,加上阅读及翻译了一些 PEP 从而积攒了一些素材后,我就得到了很多的小发现。当确认了国内外的技术社区里缺少这方面的文章后,我就更确信了这件事的独特价值。

我当时有个天真的想法,觉得可以按照“十万个为什么”的方式,写出源源不断的文章……

刚开始的 2020 年下半年,我创作力旺盛,写了约 20 篇“Python为什么”系列文章!然而,到了 2021 年,仅有 2 篇!再到 2022 年,也是仅仅 2 篇!!……

时间都去哪儿了?怎么我才稍稍微偷了个懒儿,它就不见了呢?本来计划有不少想写的话题的,怎么拖着拖着就忘了该怎么写了呢……

最近眼看到了年末,我越想越是有些不甘,于是,花了几天时间,好好梳理了下“Python为什么”系列文章,优化了 Github 的介绍内容,准备认真把这个系列重拾起来!

Github 项目主页

我把之前调查问卷里遗留的问题,以及其它计划要写的话题放在 Issues 跟踪,欢迎大家来提问题/给建议/指导写作/监督催更……

下面放出的是目前系列文章的介绍,恳请喜欢本系列的同学给颗 star 鼓励一下!(内容会不断更新/增长,请以 Github 主页为准。)

如果你在手机微信端阅读,由于链接跳转麻烦,建议你通过这个合集的链接进行阅读。

文章列表

  • Python 设计和历史的常见问题
    • Python 官方提供了约 30 个常见问题的 FAQ,你可以从中快速得到“权威”的解释
  • Python 为什么用 len() 函数,不用 x.len() 风格?
    • 介绍了《流畅的Python》及 Guido 的解释
    • 我本人认为这体现了 Python 对世界本质的洞察
    • 文章顺便回答了:为什么 Python 的索引从 0 开始计数?
  • Python 为什么使用缩进来划分代码块?
    • 这是个经典的问题,总会被提起,我总结了 8 个原因
    • 有不少人对上述 8 个原因并不买账,因此我补充了一个回复:Python 的缩进绝不是反人类的设计!
    • Guido 在一次采访中说:严格要求代码缩进确实有点夸张,改用花括号,也不是不可以
    • Python 的缩进起源于 ABC,而 ABC 的缩进起源于 60-70 年代的编程畅想
  • Python 为什么不用分号作语句终止符?
    • 分号一般有分隔符与终止符两种作用,但 Python 只用分号作为分隔符,却不用它作为终止符, 而是改用换行作为终止符。本文精炼总结了 5 个原因
  • Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
    • main 函数作为某些编程语言的执行入口是强制必要的,然而 Python 这门脚本语言有着自己更为灵活的执行方式
    • 在我的编程习惯中,我反感那些不假思索的if __name__ == '__main__' 写法,文中给出了我的编程建议
  • Python 为什么推荐蛇形命名法?
    • 编程语言中有好几种变量命名风格,最为流行的两种分别是驼峰命名法和蛇形命名法。本文从编程语言的历史发展过程和语言内部的使用习惯角度,解释了为什么 Python 更偏好于蛇形命名法
  • Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
    • 有过 C/C++/Java 等语言的编程经验的开发者会疑惑,为什么 Python 中没有 i++ 这样的语法
    • 这个问题反映出 Python 中的数字对象跟其它语言中的数字有着根本性的差异;另外,Python 的可迭代对象特性,也深刻影响着语言的诸多设计方面
  • Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
    • 很多人以为“a,b=b,a”(交换变量操作)跟“a,b=1,2”(多变量赋值)一样,都是基于元组解包的特性,然而 CPython 的实现并非如此
    • CPython 使用专门的优化指令(即 ROT_TWO、ROT_THREE 和 ROT_FOUR)实现栈顶元素的快捷交换
    • 当同时交换的元素数量大于 4 个时,解释器才会跟“a,b=1,2”(多变量赋值)一样,基于解包实现变量赋值
  • Python 为什么用 # 号作注释符?
    • 注释符是编程语言中最基础的要素之一,Python 属于“# 号注释符阵营”,原因或许是它遵循着 Shell 等脚本语言的传统
    • Python 中不存在“块注释符”,Guido 曾建议使用多行字符串(multi-line strings)来达到块注释的效果,但这种方案在语义上有点怪异
  • Python 为什么要有 pass 语句?
    • pass 是 Python 独有的一种空操作,其它语言并没有这样的设计
    • pass 可以作为一种空间占位符,辅助程序员快速编程,然而这点小用途并非至关重要的
    • 由于 Python 不使用花括号之类的手段来划分代码块,因此在定义空函数时,pass 就成了一种补齐语法逻辑的方案
  • Python 为什么会有个奇怪的“…”对象?
    • … 是 Python3 在 PEP-3100 中引入的一个内置常量,与 Ellipsis 表示同一个对象
    • 官方说它们是单例的,然而这有违事实。要么是文档错了,要么这是一个 Bug ?
    • … 有什么用处,能够解决什么问题?文中介绍了 4 个用途:扩展切片语法、表达“未完成的代码”语义、Type Hint 用法、表示无限循环
  • Python 为什么能支持任意的真值判断?
    • 这也是 Python 与众不同的一个特性,它将其它语言中仅限于布尔类型的操作(if 或 while 或布尔操作 and、or、not),扩展到了任意对象,带来了极大的灵活性
    • 真值判断的结果取决于__bool__() 和 __len__() 这两个魔术方法的返回值
    • Python 甚至可以对数字对象作真值判断(表示 0 的数为 False,其它数为 True)
  • Python 函数为什么会默认返回 None?
    • Python 隐性地为没有带 return 的函数添加一个 return 操作,即默认返回 None 值,这是由解释器强行注入的逻辑。这意味着:Python 中不存在无返回值的函数
    • 为什么 Python 要强制令所有函数都有一个返回值呢?为什么它不支持无返回值的空函数呢?
  • Python 为什么没有 void 关键字?
    • void 通常指的是一种类型(type),但是它没有具体的值(value)。文中介绍了其它语言需要使用 void 关键字实现的两种功能
    • Python 舍弃了表示“没有值的类型”的 void,统一使用表示“仅有一个值的类型” None,配合前一篇“所有函数必然有返回值”的设计,实现了简单好用的效果
  • Python 为什么是强类型语言,不是弱类型语言?
    • 动静类型与强弱类型是两组不同维度的概念,不应混为一谈。在编程语言发展的早期,当强弱类型的概念还未提出时,一些大佬使用动静类型来笼统地描述语言的特性,这是历史原因
    • 如今主流观点以“隐式类型转换”来划分强弱类型,Python 毫无疑问是强类型语言。文中针对几个易混淆的问题,详细解释了为什么 Python 中不存在“隐式类型转换”
  • Python 之父为什么嫌弃 lambda 匿名函数?
    • lambda 语法借鉴自 lisp 语言,却遭到 Python 之父的嫌弃,然而它竟从他的屠刀下幸存,这段故事充满戏剧性
    • Python 的 lambda 只支持单行表达式,功能不完备。曾有人提议增强 lambda 语法,Python 之父认为那不是好的设计,因而否决了
    • Guido 提出要一次性移除 reduce()、map()、filter() 以及 lambda,但最后他妥协了
  • Python 为什么不支持 switch 语句?
    • 大多数语言都提供了 switch 语句或者极其相似的东西,但在 Python 之父的裁决下,Python 不提供 switch 语句
    • 文章介绍了试图引入 switch 语句的 PEP-275 与 PEP-3103,总结了这两个提案的要点以及被否决的原因
  • Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?
    • 两种创建列表的 [] 与 list() 写法,哪一个更快呢,为什么它会更快呢?
    • 文章通过字节码与执行过程的分析,解释了两者执行速度的差异
  • 为什么说 Python 内置函数并不是万能的?
    • 内置函数的名称并不是关键字,而内置作用域位于名称查找的最低优先级,因此在调用时,某些内置函数/类型的执行速度就明显慢于它们对应的字面量表示法
  • 为什么继承 Python 内置类型会出问题?!
    • 由《流畅的Python》中的例子,引出 Python 在内置类型子类化时不合常理的话题
    • 分析魔术方法的底层实现逻辑及调用关系,解释内置类型存在的问题
    • 介绍了内置类型子类化的最佳实践
  • 为什么 Python 的 f-string 可以拼接字符串与数字?
    • Python 是强类型语言,在不经过强制类型转换的情况下,字符串无法拼接数字
    • 介绍了 PEP-498 实现 f-string 的原理
  • Python 的切片为什么不会索引越界?
    • 切片是不少编程语言的特性,Python 的切片不仅功能完善,而且在使用上更为灵活
    • 索引越界是一个常见的问题,Python 切片使用了几条规则,屏蔽了可能导致出错的情况
    • 文章介绍了 Python 的解决方案,但是也留下了一个疑问:为什么 Python 的切片语法要允许索引超出边界呢,为什么不设计成抛出索引错误?
  • 为什么 range() 生成的不是迭代器?
    • 有很多内置方法可以生成迭代器,然而似乎只有 range() 生成的是可迭代对象,这个 range() 显得非常独特。文中给出了我对此的猜想
    • 我还注意到 range 是一种不可变序列,然而它跟字符串这种不可变序列相比,也有着独特的表现
  • Python 为什么要保留显式的 self ?
    • 这也是一个常见问题。这里给出了官方文档的解释,另外附了 Guido 的一篇博客全文
  • Python 为什么不设计 do-while 循环结构?
    • 在 C/C++、C#、PHP、Java、JavaScript 等语言中,do-while 是一种基本结构。Python 为什么不沿袭它们的传统呢?有什么特殊的考虑?
    • 文章列举了其它语言中 do-while 语法的主要使用场景,解释了为什么 Python 可以不用这种结构
    • 介绍了 PEP-315 试图引入 do-while 结构的尝试,以及 Guido 的反对意见
  • 为什么 Python 3 把 print 改为函数?
    • Python3 与 Python2 最显眼的一个区别就是:print 语句变成了 print() 函数
    • PEP-3105 Make print a function 是对这个问题最好的回答
  • 为什么说 Python 最会变魔术的魔术方法是它?
    • __missing__() 是仅在内置类型的子类上才存在的魔术方法,似乎是唯一的特例
    • __missing__() 极为特殊,Python 解释器为它开了后门,实现了最为罕见的“魔术方法间调用”逻辑
  • Python 为什么用”elif“,而不是“else if”?
    • elif 写法相比于“else if”更为简洁,这种写法并非 Python 首创。Guido 发推特解释了这种写法的来源

当在两年半前写下第一篇“Python为什么”系列的时候,我无法想象自己会在 2023 年到来之际写下这一篇宣告重新起航的小结,更无法想象是在下一个两年半,或者五年半或者更久,再次写下一篇新的总结。谁说得准呢!

但是,不忘初心,珍惜当下的决心,树立砥砺前行的恒心,我可以的!

最后,别急着划走啊,请一定记得点个关注、点个 star 哈,喵喵喵~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智芯传感微差压气体压力传感器成功入围第三届“SIA感知领航优秀项目征集”年度杰出产品及技术成长型企业组

近日,由中国传感器与物联网产业联盟开展的第三届“SIA感知领航优秀项目征集”结果正式出炉,北京智芯传感科技有限公司(以下简称“智芯传感”)作为国内领先的MEMS传感器厂商,凭借旗下产品“微差压气体压力传感器”的卓越…

uniapp的生命周期

目录 一、应用生命周期 只能在 App.vue 里执行 1、onLaunch 2、onShow 3、onHide 二、页面生命周期 1、onLoad 监听页面加载 2、onReady 3、onShow 监听页面显示 4、onHide 监听页面隐藏 5、onUnload 监听页面卸载 三、组件生命周期 1、beforeCreate 2、…

Java培训Mycat安装启动

一、 安装启动 1、安装解压 解压缩文件拷贝到linux下 /usr/local/ 2、配置文件介绍 schema.xml 定义逻辑库&#xff0c;表、分片节点等内容 rule.xml 定义分片规则 server.xml 定义用户以及系统相关变量&#xff0c;如端口等 3、 配置文件修改 <?xml version”1.0…

MFC中窗口隐藏后再显示,子窗口没刷新(WS_CLIPCHILDREN,WS_CLIPSIBLINGS)

问题描述 非模态对话框下&#xff0c;显示了子窗口&#xff0c;但窗口隐藏后&#xff0c;再通过任务栏显示出来时&#xff0c;子窗口内容就不显示了。 正确的显示如下&#xff1a; 显示异常的情况 - 原因分析 显示父窗口时&#xff0c;父窗口会进行重绘&#xff08;我的理…

什么是数字化?企业该如何做数字化?

现在大家都在说数字化&#xff0c;数字化到底是什么&#xff1f; 数字化不是万能&#xff0c;只能赋能&#xff0c;数字化转型也不是口号&#xff0c;而是需要在具体规划和业务发展中深入思考和切实贯彻。 如今数字化俨然成为炙手可热的一个高频词汇&#xff0c;不论个人还是…

MySQL#2(数据模型,SQL通用语法,SQL分类)

目录 一.数据模型 二.SQL通用语法 三.SQL的分类 1.DDL DDL---操作数据库 DDL---操作表 2.DML DML---操作数据 3.DQL(重点) 基础查询 条件查询 排序查询 分组查询 分页查询 扩展: 聚合函数 一.数据模型 数据库在内存中是以文件夹的方式存在 数据表和数据是以文件的形式存…

有利润表模板的BI软件有哪些?

要分析利润&#xff0c;就需要制作利润表。有哪些可套用利润表模板的BI软件&#xff1f;关于这个问题&#xff0c;找奥威BI软件就对了。奥威BI软件有一套标准化的数据分析方案&#xff0c;内设数十张数据可视化分析报表模板&#xff0c;其中就包括了利润表模板&#xff0c;下载…

KNN算法预测哪些用户会购买这种全新SUV。并且在最后一列用来表示用户是否购买 项目实战代码+数据

K近邻算法通过计算被分类对象与训练集对象之间的距离,确定其k个临近点,然后使用这k个临近点中最多的分类作为分类结果。 如上图,当K=3时,它会被分类为 Class B。因为K=3时,3个临近点里有2个是B类的。 同理,K=7时它会被分类为 Class A,因为K=7时,7个临近点里4个是A类的…

C. The Third Problem(MEX,思维,组合数)[Codeforces Round #804 (Div. 2)]

题面如下&#xff1a; 思路or题解 因为是MEXMEXMEX问题&#xff0c;我们可以通过维护每一个数的 [l,r][l, r][l,r] 来进行求解 如果 kkk 维护的范围是 [l,r][l, r][l,r] 那么我们在计算 k1k 1k1 的时候可以发现&#xff1a; 在[l1,r−1][l 1, r - 1][l1,r−1] 如果 k1k 1k1…

CS61A 2022 fall lab0

CS61A 2022 fall lab0:Getting Started 不得不感叹实验网站是真的高级… 我打算用ubuntu做实验 文章目录CS61A 2022 fall lab0:Getting StartedIntroductionSetup1.Install a terminal2.Install Python 3Python3.7基于update-alternatives的Python默认版本系统级修改&#xff1…

在设备树中pinctrl的简单使用

目录 1 关于引脚的几个概念 2 设备树中pinctrl节点 2.1 定义各种pin bank 2.2 定义各种group 3 设备节点中要使用某一个 pin group 4 platform_device, platform_driver匹配 5 驱动中想选择、设置某个状态的引脚 6 总结 7 参考文档 1 关于引脚的几个概念 Bank: 以引脚…

NKOJ-P1327【NOIP 2011 DAY2-1】计算系数

希望这篇文章可以带我突破10000访问………… 题目描述 给定一个多项式 (axby)k(axby)^k(axby)k&#xff0c;请求出多项式展开后xnymx^ny^mxnym项的系数; 共一行&#xff0c;包含5 个整数&#xff0c;分别为a,b,k,n,ma,b,k,n,ma,b,k,n,m&#xff0c;每两个整数之间用一个空格隔…

趣谈网络协议-课程介绍

技能收获 掌握网络协议的知识框架&#xff1b;应对大厂面试的协议难题&#xff1b;驾驭网络协议的实用场景。 讲师介绍 刘超&#xff0c;前网易研究院云计算技术部首席架构师&#xff0c;15 年云计算领域研发及架构经验。曾在 EMC 做过类似 GFS 的分布式存储开发&#xff0c;…

【遥感科学】第三章 遥感成像原理

第三章 遥感成像原理与遥感图像特征 一、遥感平台 遥感平台是搭载传感器的工具&#xff0c;按照位置可以分为地面、航空航天航宇&#xff0c;按照作用可分为气象、陆地、海洋等。这里我们主要按照作用领域进行讨论 1.1 气象卫星 气象卫星发展的三个阶段&#xff1a; 20世纪6…

【MySQL】-索引以及树的常用数据结构分析

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【MySQL】 分享&#xff1a;纵一苇之所如&#xff0c;凌万顷之茫然。——《赤壁赋》 主要内容&#xff1a;MySQL中索引的介绍、创建索引、使用索引&#xff1b;索引背后的数据结构…

计算存储分离在京东云消息中间件JCQ上的应用

作者&#xff1a;田寄远 JCQ 全名 JD Cloud Message Queue&#xff0c;是京东云自研、具有 CloudNative 特性的分布式消息中间件。 JCQ 设计初衷即为适应云特性的消息中间件&#xff1b;具有高可用、数据可靠性、副本物理隔离、服务自治、健康状态汇报、少运维或无运维、容器部…

LeetCode代码随想录算法训练营第十一天-C++队列的应用

_11LeetCode代码随想录算法训练营第十一天-C队列的应用 239.滑动窗口最大值347.前K个高频元素 239.滑动窗口最大值 整体思路 要实现一个单调递减队列&#xff1a; 对于滑动窗口的滑动&#xff0c;移除前面的元素&#xff0c;加入后面的元素。当移除前面的元素时&#xff0…

彻底弄清SpringSecurity登录原理及开发步骤

SpringBootVue之SpringSecurity登录与授权(一) 工具&#xff1a;idea2018&#xff0c;springboot 2.1.4&#xff0c;springsecurity 5.1.5 简介 SpringSecurity是Spring下的一个安全框架&#xff0c;与shiro 类似&#xff0c;一般用于用户认证(Authentication)和用户授权(Autho…

【案例教程】MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧

【查看原文】基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估及论文写作技巧 随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自…

ruoyi导入数据,第二次导入相同文件时,覆盖原数据;

考勤记录表——在导入时——应该做判断——避免重复导入成功报错 1.现在是&#xff0c;可以多次成功导入同一个文档&#xff0c;导致数据展示出错 期望&#xff1a; 导入文件时&#xff0c;如果这个文件名内数据select值不为0&#xff0c;那么覆盖表数据&#xff08;update&…