Python 2和3的区别

Python 3.x介绍的一些Python 2不兼容的关键字和特性可以通过在Python 2的内部__future__模块导入。

基本点,range,新式类,mro,asyncio。

0,字符串类型统一,只有str和bytes(字节序列)。Python2 的默认编码是 asscii(原因在于 Python这门语言诞生的时候还没出现 Unicode),3默认编码是 utf-8。外部IO 拿到的都是bytes。

1,print,3统一加小括号,在3中是一个系统调用函数,2不加,在2中是一个声明,而不是一个函数

2,不强制所有类型从int 到str或从 visa 到 str,如果比较不同类型会抛出报错信息

3,整数相除,在Python 2中,3/2的结果是整数,在Python 3中,结果则是浮点数

4,在3中,变量前面加 * 号表示接收溢出值,且位置没有限制,但一定要放在关键字参数或者**前面。

5,异常处理,在 3中现在使用as作为关键词,且可以对异常做异常链处理,一层一层向外抛出

6,在3中for循环不会再导致命名空间泄漏。比如for循环之后的值会赋值到名字相同的全局变量。

7,Python2 中的 range 和 xrange 函数合并成了 range,在2中,range返回一个list,xrange返回一个iterator。3中全部返回可迭代对象。应用如2中for循环的复杂度指数型增加,3中线形增加。

8,字典不再支持has_key方法,使用in方法。

9,nonlocal,声明非局部变量,从嵌套关系中依次向外寻找,不会声明全局变量。

10, yield from,将生成器重构为子生成器,通过委托生成器使调用方和子生成器建立双向的联系,依次接收子生成器的返回值。在协程中可以将所有IO抛给子生成器处理。并保存函数之间的调用状态。

11,asyncio模块,非常强大的模块。使用新的协同特性和保存的生成器状态来进行异步IO。coroutine对象,只需要声明async 和 await即可。

12,标准库的添加,faulthandler,Display (limited) tracebacks;ipaddress,处理ip地址;enum,枚举;Pathlib,不需要通过os模块使用path,而是直接使用pathlib模块导入path,语法更精简

考虑,新的特性和语法有没有对现有开发模式产生足够积极作用。 性能有没有提高的足够多。迁移成本是不是可以接受。

原文地址:https://www.cnblogs.com/wang-kai-1994/p/10374976.html