Python3.x和Python2.x的区别-.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《Python3.x和Python2.x的区别-.pdf》由会员分享,可在线阅读,更多相关《Python3.x和Python2.x的区别-.pdf(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Python3.x 和 Python2.x的区别1.性能Py3.0 运行pystone benchmark 的速度比Py2.5慢 30%。Guido 认为 Py3.0 有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。Py3.1 性能比 Py2.5 慢 15%,还有很大的提升空间。2.编码Py3.X源码文件默认使用utf-8 编码,这就使得以下代码是合法的:中国=china print(中国)china 3.语法1)去除了,全部改用!=2)去除,全部改用repr()3)关键词加入as 和 with,还有 True,False,None 4)整型除法返回浮点数,要得到整型结果,请使用
2、/5)加入 nonlocal 语句。使用noclocal x 可以直接指派外围(非全局)变量6)去除 print 语句,加入print()函数实现相同的功能。同样的还有exec语句,已经改为exec()函数例如:2.X:print The answer is,2*2 3.X:print(The answer is,2*2)2.X:print x,#使用逗号结尾禁止换行3.X:print(x,end=)#使用空格代替换行2.X:print#输出新行3.X:print()#输出新行2.X:print sys.stderr,fatal error 3.X:print(fatal error,file
3、=sys.stderr)2.X:print(x,y)#输出 repr(x,y)3.X:print(x,y)#不同于 print(x,y)!7)改变了顺序操作符的行为,例如x 0666 438 oct(438)0666 3.X 这样:0666 SyntaxError:invalid token(,line 1)0o666 438 oct(438)0o666 11)增加了2 进制字面量和bin()函数 bin(438)0b110110110 _438=0b110110110 _438 0b110110110 12)扩展的可迭代解包。在Py3.X 里,a,b,*rest=seq 和*rest,a=s
4、eq 都是合法的,只要求两点:rest 是 list 对象和 seq 是可迭代的。13)新的 super(),可以不再给super()传参数,class C(object):def _init_(self,a):print(C,a)class D(C):def _init(self,a):super()._init_(a)#无参数调用super()D(8)C 8 14)新的 metaclass 语法:class Foo(*bases,*kwds):pass 15)支持 class decorator。用法与函数decorator 一样:def foo(cls_a):def print_func
5、(self):print(Hello,world!)cls_a.print=print_func return cls_a foo class C(object):pass C().print()Hello,world!class decorator 可以用来玩玩狸猫换太子的大把戏。更多请参阅PEP 3129 4.字符串和字节串1)现在字符串只有str 一种类型,但它跟2.x 版本的 unicode 几乎一样。2)关于字节串,请参阅“数据类型”的第2 条目5.数据类型1)Py3.X去除了 long 类型,现在只有一种整型int,但它的行为就像2.X 版本的 long 2)新增了bytes 类型
6、,对应于2.X 版本的八位串,定义一个bytes 字面量的方法如下:b=bchina type(b)str 对象和 bytes 对象可以使用.encode()(str-bytes)or.decode()(bytes-str)方法相互转化。s=b.decode()s china b1=s.encode()b1 bchina 3)dict 的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有dict.has_key(),用in 替代它吧6.面向对象1)引入抽象基类(Abstraact Base Classes,ABCs)。2
7、)容器类和迭代器类被ABCs化,所以cellections 模块里的类型比Py2.5 多了很多。import collections print(n.join(dir(collections)Callable Container Hashable ItemsView Iterable Iterator KeysView Mapping MappingView MutableMapping MutableSequence MutableSet NamedTuple Sequence Set Sized ValuesView _all_ _builtins_ _doc_ _file_ _name_
8、 _abcoll _itemgetter _sys defaultdict deque 另外,数值类型也被ABCs化。关于这两点,请参阅PEP 3119和 PEP 3141。3)迭代器的next()方法改名为 _next_(),并增加内置函数next(),用以调用迭代器的_next_()方法4)增加了 abstractmethod 和 abstractproperty 两个decorator,编写抽象方法(属性)更加方便。7.异常1)所以异常都从BaseException继承,并删除了StardardError 2)去除了异常类的序列行为和.message 属性3)用raise Excepti
9、on(args)代替raise Exception,args 语法4)捕获异常的语法改变,引入了as 关键字来标识异常实例,在Py2.5 中:try:.raise NotImplementedError(Error).except NotImplementedError,error:.print error.message.Error 在 Py3.0 中:try:raise NotImplementedError(Error)except NotImplementedError as error:#注意这个as print(str(error)Error 5)异常链,因为_context_ 在
10、 3.0a1 版本中没有实现8.模块变动1)移除了cPickle模块,可以使用pickle 模块代替。最终我们将会有一个透明高效的模块。2)移除了imageop 模块3)移除了audiodev,Bastion,bsddb185,exceptions,linuxaudiodev,md5,MimeWriter,mimify,popen2,rexec,sets,sha,stringold,strop,sunaudiodev,timing和 xmllib 模块4)移除了bsddb 模块(单独发布,可以从http:/www.jcea.es/programacion/pybsddb.htm获取)5)移除了
11、new 模块6)os.tmpnam()和 os.tmpfile()函数被移动到tmpfile 模块下7)tokenize 模块现在使用bytes 工作。主要的入口点不再是generate_tokens,而是tokenize.tokenize()9.其它1)xrange()改名为 range(),要想使用range()获得一个list,必须显式调用:list(range(10)0,1,2,3,4,5,6,7,8,9 2)bytes 对象不能hash,也不支持b.lower()、b.strip()和 b.split()方法,但对于后两者可以使用b.strip(b ntr f)和 b.split(b
12、 )来达到相同目的3)zip()、map()和 filter()都返回迭代器。而apply()、callable()、coerce()、execfile()、reduce()和 reload()函数都被去除了现在可以使用hasattr()来替换callable().hasattr()的语法如:hasattr(string,_name_)4)string.letters 和相关的.lowercase 和.uppercase 被去除,请改用string.ascii_letters 等5)如果 x file 在 Py3.X中:file Traceback(most recent call last)
13、:File,line 1,in file NameError:name file is not defined 使用2to3将代码移植到 PYTHON 3 概述#几乎所有的 Python 2程序都需要一些修改才能正常地运行在Python 3的环境下。为了简化这个转换过程,Python 3自带了一个叫做2to3的实用脚本(Utility Script),这个脚本会将你的Python 2程序源文件作为输入,然后自动将其转换到Python 3的形式。案例研究:将chardet移植到 Python 3(porting chardet to Python 3)描述了如何运行这个脚本,然后展示了一些它不能
14、自动修复的情况。这篇附录描述了它能够自动修复的内容。print语句#在 Python 2里,print是一个语句。无论你想输出什么,只要将它们放在print关键字后边就可以。在 Python 3里,print()是一个函数。就像其他的函数一样,print()需要你将想要输出的东西作为参数传给它。Notes Python 2 Python 3 printprint()print1print(1)print1,2print(1,2)print1,2,print(1,2,end=)printsys.stderr,1,2,3print(1,2,3,file=sys.stderr)1.为输出一个空白行,
15、需要调用不带参数的print()。2.为输出一个单独的值,需要将这这个值作为print()的一个参数就可以了。3.为输出使用一个空格分隔的两个值,用两个参数调用print()即可。4.这个例子有一些技巧。在Python 2里,如果你使用一个逗号(,)作为print语句的结尾,它将会用空格分隔输出的结果,然后在输出一个尾随的空格(trailing space),而不输出回车(carriage return)。在Python 3里,通过把end=作为一个关键字参数传给print()可以实现同样的效果。参数end的默认值为n,所以通过重新指定end参数的值,可以取消在末尾输出回车符。5.在 Pyth
16、on 2里,你可以通过使用pipe_name语法,把输出重定向到一个管道,比如sys.stderr。在 Python 3里,你可以通过将管道作为关键字参数file的值传递给print()来完成同样的功能。参数file的默认值为std.stdout,所以重新指定它的值将会使print()输出到一个另外一个管道。UNICODE字符串#Python 2有两种字符串类型:Unicode字符串和非 Unicode 字符串。Python 3 只有一种类型:Unicode字符串(Unicode strings)。Notes Python 2 Python 3 uPapayaWhipPapayaWhip ur
17、 PapayaWhipfoor PapayaWhipfoo1.Python 2里的 Unicode 字符串在 Python 3里即普通字符串,因为在 Python 3里字符串总是 Unicode形式的。2.Unicode 原始字符串(raw string)(使用这种字符串,Python 不会自动转义反斜线)也被替换为普通的字符串,因为在Python 3里,所有原始字符串都是以Unicode 编码的。全局函数unicode()#Python 2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成 Unicode 字符串,还有str()把对象转换为非Unicode 字符串。Py
18、thon 3只有一种字符串类型,Unicode 字符串,所以str()函数即可完成所有的功能。(unicode()函数在 Python 3 里不再存在了。)Notes Python 2 Python 3 unicode(anything)str(anything)long长整型#Python 2有为非浮点数准备的int和long类型。int类型的最大值不能超过sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在 Python 3里,只有一种整数类型int,大多数情况下,它很像Python 2 里的长整型。由于已
19、经不存在两种类型的整数,所以就没有必要使用特殊的语法去区别他们。进一步阅读:pep 237:统一长整型和整型。Notes Python 2 Python 3 x=1000000000000Lx=1000000000000 x=0 xFFFFFFFFFFFFLx=0 xFFFFFFFFFFFF long(x)int(x)type(x)islongtype(x)isint isinstance(x,long)isinstance(x,int)1.在 Python 2里的十进制长整型在Python 3 里被替换为十进制的普通整数。2.在 Python 2里的十六进制长整型在Python 3 里被替换
20、为十六进制的普通整数。3.在 Python 3里,由于长整型已经不存在了,自然原来的long()函数也没有了。为了强制转换一个变量到整型,可以使用int()函数。4.检查一个变量是否是整型,获得它的数据类型,并与一个int类型(不是long)的作比较。5.你也可以使用isinstance()函数来检查数据类型;再强调一次,使用int,而不是long,来检查整数类型。比较运算符#Python 2支持作为!=的同义词。Python 3只支持!=,不再支持 了。Notes Python 2 Python 3 if x y:if x!=y:if x y z:if x!=y!=z:1.简单地比较。2.相
21、对复杂的三个值之间的比较。字典类方法has_key()#在 Python 2里,字典对象的has_key()方法用来测试字典是否包含特定的键(key)。Python 3不再支持这个方法了。你需要使用in运算符。Notes Python 2 Python 3 a_dictionary.has_key(PapayaWhip)PapayaWhipin a_dictionary a_dictionary.has_key(x)or a_dictionary.has_key(y)x in a_dictionary or y in a_dictionary a_dictionary.has_key(x or
22、 y)(x or y)in a_dictionary a_dictionary.has_key(x+y)(x+y)in a_dictionary x+a_dictionary.has_key(y)x+(y in a_dictionary)1.最简单的形式。2.运算符or的优先级高于运算符in,所以这里不需要添加括号。3.另一方面,出于同样的原因 or的优先级大于in,这里需要添加括号。(注意:这里的代码与前面那行完全不同。Python会先解释x or y,得到结果x(如果x在布尔上下文里的值是真)或者y。然后 Python检查这个结果是不是a_dictionary的一个键。)4.运算符in的优
23、先级大于运算符+,所以代码里的这种形式从技术上说不需要括号,但是2to3还是添加了。5.这种形式一定需要括号,因为in的优先级大于+。返回列表的字典类方法#在 Python 2里,许多字典类方法的返回值是列表。其中最常用方法的有keys,items和values。在 Python 3 里,所有以上方法的返回值改为动态视图(dynamic view)。在一些上下文环境里,这种改变并不会产生影响。如果这些方法的返回值被立即传递给另外一个函数,并且那个函数会遍历整个序列,那么以上方法的返回值是列表或者视图并不会产生什么不同。在另外一些情况下,Python 3的这些改变干系重大。如果你期待一个能被独立
24、寻址元素的列表,那么Python 3的这些改变将会使你的代码卡住(choke),因为视图(view)不支持索引(indexing)。Notes Python 2 Python 3 a_dictionary.keys()list(a_dictionary.keys()a_dictionary.items()list(a_dictionary.items()a_dictionary.iterkeys()iter(a_dictionary.keys()i for i in a_dictionary.iterkeys()i for i in a_dictionary.keys()min(a_dicti
25、onary.keys()no change1.使用list()函数将keys()的返回值转换为一个静态列表,出于安全方面的考量,2to3可能会报错。这样的代码是有效的,但是对于使用视图来说,它的效率低一些。你应该检查转换后的代码,看看是否一定需要列表,也许视图也能完成同样的工作。2.这是另外一种视图(关于items()方法的)到列表的转换。2to3对values()方法返回值的转换也是一样的。3.Python 3里不再支持iterkeys()了。如果必要,使用iter()将keys()的返回值转换成为一个迭代器。4.2to3能够识别出iterkeys()方法在列表解析里被使用,然后将它转换为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python3 Python2 区别
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内