python2.x与3.x版本区别
python的3.0版本,常被称为python 3000,或简称py3k。相对于python的早期版本,这是一个较大的升级。
为了不带入过多的累赘,python 3.0在设计的时候没有考虑向下相容。
许多针对早期python版本设计的程式都无法在python 3.0上正常执行。
为了照顾现有程式,python 2.6作为一个过渡版本,基本使用了python 2.x的语法和库,同时考虑了向python 3.0的迁移,允许使用部分python 3.0的语法与函数。
新的python程式建议使用python 3.0版本的语法。
除非执行环境无法安装python 3.0或者程式本身使用了不支援python 3.0的第三方库。目前不支援python 3.0的第三方库有twisted, py2exe, pil等。
大多数第三方库都正在努力地相容python 3.0版本。即使无法立即使用python 3.0,也建议编写相容python 3.0版本的程式,然后使用python 2.6, python 2.7来执行。
主要变化
python 3.0的变化主要在以下几个方面:
print语句没有了,取而代之的是print()函数。 python 2.6与python 2.7部分地支持这种形式的print语法。在python 2.6与python 2.7里面,以下三种形式是等价的:
print fishprint (fish) #注意print后面有个空格print(fish) #print()不能带有任何其它参数然而,python 2.6实际已经支持新的print()语法:
from __future__ import print_functionprint(fish, panda, sep=', ')新的str类别表示一个unicode字串,相当于python 2.x版本的unicode类别。而位元组序列则用类似babc的语法表示,用bytes类表示,相当于python 2.x的str类别。
现在两种类别不能再隐式地自动转换,因此在python 3.x里面fish+bpanda是错误。正确的写法是fish+bpanda.decode(utf-8)。 python 2.6可以自动地将位元组序列识别为unicode字串,方法是:
from __future__ import unicode_literalsprint(repr(fish))除法运算符/在python 3.x内总是返回浮点数。而在python 2.6内会判断被除数与除数是否是整数。如果是整数会返回整数值,相当于整除;浮点数则返回浮点数值。
为了让python 2.6统一返回浮点数值,可以:
from __future__ import pisionprint(3/2)捕获异常的语法由except exc, var改为except exc as var。使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 python 2.6已经支援这两种语法。集合(set) 的新写法:{1,2,3,4}。注意{}仍然表示空的字典(dict) 。字典推导式(dictionary comprehensions) {expr1: expr2 for k, v in d},这个语法等价于result={}for k, v in d.items(): result[expr1]=expr2return result集合推导式(set comprehensions) {expr1 for x in stuff}。这个语法等价于:
result = set()for x in stuff: result.add(expr1)return result八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。新增了一个bin()函数用于将一个整数转换成二进制字串。 python 2.6已经支援这两种语法。dict.keys(), dict.values(), dict.items(), map(), filter(), range(), zip()不再返回列表,而是迭代器。如果两个物件之间没有定义明确的有意义的顺序。使用,=比较它们会投掷异常。比如1 bool: pass合并int与long类型。多个模块被改名(根据pep8):旧的名字新的名字_winregwinregconfigparserconfigparsercopy_regcopyregqueuequeuesocketserversocketserverreprreprlibstringio模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。 python 2.6已经支援新的io模组。httplib, basehttpserver, cgihttpserver, simplehttpserver, cookie, cookielib被合并到http包内。取消了exec语句,只剩下exec()函数。 python 2.6已经支援exec()函数。
