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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值