Python 高手编程系列二:Python 3 和 Python 2 的主要差异

前面已经说过,Python 3 打破了对 Python 2 的向后兼容。但它并不是完全重新设计的。
而且,也并不是说 2.x 版本的 Python 模块在 Python 3 下都无法运行。代码可以完全跨版本兼
容,无需其他工具或技术在两大版本上都可以运行,但一般只有简单应用才能做到这一点。
为什么要关注这些差异
本章前面说过我个人对 Python 2 兼容性的看法,但是目前不可能完全忽视这一点。还有
一些 Python 包(例如第 6 章将讲到的 fabric)十分实用,但可能短期内不会迁移到 Python 3。
另外,有时我们还会受到所在公司的制约。现有的遗留代码可能非常复杂,迁移代码
的费用难以承受。所以即使我们现在决定只用 Python 3,短期内也不可能完全放弃 Python 2。
如今想要自称专业开发者,没有对社区的回馈是说不过去的,所以帮助开源软件开发
者向现有软件包中添加对 Python 3 的兼容,可以很好地偿还在使用这些软件包时产生的“道
德债(moral debt)”。当然,不了解 Python 2 和 Python 3 的差异是无法做到这一点的。顺便
提一下,对于 Python 3 新手来说,这也是一项很好的练习。
主要的语法差异和常见陷阱
要比较不同版本之间的差异,最好的参考资料就是 Python 文档。不过为了方便读者,
本节总结了其中最重要的内容。但不熟悉 Python 3 的读者还是要去阅读官方文档。
Python 3 引入的重要差异一般可分为以下几个方面。
• 语法变化,删除/修改了一些语法元素,并添加了一些新的语法元素。
• 标准库中的变化。
• 数据类型与集合的变化。
语法变化
有些语法变化会导致当前代码无法运行,这些变化是最容易发现的,它们会导致代码
根本无法运行。包含新语法元素的 Python 3 代码在 Python 2 中无法运行,反之亦然。由于
删除了某些元素,导致 Python 2 代码显然无法与 Python 3 兼容。运行有这些问题的代码时,
解释器很快就会抛出 SyntaxError 异常。下面是一个无法运行的脚本示例,只包含两个语句,都会引发语法错误而无法运行:
print(“hello world”)
print “goodbye python2”
上述代码在 Python 3 中的实际运行结果如下:
$ python3 script.py
File “script.py”, line 2
print “goodbye python2”
^
SyntaxError: Missing parentheses in call to ‘print’
列出所有的语法差异会比较长,而且 Python 3.x 的新版本也会不时添加新的语法元素,
在较早版本的 Python 中就会引发错误(即使在相同的 3.x 版本上也会报错)。其中最重要的
语法差异将会在第 2 章和第 3 章中讲到,所以这里无需全部列出。
与 Python 2.7 相比,删除或改动的内容要相对少一些,下面给出最重要的变化内容。
• print 不再是一条语句而是一个函数,所以必须加上括号。
• 捕获异常的语法由 except exc, var 改为 except exc as var。
• 弃用比较运算符<>,改用!=。
• from module import *(https://docs.python.org/3.0/reference/simple_stmts.html#import)
现在只能用于模块,不能用在函数中。
• 现在 from .[module] import name 是相对导入的唯一正确的语法。所有不以
点字符开头的导入都被当作绝对导入。
• sorted 函数与列表的 sort 方法不再接受 cmp 参数,应该用 key 参数来代替。
• 整数除法表达式(如 1/2)返回的是浮点数。取整运算可以用//运算符,如 1//2。
这样做的好处是浮点数也可以用这个运算符,所以 5.0//2.0 == 2.0。
标准库中的变化
语法变化很容易发现,标准库中的重大变化也是非常容易发现的。Python 的每个后续
版本都会向标准库模块中添加、弃用、改进或完全删除某些内容。在旧版 Python(1.x 和
2.x)中也会定期有这样的变化,所以出现在 Python 3 中并不让人吃惊。大多数情况下,对
于删除或重组的模块(例如 urlparse 移到了 urllib.parse),在运行解释器时会对导
入语句抛出异常。这样的问题很容易发现。无论如何,为了确保能够发现所有类似的问题,
完整的代码测试覆盖率是必不可少的。在某些情况下(例如使用延迟加载模块时),这个通
常在全局导入时出现的问题并不会出现,直到在代码中将某些模块作为函数调用时才会出
现。因此,在测试期间确保每行代码都要实际运行是很重要的。
数据类型与集合的变化
开发人员在努力保持兼容性或只是将现有代码迁移到 Python 3 上时,需要特别注意
Python 中数据类型与集合的表示方式的变化。虽然不兼容的语法变化或标准库变化很容易
发现,也很容易修复,但集合与数据类型的变化要么难以察觉,要么需要大量的重复工作。
这样的变化列表会很长,再次重申,官方文档是最好的参考资料。
不过,这一节必须讲一下 Python 3 中字符串处理方式的变化,因为这是 Python 3 中最
具争议也是讨论最多的变化,尽管这是一件好事,使很多问题变得更加明确。
现在所有字符串都是 Unicode,字节(bytes)需要加一个 b 或 B 的前缀。Python 3.0
和 3.1 不支持使用 u 前缀(例如 u"foo"),使用的话会引发语法错误。不支持这个前缀是
引发所有争议的主要原因。这导致难以编写能够兼容 Python 不同分支的代码,2.x 版需要
用这个前缀来创建 Unicode。Python 3.3 又恢复了这个前缀,虽然没有任何语法上的意义,
只是为了简化兼容过程。

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

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

相关文章

BCA蛋白定量法简介-卡梅德生物

BCA&#xff08;Bicinchoninic Acid&#xff09;蛋白定量法是一种广泛使用的生化分析技术&#xff0c;用于测定样品中的总蛋白质含量。它基于两种化学物质的反应&#xff1a;铜离子&#xff08;Cu^2&#xff09;和双邻二氮杂菲&#xff08;Bicinchoninic Acid&#xff0c;BCA&a…

AUTOSAR ECUM模块介绍

AUTOSAR ECUM 模块概述 在现代汽车电子系统中,AUTOSAR(Automotive Open System Architecture)扮演着至关重要的角色。而其中的 EcuM(ECU Management)模块更是具有核心地位。 EcuM 模块主要负责 ECU(Electronic Control Unit)的管理和控制。它的定义可以概括为:一个集成…

企业应用架构模式--详解51种企业应用架构模式

导读&#xff1a;企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f; 世界著名软件开发大师Martin Fowler给你答案 目录 01什么是企业应用02 企业应用的种类03企业架构模式 01什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈…

PySpark特征工程(III)--特征选择

有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是数据分析…

ubuntu早期版本以及18.04后的版本,通过rc.local配置开机自启

在ubuntu早期版本以及18.04后的版本&#xff0c;还是支持在rc.local中进行操作开机自启。 1、编辑rc.local文件 cat <<EOF >/etc/rc.local #!/bin/sh -e # rc.local # This script is executed at the end of each multiuser runlevel. # Make sure that the script…

【Vue】非父子通信-event bus 事件总线

文章目录 一、实现步骤二、代码示例 作用&#xff1a;非父子组件之间&#xff0c;进行简易消息传递。(复杂场景→ Vuex) 一、实现步骤 创建一个都能访问的事件总线 &#xff08;空Vue实例&#xff09; → utils/EventBus.js 叫事件总线的原因是因为本质是它俩消息的接受和发送…

Go 语言中的数组:声明、初始化与应用

Go 语言的数据结构中&#xff0c;数组是一个基本的构成元素&#xff0c;它能存储一系列固定长度的项&#xff0c;这些项具有相同的类型。尽管在 Go 中切片的使用更为普遍&#xff0c;数组仍然是理解更高级数据结构如切片和map的基础。本文将详细探讨 Go 语言中数组的声明、初始…

JL-03-Y1 清易易站

产品概述 清易易站是清易电子新研发的一体式气象站&#xff0c;坚持科学化和人文化相结合的设计理念&#xff0c;应用新检测原理研发的传感器观测各类气象参数&#xff0c;采用社会上时尚的工艺理念设计气象站的整体结构&#xff0c;实现了快速观测、无线传输、数据准确、精度较…

NCP1680AAD1R2G是一款CrM PFC控制器IC 用于驱动无桥图腾柱PFC拓扑结构

NCP1680AAD1R2G NCP1680是一个CrM PFC控制器IC&#xff0c;用于驱动无桥图腾柱PFC拓扑结构。无桥图腾柱PFC是一种功率因数校正结构&#xff0c;包括一个以PWM开关频率驱动的快速开关桥臂和一个以AC线频率工作的第二桥臂。这种拓扑结构消除了传统PFC电路输入端存在的二极管桥&am…

LabVIEW冲击响应谱分析系统

LabVIEW冲击响应谱分析系统 开发了一种基于LabVIEW开发的冲击响应谱分析系统&#xff0c;该系统主要用于分析在短时间内高量级输入力作用下装备的响应。通过改进的递归数字滤波法和样条函数法进行冲击响应谱的计算&#xff0c;实现了冲击有效持续时间的自动提取和响应谱的精准…

操作简单中医电子处方中药划价系统软件视频教程,佳易王诊所电子处方管理系统软件

操作简单中医电子处方中药划价系统软件视频教程&#xff0c;佳易王诊所电子处方管理系统软件 一、前言 以下软件操作教程以&#xff0c;佳易王中西医诊所电子处方软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件支持中医和西医处方…

深入探索npx:npm包执行的艺术与npm的实用差异

引言 在使用Node.js和JavaScript的生态系统中&#xff0c;npx和npm是两个常用的命令行工具&#xff0c;它们各自有着独特的用途和优势。 基础知识 npm&#xff08;Node Package Manager&#xff09;&#xff1a;是一个包管理器&#xff0c;用于管理项目中的依赖。npx&#x…

Linux `free` 命令:深入解析系统内存使用情况**

Linux free 命令&#xff1a;深入解析系统内存使用情况 在Linux系统管理中&#xff0c;了解内存的使用情况对于系统调优、性能监控以及故障排除都至关重要。free 命令是Linux系统中用于显示系统内存使用情况的常用工具。本文将深入解析 free 命令的使用方法和其输出的各项含义…

冯喜运:6.5今日黄金原油行情怎么看及日内操作策略

【黄金消息面分析】&#xff1a;周三&#xff08;6月5日&#xff09;亚市早盘&#xff0c;现货黄金窄幅震荡&#xff0c;目前交投于2328.13美元/盎司附近。黄金价格周二下跌超过1%&#xff0c;原因是美元在本周晚些时候美国就业数据公布前趋于稳定&#xff0c;该数据可能为美联…

女生适合学GIS开发吗?0基础怎么学?

最近小编在各账号后台会陆续收到一些粉丝留言。其中有些女粉在问&#xff0c;女生适合学GIS开发吗&#xff1f;会被歧视吗&#xff1f; 众所周知&#xff0c;IT行业中男生占了很大部分的比例&#xff0c;那么GIS开发行业也是这样吗&#xff0c;女生适合学习GIS开发吗&#xff…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(五)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失拖放取消的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

【前端 - Vue】Vuex基础入门,创建仓库的详细步骤

&#x1f680; 个人简介&#xff1a;6年开发经验&#xff0c;现任职某国企前端负责人&#xff0c;分享前端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;前端菜鸟的自我修养❣️ &#x1f4dd; 专 栏&#xff1a;vue从基础到起飞 &#x1f308; 若有帮助&…

有极性电容器的引脚极性怎么判别?

由于有极性电容器有正、负之分&#xff0c;在电路中又不能乱接&#xff0c;所以在使用有极性电容器前需要先判别出正、负极。有极性电容器的正、负极判别方法如图2—9&#xff5e;图2—11所示。 方法一&#xff1a;对于未使用过的新电容&#xff0c;可以根据引脚长短来判别。引…

Java代码优化指南

Java代码优化指南 代码优化是通过改进算法和数据结构&#xff0c;使代码运行得更快、更节省内存、更易于维护。在这方面&#xff0c;主要可以从算法优化、数据结构优化和代码层面的优化入手。本文将详细介绍这些优化方法&#xff0c;并通过具体示例说明如何在Java中进行代码优…

企业微信SOP工具:提升企业管理与运营效率的新选择

在当今这个数字化、智能化的时代&#xff0c;企业对于高效、精准的管理与运营需求日益迫切。企业微信作为一款功能强大的企业级通讯工具&#xff0c;已经深入到众多企业的日常运营中。而企业微信SOP工具&#xff08;Standard Operating Procedure&#xff0c;即标准操作流程工具…