Python 3.x 新特性及10大变化
Python3.x起始版本是Python3.0,目前的最新版本是3.3.3
Python之父GuidovanRossum谈到了Python3.0的构思:
一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,Python3000将会作为第一个放弃向后兼容性的Python版本,目的就是要让Python向着最好的语言前进。
Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下兼容。许多针对早期Python版本设计的程序都无法在Python3.0上正常运行。为了照顾现有程序,Python2.6作为一个过渡版本,基本使用了Python2.x的语法和库,同时考虑了向Python3.0的迁移,允许使用部分Python3.0的语法与函数。基于早期Python版本而能正常运行于Python2.6并无警告。程序可以通过一个2to3的转换工具无缝迁移到Python3.0。Python有一些很有用的测试模块,包括doctext和unitest。确保在尝试移植到Python3之前,对应用程序进行全面测试。要确保测试范围尽可能大,而且程序在Python2.6上运行时,能通过测试并且没有出现任何警告信息。
新的Python程序建议使用Python3.0版本的语法。除非运行环境无法安装Python3.0或者程序本身使用了不支持Python3.0的第三方库。目前不支持Python3.0的第三方库有Twisted,py2exe,PIL等。大多数第三方库都正在努力地兼容Python3.0版本。即使无法立即使用Python3.0,也建议编写兼容Python3.0版本的程序,然后使用Python2.6,Python2.7来运行。Python2.7被确定为最后一个Python2.x版本,它除了支持Python2.x语法外,还支持部分Python3.1语法.
变化大致总结如下:
01.print()andexec()函数
python旧版本里,print和exec是作为一语句出现,可以用print"Hello,World!",来打印一个语句,在新版本里,print()和exec()作为一个函数出现,所以上面的写就是错误的,应该写成print("Hello,World!")对于Java的程序员来说,这样的改变应该是比较熟悉.System.out.print("Hello,World!");
Old:>>>print"Theansweris",2*2 New:>>>print("Theansweris",2*2) Old:>>>printx, #Trailingcommasuppressesnewline New:>>>print(x,end="") #Appendsaspaceinsteadofanewline Old:>>>print #Printsanewline New:>>>print() #Youmustcallthefunction! Old:>>>print>>sys.stderr,"fatalerror" New:>>>print("fatalerror",file=sys.stderr) Old:>>>print(x,y) #printsrepr((x,y)) New:>>>print((x,y)) #Notthesameasprint(x,y)!
不过在Python2.6版本里面:from__future__importprint_function
>>>from__future__importprint_function >>>print('Jerry','Sherry',sep='-') Jerry-Sherry
下面的修改在新版本是正确的:
>>>print("Thereare<",2**32,">possibilities!",sep="") Thereare<4294967296>possibilities! >>>fid=open("log.txt","a") >>>print("log.txt",file=fid) >>>print("Foo","Bar",sep="%") >>>Foo%Bar
exec()同样是函数,在python2.x里,下列代码是ok的.
>>>deffoo(): exec('a=4') printa >>>foo() 4
但在python3.x里面就不行了,会报NameError:globalname'a'isnotdefined.因为变量a没有定义。原因在于exec()作为函数,只操作globals()和locals()函数返回的字典。但locals()函数返回的字典实际上是局部变量的一个副本。exec()函数中进行的赋值只修改了局部变量的这份副本,而非局部变量本身。下面给出了一种解决办法:
>>>deffoo(): _locals=locals() exec('a=4',globals(),_locals) a=_locals['a'] print(a) >>>foo() 4
02.整数及除法
int和long统一为int,int表示任何精度的整数,移除sys.maxint,因为int已经是最大的整数。新版本移除了含糊的除法符号('/'),而只返回浮点数。在以前的版本中,如果参数是int或者是long的话,就会返回相除后结果的向下取整(floor),而如果参数是float或者是complex的话,那么就会返回相除后结果的一个恰当的近似。
Old:>>>1/2 #结果是0 晕死。。。 New:>>>1/2 #结果是0.5 总算接地气了。
03.input()代替raw_input()
变简洁了。
Old: >>>question=raw_input("Whatisyourquest?") New: >>>question=input("Whatisyourquest?")
04.源文件编码默认为UTF-8
Python3在字符编码方面有很多改进,其中之一就是默认的源文件编码从ASCII变为UTF-8,也就是说以前在文件头加上的各种花样的coding=utf-8不再需要了!
#coding:UTF-8 #vim:fileencoding=UTF-8 #-*-coding=UTF-8-*- #vim:setfileencoding=UTF-8
05.字符串格式化变化
格式化字符串的这个内置的%操作符太有限了,新版本新增加了format(),比以前更灵活了,%要逐渐被淘汰。举三个简单的例子如下:
>>>"Ilove{0},{1},and{2}".format("eggs","bacon","sausage") 'Iloveeggs,bacon,andsausage'
>>>"Ilove{a},{b},and{c}".format(a="eggs",b="bacon",c="sausage") 'Iloveeggs,bacon,andsausage'
>>>"Ilove{0},{1},and{param}".format("eggs","bacon",param="sausage") 'Iloveeggs,bacon,andsausage'