python2.x和3.x的区别
文:铁乐与猫
2018.3.16新增博文,为方便以后总结Python2.x与3.x的不同版本之间的区别,随时更新。
python原本的宗旨是崇尚优美、清晰、简单。但python刚推出的时候,自身除了创始者龟叔等谷歌少数人外,全世界的phthon大牛还很少,所以python社区来说,有很多各个语言的大牛去为python提供源码,而这些大牛提供的源码比较倾向于各自善长领域的语言的语法规范。例如有善长C的,有善长java的,写出来的源码都带有C或java的印记。这就导致一个状况:python2.x版本的源码相对混乱,重复代码较多显得繁擁。
有鉴于此,python的创始人龟叔在2008年的时候就“愤怒”了,这有别于python的初衷阿。
【关于龟叔】
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。
(龟叔:2005年加入谷歌至2012年,2013年加入Dropbox直到现在,依然掌握着Python发展的核心方向,被称为仁慈的*者)。
一个很有趣的现象,python版本在2008年的时候出现了转折点:2.6版本之后“愤怒”的龟叔“规范”了python后直接跳跃到python3.0,最初他宣布要使用2.6版本的公司两个月后直接停止使用过渡到使用3.0版本。可这时间也太短了,遭到了全世界的*,所以后来才有了2.7版本的python做为过渡,提供更新直至到2020年。
原话如下:Python 2.7 - July 3, 2010 In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible
大至意思就是龟叔在2014年11月,宣布Python 2.7的支持直到2020年为止,重申不会再有2.8版本的发布,希望用户尽快迁移到Python 3.4+版本。
这也就是为何python2.7与python3.x共存发行的独特之处,也是为何python2.7与python3.x的语法规范等有50+以上的不同之处的原因所在。
让我们来随着学习python的脚步来逐一记录下2.x和3.x版本的各个不同之处,以便总结和应对,不过2020年快到了,也许很快就不用再记着2.7的不同了吧。
区别
01不忘初衷
python2.x:源码相对混乱,重复代码较多,显得繁冗;
python3.x:源码规范,优美清晰简单;
02 print
python2.x:print被视为一条语句;
python3.x:print作为函数存在,print()接收字符串作为参数。
如上图,很明显区别了。
在py2中,print语句后面接的是一个元组对象,而在py3中,print函数可以接收多个位置参数。
03 input
python2.x: 使用raw_input();Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入。
python3.x:使用input()函数接受一个标准输入数据,返回为 string 类型。。
raw_input() 将所有输入作为字符串看待,返回字符串类型。
而 input() 在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float )。
注意:input() 和 raw_input() 这两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。
除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。
04 编码
Python2.x: 默认编码是 asscii;
Python 3.x: 默认UTF-8 , 因此不再需要在文件顶部写 # coding=utf-8 了。
05 字符串
Python2.x: 字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列,不过两者并没有明显的界限,开发者也感觉很混乱;
Python3.x: 两者做了严格区分,用 str 表示字符串,byte 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列,从源头上阻止了编码错误的问题。
补充:bytes 类型提供的操作和 str 一样,支持分片、索引、基本数值运算等操作。但是 str 与 bytes 类型的数据不能执行 + 操作,尽管在py2中是可行的。
python2 与 python3 字节与字符的对应关系:
python2 | python3 | 表现 | 转换 | 作用 |
---|---|---|---|---|
str | bytes | 字节 | encode | 存储 |
unicode | str | 字符 | decode | 显示 |
06 True和False
Python2.x: True 和 False 在 Python2 中是两个全局变量(名字),在数值上分别对应 1 和 0, 作为变量,可以指向其它对象,产生了混乱,也违背了设计初衷。
Python3.x: Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。
07 比较运算符
Python2.x: 支持<>作为!=的同义词;
Python3.x: 只支持!=,不再支持<>。
08 字典类方法 HAS_KEY()
Python2.x: 字典对象has_key()方法测试字典是否包含指定的键。
Python3.x:python3不再支持这个方法,使用in就可以了。
09 xrange()
Python2.x: 有两种方法获得一定范围内的数字:range()返回一个列表,xrange()返回一个迭代器。
Python3.x:range()也可以返回迭代器,xrange()不再存在。
10 intern(字符串驻留,数据池)机制
Python2.x:支持intern()
Python3.x:不支持intern()
注:
python默认只会对由字符
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
构成字符串进行intern。
(未完待续)