Python2到Python3的变化
2000 年 10 月,Python 2.0 终于看到了曙光。此后 Python 取得了很多重要进展,Python 2 的几个版本陆续发布。经过长时间测试后,2008 年 12 月,Python 3 面世,而它和 Python 2 并不兼容。大部分网站和项目最终选择转向 Python 3,整体上这也和 Python 的开发趋势一致,因为 Python 官方也宣布 2020 年后不再继续支持 Python 2.7。
本文讨论两个版本之间的一些明显的变化。
1 - print变为print()
从一条语句变为了一个内置函数。以下是现在的其具体语法
print(*objects, sep=' ', end='\n', file=sys.stdout)
Guido在其谈话“Python Regrets”中说到,将print作为声明会受到诸多限制,使用非常死板。如果将print()作为一个函数,则可添加关键词参数覆写输出参数如分割符或换行符。类似的变化产生在exec()函数上。
2 - 默认为Unicode编码
Python2 的默认编码是 ASCII,这也是导致 Python2 中经常遇到编码问题的原因之一,至于是为什么会使用 ASCII 作为默认编码,原因在于 Python2诞生的时候Unicode已有,但为了兼容Python1依然沿用其设计逻辑。Python 3 使用了文本和(二进制)数据的概念,默认采用了 UTF-8 作为默认编码。
3 - 字符串类型重新指定
在 Python2 中,字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列,不过两者并没有明显的界限。在 Python3 中两者做了严格区分,分别用 str 表示字符串,byte 表示字节序列。任何需要写入文本或者网络传输的数据都只接收字节序列,这就从源头上阻止了编码错误的问题。
4 - True和False的关键字化
True 和 False 在 Python2 中是两个全局变量(名字),在数值上分别对应 1 和 0。但既然是变量,那么他们就可以重新赋值而指向其它对象,例如:
#py2
>>> False = "x"
>>> False
'x'
>>> if False:
... print("?")
...
?
显然,上面的代码违背了 Python 的设计哲学 “Explicit is better than implicit.”。而Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。
5 - 整数和除法的更新
单整数类型
Python2中的两种不同的整数类型int和long在Python3 中被彻底统一为int。
除法的修改
在Python2中默认的除法规则是:给定两个整数操作数,“/”执行整数向下除法(去尾,截断小数部分);若其中有至少一个浮点数,则会产生真除法。
#py2
>>>1/2 #floor
0
>>>1.0/2.0 #true
0.5
在Python3 中给定任意两个数字操作数,“/”将总会返回浮点数,即真除法。
#py3
>>>1/2 #true
0.5
>>>1.0/2.0 #true
0.5
6 - 迭代器无所不在
Python3中一个重要的主题是内存保护。使用迭代器比直接在内存中维护整个列表更加有效,尤其是当针对问题对象的目标动作就是迭代时,不必要浪费内存。迭代器的惰性加载特性使得操作大数据更有效率。Python2中的range()和xrange()函数合并成了range(),此外函数map(),filter(),zip()和字典方法keys(),items(),values(),都将返回某种特定类型的迭代器。但使用者若是只是通过返回值进行遍历,则注意不到这些改变。另外,Python2的迭代器必须实现 next 方法,而 Python3 改成了 _ next _ 。
7 - 对模块的修改
新增模块
concurrent.futures、venv、unittest.mock、asyncio、selectors、typing等
修改模块
主要是对模块添加函数/类/方法(如functools.lru_cache、threading.Barrier)或者参数。
模块改名
把一些相关的模块放进同一个包里面(如httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib放进了http里面,urllib, urllib2, urlparse, robotparse放进了urllib里面),个例如SocketServer改成了socketserver,Queue改成queue等
删除模块
gopherlib、md5、contextlib.nested、inspect.getmoduleinfo等。去掉的模块基本是过时的而少有人用的技术产物,或是基本被新替代物取代。
参考:
1. 官网 https://docs.python.org/3/whatsnew/3.0.html
2. Python核心编程:第3版,附录C.2
3. Python 2 和 Python 3 有哪些主要区别? - 董伟明的回答 - 知乎
https://www.zhihu.com/question/19698598/answer/206571839
上一篇: X轴间隔显示-长江水位