1.1.4 Python 3与Python 2的区别

1.1.4 Python 3与Python 2的区别

Python 3与Python 2的主要区别如下。

1.Python 3中的文本使用Unicode编码

Python 3中的字符默认使用Unicode编码(UTF-8),其可以很好地支持中文或其他非英文字符,示例代码如下。

>>> 长度=100         #汉字作为变量名

>>> print(长度)

100

在Python 3中,不需要使用“u”或“U”前缀表示Unicode字符,但二进制字符串必须使用“b”或“B”前缀。Python 2中不能使用汉字作为变量名,否则会出错,示例代码如下。

>>> 速度=100

File "<stdin>", line 1

速度=100

^

SyntaxError: invalid syntax

2.print()函数代替了print语句

Python 3使用print()函数来输出数据,示例代码如下。

>>> x=100

>>> print(10,'abc',x)

10 abc 100

Python 2使用print语句输出数据,示例代码如下。

>>> x=100

>>> print 10,'abc',x

10 abc 100

>>> print(10,'abc',x)       #print语句将(10,'abc',x)作为一个元组输出

(10, 'abc', 100)

3.完全的面向对象

Python 2中的各种数据类型,在Python 3中全面升级为类(class)。例如,在Python 2中测试数据类型结果如下。

>>> int,float,str

(<type 'int'>, <type 'float'>, <type 'str'>)

在Python 3中测试数据类型结果如下。

>>> int,float,str

(<class 'int'>, <class 'float'>, <class 'str'>)

4.部分方法和函数用视图和迭代器代替了列表

下面的方法或函数在Python 2中返回列表,在Python 3中则返回视图或迭代器。

● 字典的keys()、items()和values()方法用返回视图代替了列表。不再支持Python 2中的iterkeys()、iteritems()和itervalues()。

● map()、filter()和zip()函数用返回迭代器代替了列表。

5.比较运算中的改变

比较运算的主要改变如下。

● 用“!=”代替了“<>”。

● 比较运算“<”“<=”“>=”和“>”在无法比较两个数据大小时,会产生TypeError异常。

● 在Python 2中,“1 < ''”“0 > None”“len <= len”等运算返回True,而在Python 3中则会产生TypeError异常。

● 在判断运算“==”和“!=”中,类型不兼容的数据视为不相等。

6.整数类型的改变

整数类型的主要改变如下。

● 不再有长整数(long)的概念,整数类型只有int一种。

● 在Python 3中,除法运算“/”返回浮点数(float),除法运算“//”只保留整数部分。Python 2在两个整数的除法运算“/”中返回整数(截断了小数部分)。

● 整数不再限制大小,删除了sys模块中的maxint(最大整数)常量。

● 不再支持以数字0开头的八进制常量(如012),而改为用前缀“0o”表示(如0o12)。

7.字符串的改变

在Python 2中,字符串中的字符默认为单字节,字符串的类型有str和unicode两种。带前缀“u”或“U”的Unicode字符串的类型为unicode(注意首字母小写),其他字符串(包含带前缀“b”“B”“r”或“R”的字符串)为str类型。

在Python 3中,字符默认为Unicode字符,即双字节字符。字符串的数据类型分为str和bytes两种。仍可使用字符串前缀“u”或“U”,但会被忽略。字符串前缀“b”或“B”表示二进制字符串,其类型为bytes。

8.取消了file数据类型

Python3取消了Python2中的file数据类型。使用open()函数打开文件时,返回的是_io.TextIOWrapper类的实例对象,示例代码如下。

>>> f=open('d:/test.txt','w')

>>> type(f)

<class '_io.TextIOWrapper'>

Python 2的open()函数返回的是file类型的对象,示例代码如下。

>>> f=open('d:/test.txt','w')

>>> type(f)

<type 'file'>

9.异常处理的改变

在Python 3中,异常处理的改变主要如下。

● BaseException是所有异常类的基类,删除了StardardError异常。

● 取消了异常类的序列行为和message属性。

● 用raise Exception(args)代替raise Exception,args语法。

● 在捕获异常的except语句中引入了as关键字。

在Python 2中,用下面的代码捕捉和处理异常。

>>> try:

...  raise TypeError,’类型错误’

...except TypeError,err:

...  print err.message

...

类型错误

在Python 3中,用下面的代码捕捉和处理异常。

>>> try:

...   raise TypeError(’类型错误’)

...except TypeError as err:

...  print(err)

...

类型错误

10.其他主要的语法改变

其他主要的语法改变如下。

● 增加了关键字as和with。

● 增加了常量True、False、None。

● 加入nonlocal语句。使用noclocal x声明x为函数外部的变量。

● 删除了raw_input(),代之以input()。

● 删除了元组参数解包。不能用类似def(a, (b, c)):pass的语句定义函数。

● 增加了二进制字面量,如“b'0110110110'”。bin()函数可返回整数的二进制字符串。

● 扩展的可迭代解包。在Python 3中,“a, b, *x = '1234'”和“*x, a = '1234'”都是合法的。

● 对象和序列是可迭代的。

● 面向对象引入了抽象基类。

● 类的迭代器方法next()改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法。