Python3和Python2的区别
Python 发展到现在,经历了多个版本。截至本文发布时,Python 最新版本为 3.8。
需要注意的是,Python 3.x 不再兼容现有的 2.x 程序。可根据实际需要选择使用的版本,当然,选择较新的版本有利于以后软件升级。
作为一个开源软件,Python 拥有一个参与者众多的开发社区,它保持 Python 的不断更新和改进。Python 的开发者通过一个在线的源代码控制系统协同工作,所有对 Python 的修改必须遵循 PEP(Python Enhancement Proposal,Python 改进提案),并通过 Python 扩展回归测试系统的测试。
目前,由一个非正式的组织 PSF(Python Software Foundation,Python软件基金)负责组织会议并处理 Python 的知识产权问题。
Python 3.x 与 2.x 的主要区别如下:
在 3.x 中,字典的 keys()、items() 和 values() 方法用返回视图代替了列表,不再支持 2.x 中的 iterkeys()、iteritems() 和 itervalues();在 3.x 中,map、filter 和 zip 函数用返回迭代器代替了列表。
在 Python 3.x 中,字符默认为 unicode 字符,即双字节字符。字符串的数据类型分为 str 和 bytes 两种。仍可使用字符串前缀“u”或“U”,但会被忽略。
在 Python 3.x 中,字符串前缀“b”或“B”表示二进制字符串,其类型为 bytes。
Python 2.x 的 open 函数返回的是 file 类型的对象。
需要注意的是,Python 3.x 不再兼容现有的 2.x 程序。可根据实际需要选择使用的版本,当然,选择较新的版本有利于以后软件升级。
作为一个开源软件,Python 拥有一个参与者众多的开发社区,它保持 Python 的不断更新和改进。Python 的开发者通过一个在线的源代码控制系统协同工作,所有对 Python 的修改必须遵循 PEP(Python Enhancement Proposal,Python 改进提案),并通过 Python 扩展回归测试系统的测试。
目前,由一个非正式的组织 PSF(Python Software Foundation,Python软件基金)负责组织会议并处理 Python 的知识产权问题。
Python 3.x 与 2.x 的主要区别如下:
1) Python 3.x默认使用UTF-8编码
Python 3.x 源代码中的字符默认使用 UTF-8 编码,可以很好地支持中文或其他非英文字符。例如,在 Python 3.x 中可使用汉字作为变量名;在 Python 2.x 中不能使用汉字作为变量名,否则会出错。2) print函数代替了print语句
在 Python 3.x 中,调用 print 函数来输出数据;在 Python 2.x 中则使用 print 语句。3) 完全面向对象
在 Python 2.x 中的各种数据类型,在 3.x 中全面升级为类(Class)。例如,在 Python 2.x 中输出 int 数据类型 print int 的结果是 <type'int'>,在 Python 3.x 中输出 int 数据类型:print(int) 的结果是 <class'int'>。4) 用视图和迭代器代替了列表
常用方法或函数在 Python 2.x 中返回列表,在 3.x 中有很多改变。在 3.x 中,字典的 keys()、items() 和 values() 方法用返回视图代替了列表,不再支持 2.x 中的 iterkeys()、iteritems() 和 itervalues();在 3.x 中,map、filter 和 zip 函数用返回迭代器代替了列表。
5) 比较运算中的改变
比较运算的主要改变如下:- 用 != 代替了 <>;
- 比较运算 <、<=、>= 和 > 在无法比较两个数据大小顺序时,会产生 TypeError 异常;
- 在 Python 2.x 中,1<"、0>None、len<=len 等运算返回 False,而在 3.x 中则产生 TypeError 异常;
- 在 == 和 != 中,不兼容类型的数据视为不相等。
6) 整数类型的改变
整数类型的主要改变如下:- 取消了 long 类型,整数类型只有 int 一种。不再支持用后缀 l 或 L 表示长整数;
- 在 Python 3.x 中,/(除法)运算返回浮点数(float 类型)。2.x 中两个整数的/运算返回整数(截断了小数部分);
- 整数不再限制大小,删除 sys 模块中的 maxint(最大整数)常量;
- 不再支持以数字 0 开头的八进制常量(如 012),而改成用前缀“0o”表示(如 0o12);
7) 字符串的改变
在 Python 2.x 中,字符串中的字符默认为单字节(8 位),字符串的类型可分为 str 和 unicode 两种。带前缀“u”或“U”的字符串为 unicode 类型,其他的字符(包含带前缀“b”“B”,“r”或“R”的字符串)为 str 类型。所有的字符串在输出时会将包含的字符直接输出。在 Python 3.x 中,字符默认为 unicode 字符,即双字节字符。字符串的数据类型分为 str 和 bytes 两种。仍可使用字符串前缀“u”或“U”,但会被忽略。
在 Python 3.x 中,字符串前缀“b”或“B”表示二进制字符串,其类型为 bytes。
8) 取消了file数据类型
Python 3.x 取消了 2.x 中的 file 数据类型。使用 open 函数打开文件时,返回的是 IOTextWrapper 类的实例对象。Python 2.x 的 open 函数返回的是 file 类型的对象。
9) 异常处理的改变
在 Python 3.x 中,异常处理的改变主要如下:- 所有异常都从 BaseException 继承,并删除了 StandardError 异常;
- 取消了异常类的序列行为和 .message 属性;
- 用 raise Exception(args)代替 raise Exception,args 语法;
- 捕获异常的语法改变,引入了 as 关键字。
10) 其他主要的语法改变
其他主要的语法改变如下:- 加入了关键字“as”和“with”;
- 增加了常量“True”“False”和“None”;
- 加入 nonlocal 语句。使用 nonlocal x 声明 x 为函数外部的变量;
- 删除了 raw_input() 方法。用 input 函数代替;
- 去除元组参数解包。不能像 def(a,(b,c)):pass 这样定义函数了;
- 增加了二进制数,如'0b111'。bin 函数可返回整数的二进制字符串;
- 扩展了可迭代解包。在 Python 3.x 里,“a,b,*x=seq”和“*x,a=seq”都是合法的,只要求两点“x”是 list;
- 对象和“seq”是可迭代的;
- 面向对象引入了抽象基类;
- 类的迭代器方法 next() 改名为__next__(),并增加内置函数 next,用以调用迭代器的__next__() 方法。