Python 3.x 新特性及10大变化
Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3 Python之父Guido van Rossum谈到了Python 3.0的构思: 一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,Python 3000将会作为第一个放弃向后兼容性的Python版本,目的就是要让Python向着最好的语言前进。 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 2.6并无警告。程序可以通过一个2to3的转换工具无缝迁移到Python 3.0。Python有一些很有用的测试模块,包括doctext和unitest。确保在尝试移植到Python3之前,对应用程序进行全面测试。要确保测试范围尽可能大,而且程序在Python2.6上运行时,能通过测试并且没有出现任何警告信息。 新的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 2.7被确定为最后一个Python 2.x版本,它除了支持Python 2.x语法外,还支持部分Python 3.1语法.
01.print() and exec() 函数 python旧版本里,print和exec是作为一语句出现,可以用print "Hello,World!",来打印一个语句,在新版本里,print()和exec()作为一个函数出现,所以上面的写就是错误的,应该写成print ("Hello,World!")对于Java的程序员来说,这样的改变应该是比较熟悉. System.out.print("Hello,World!"); 复制代码 代码如下: Old: >>>print "The answer is",2*2 New: >>>print("The answer is",2*2) Old: >>>print x, # Trailing comma suppresses newline New: >>>print(x,end=" ") # Appends a space instead of a newline Old: >>>print # Prints a newline New: >>>print() # You must call the function! Old: >>>print >>sys.stderr,"fatal error" New: >>>print("fatal error",file=sys.stderr) Old: >>>print (x,y) # prints repr((x,y)) New: >>>print((x,y)) # Not the same as print(x,y)! 不过在Python 2.6版本里面: from __future__ import print_function 复制代码 代码如下: >>> from __future__ import print_function >>> print ('Jerry','Sherry',sep='-') Jerry-Sherry 下面的修改在新版本是正确的: 复制代码 代码如下: >>>print("There are <",2**32,"> possibilities!",sep="") There are <4294967296> possibilities! >>>fid = open("log.txt","a") >>>print("log.txt",file=fid) >>>print("Foo","Bar",sep="%") >>>Foo%Bar exec() 同样是函数,在python 2.x里,下列代码是ok的. 复制代码 代码如下: >>> def foo(): exec('a=4') print a >>> foo() 4 但在python 3.x里面就不行了,会报NameError: global name 'a' is not defined. 因为变量a没有定义。原因在于exec()作为函数,只操作globals()和locals()函数返回的字典。但locals()函数返回的字典实际上是局部变量的一个副本。exec()函数中进行的赋值只修改了局部变量的这份副本,而非局部变量本身。下面给出了一种解决办法: 复制代码 代码如下: >>> def foo(): _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("What is your quest? ") New: >>>question = input("What is your quest? ") 04.源文件编码默认为UTF-8 复制代码 代码如下: # coding: UTF-8 # vim:fileencoding=UTF-8 # -*- coding=UTF-8 -*- # vim: set fileencoding=UTF-8 05.字符串格式化变化 复制代码 代码如下: >>>"I love {0},{1},and {2}".format("eggs","bacon","sausage") 'I love eggs,bacon,and sausage'
06.比较 Python3对于值的比较要严格得多。在Python2中,任意两个对象均可进行比较,例如: 复制代码 代码如下: Old: >>>11 < 'ORACLE' # Python 2 结果为:True New: >>>11 < 'ORACLE' # Python 3 这种比较将导致TypeError异常 07.标识符支持非 ASCII 字符 复制代码 代码如下: 所有 = all class 男人: @classmethod def 包括(cls,ta): return isinstance(ta,cls) def 一起玩(人们): if 所有(男人.包括(ta) for ta in 人们): print ("他们是基友") else: print ("他们是朋友") 汤姆 = 男人() 杰瑞 = 男人()
>>> 08.异常处理 复制代码 代码如下: # 绑定ValueError到本地的ex try: x = float('blah') except ValueError as ex: print("value exception occurred ",ex) # 同时捕获两个不用的异常 try: x = float('blah') except (ValueError,NameError): print("caught both types of exceptions") 例子2: Python 3中的隐式异常链 复制代码 代码如下: def divide(a,b): try: print(a/b) except Exception as exc: def log(exc): fid = open('logfile.txt') # missing 'w' print(exc,file=fid) fid.close() log(exc)
09.字典dict Python 3.0 内的另一个重大改变是字典内dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的删除。取而代之的是:dict.keys(),dict.values(),dict.items(),它们被进行了修补,可以返回轻量的、类似于集的容器对象,而不是键和值的列表。这样的好处是在不进行键和条目复制的情况下,就能在其上执行set操作。dict.has_key()同样被移除。 复制代码 代码如下: >>> d = {1:"Food",2:"Book"} >>> d.keys(),d.values(),d.items() >>> for values in d.items(): print (values) (1,'Food') (2,'Book') >>> keys = list(d.items()) >>> print (keys) [(1,'Food'),(2,'Book')] Old: >>> d.has_key(1) True New: >>> 1 in d #新版本判断key是否在字典里面 True 10.其他改变 * 移除了backticks(使用repr()代替) 复制代码 代码如下: >>>0o13 #八进制转十进制 11 >>>0b010101 #八进制转二进制 21 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |