Python 2.x与Python 3.x版本区别

0. 背景
相较于Python 2.x,Python 3.x的变化主要从以下几个方面介绍:核心类差异、废弃类差异、修改类差异。

1.核心类差异
1.1 Python3对Unicode字符的原生支持,只支持unicode的string;Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str和unicode。
1.2 Python3采用的是绝对路径的方式进行import;Python2中相对路径的import。
1.3 Python2中存在老式类和新式类的区别;Python3统一采用新式类,新式类声明要求继承object,必须用新式类应用多重继承。
1.4 Python3使用更加严格的缩进,tab和space共存会导致报错;Python2的缩进机制中,1个tab和8个space是等价的,允许tab和space在代码中共存。

2. 废弃类差异
2.1 print语句被python3废弃,统一使用print函数
2.2 exec语句被python3废弃,统一使用exec函数
2.3 execfile语句被Python3废弃,推荐使用exec(open("./filename").read())
2.4 不相等操作符"<>“被Python3废弃,统一使用”!="
2.5 long整数类型被Python3废弃,统一使用int
2.6 xrange函数被Python3废弃,统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率
2.7 Python3中这些方法再不再返回list对象,而是可迭代对象:dictionary关联的keys()、values()、items(),和高阶函数zip(),map(),filter(),但是可以通过list强行转换
2.8 迭代器iterator的next()函数被Python3废弃,统一使用next(iterator)
2.9 raw_input函数被Python3废弃,统一使用input函数
2.10 字典变量的has_key函数被Python废弃,统一使用in关键词
2.11 file函数被Python3废弃,统一使用open来处理文件,可以通过io.IOBase检查文件类型
2.12 apply函数被Python3废弃
2.13 异常StandardError 被Python3废弃,统一使用Exception

3. 修改类差异
3.1 浮点数除法操作符/和//区别
Python2:/是整数除法,//是小数除法
Python3:/是小数除法,//是整数除法。

3.2 异常抛出和捕捉机制区别
Python2:raise IOError, “file error” #抛出异常, except NameError, err: #捕捉异常
Python3:raise IOError(“file error”) #抛出异常, except NameError as err: #捕捉异常

3.3 for循环中变量值区别
Python2:for循环会修改外部相同名称变量的值
Python3,for循环不会修改外部相同名称变量的值

3.4 round函数返回值区别
Python2:round函数返回int类型值,举例:isinstance(round(15.5),int) #True
Python3,round函数返回float类型值,举例:isinstance(round(15.5),float) #True

3.5 比较操作符区别
Python2:任意两个对象都可以比较,举例:11 < ‘test’ #True
Python3:只有同一数据类型的对象可以比较,举例:11 < ‘test’ # TypeError: unorderable types: int() < str()

4. Python2.x与3.x区别的具体举例&其他区别
4.1-1.1 Unicode字符串
(1)UNICODE字符串
Python 2.x:Unicode字符串和非Unicode字符串类型,默认ASCII编码,以 8-bit 字符串存储
Python 3.x:仅Unicode字符串类型,源码文件默认使用utf-8编码,以 16-bit Unicode 字符串存储

举例:
Python 2.x

>>> sys.getdefaultencoding()
'ascii'
Python 3.x

>>> sys.getdefaultencoding()
'utf-8'

(2)全局函数UNICODE()
Python 2.x:有两个全局函数把对象强制转换成字符串:unicode()把对象转换成unicode字符串,还有str()把对象转换为非Unicode字符串。 encode() (str -> bytes) 或 .decode() (bytes -> str)方法相互转化
Python 3.x:只有unicode字符串,所以仅有str()函数即可

举例:

Python 2.x
>>> '张三'  #python2 会自动将字符串转换为合适编码的字节字符串
'\xe5\xbc\xa0\xe4\xbf\x8a' #自动转换为utf-8编码的字节字符串
>>> u'张三'  #显式指定字符串类型为unicode类型(无编码),保存的是字符在unicode字符集中的代码序号
u'\u5f20\u4fca'
>>> '张三'.decode('utf-8')  #python2 可以正常解码,返回的字符串类型是无编码的unicode类型
u'\u5f20\u4fca'
>>> b'张三'   # ‘张三' 已被python2转换为utf-8编码,因此已为字节字符串
'\xe5\xbc\xa0\xe4\xbf\x8a'
Python 3.x
>>> '张三'  #字符串默认为unicode格式(无编码)
'张三'
>>> type('张三')  #严格区分文本字符串和字节字符串,默认为unicode格式的文本字符串
<class 'str'>
>>> '张三'.encode('utf-8')  #将文本字符串编码,转换为已编码的字节字符串类型
b'\xe5\xbc\xa0\xe4\xbf\x8a'
>>> type('张三'.encode('utf-8'))
<class 'bytes'>
>>> print ('张三'.encode('utf-8'))  #对于已编码的字节字符串,文本字符串的许多特性和方法已经不能使用。
b'\xe5\xbc\xa0\xe4\xbf\x8a'
>>> print ('张三'.encode('utf-8').decode('utf-8'))  #必须将字节字符串解码后才能打印出来
张三

4.2-2.1 print
Python 2.x:print语句,作为class
Python 3.x:print()函数,括号中为对象

举例:
Python 2.x
>>> print "fish"
fish

Python 3.x
>>> print("fish")
fish

4.3-2.4 不等运算符
Python 2.x:不等于有两种写法 != 和 <>
Python 3.x:去掉了<>, 只有!=一种写法

4.4-2.6 xrange
Python 2.x:xrange()创建迭代对象是一个生成器,数据生成一个取出一个。
Python 3.x:range() 是像 xrange() 那样实现,以至于一个专门的 xrange() 函数都不再存在, xrange() 会抛出命名异常。

举例:
Python 2.x 的 range( 0, 4 ) = = Python 3.x的list( range(0,4) ),结果为列表 [0,1,2,3 ]
Python 2.x 的 xrange( 0, 4 ) = = Python 3.x的 range(0,4)

4.5-2.7 map、filter 和 reduce函数
Python 2.x:都是 built-in function内置函数,输出的结果类型都是列表
Python 3.x:map、filter函数都是class类,输出的结果变为一个迭代器对象;reduce 函数变到functools 模块中

举例:

Python 2.x
>>> map
<built-in function map>
>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]

Python 3.x
>>> map
<class 'map'>
>>> map(lambda x:x *2, [1,2,3])
<map object at 0x00000000021CB3C8>

4.6-2.9 input()
Python 2.x:input的到的为int型,raw_input得到的为str型
Python 3.x:仅input得到的为str型

举例:

Python 2.x:
>>> my_input = input('enter a number: ') 
enter a number: 123
>>> type(my_input)
<type 'int'>
>>> my_input = raw_input('enter a number: ')
enter a number: 123
>>> type(my_input)
<type 'str'> 

Python 3.x:
>>>my_input = input('enter a number: ')
enter a number: 123
>>> type(my_input)
<class 'str'>

4.7-2.11 打开文件
Python 2.x:file( … ) 或 open(…)
Python 3.x:只能用 open(…)

4.8-3.1 除法运算
Python中的除法有两个运算符,/和//。
Python2:带上小数点/表示真除,%表示取余,//结果取整;
Python3:/表示真除,%表示取余,//结果取整;

(1)/除法:
在Python 2.x中,整数相除的结果是一个整数,把小数部分完全忽略掉;浮点数除法会保留小数点的部分得到一个浮点数的结果。
在Python 3.x中,对于整数之间的相除,结果也会是浮点数。

举例:

Python 2.x
>>> 1 / 2
0
>>> 1.0 / 2.0
0.5

Python 3.x
>>> 1/2
0.5
注:python 3.x如果要截取整数部分,那么需要使用 math 模块的 trunc 函数

>>> import math
>>> math.trunc(1 / 2)
0

(2)//除法:python 2.x和python 3.x中是一致的。

Python 2.x
>>> -1 // 2
-1

Python 3.x
>>> -1 // 2
-1
注:并不是舍弃小数部分,而是执行 floor 操作(floor除法:“向下取整”)

4.9-3.2 异常
Python 2.x:捕获异常的语法 except exc, var。异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情。
Python 3.x:捕获异常的语法 except exc as var。异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。

4.10 八进制字面量表示
Python 2.x:0o777形式或者0777形式

Python 3.x:仅0o777形式

举例:

Python 2.x
>>> 0o1000
512
>>> 01000
512

Python 3.x
>>> 01000
File "", line 1
01000^
SyntaxError: invalid token
>>> 0o1000
512

4.11 reload(sys)
背景了解:python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报错UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x?? in position 1: ordinal not in range(128),python没办法处理非ascii编码的,此时需要自己设置python的默认编码,一般设置为utf8的编码格式。

Python 2.x:由于str和byte之间没有明显区别,经常要依赖于defaultencoding来做转换
Python 3.x:str和byte类型有明确的区别,类型转换要显式指定encoding。sys去掉setdefaultencoding了。

举例:

Python 2.x
import sys
reload(sys)
sys.setdefaultencoding(‘utf-8’)

Python 3.x
import importlib,sys
importlib.reload(sys)

4.12 库
(1)库的变化

Python 2.x 的 urllib、urilib2两个库 == Python 3.x的 urllib库

Python 2.x 的 urllib2.urlopen() == Python 3.x的 urllib.request.urlopen()

Python 2.x 的 urllib2.Request() == Python 3.x的 urllib.request.Request()

Python 2.x 的 urllib.quote(text) == Python 3.x的 urllib.parse.quote(text)

Python 2.x 的 urllib.urlencode == Python 3.x的 urllib.parse.urlencode

Python 2.x 的 urllib2() == Python 3.x的 urllib.request

Python 2.x 的 urlparse() == Python 3.x的 urllib.parse

Python 2.x 的 cStringIO == Python 3.x的 io

Python 2.x 的 httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib == Python 3.x的 http

(2)模块改名
Python 2.x 的 _winreg == Python 3.x的 winreg

Python 2.x 的 ConfigParser == Python 3.x的 configparser

Python 2.x 的 copy_reg == Python 3.x的 copyreg

Python 2.x 的 Queue == Python 3.x的 queue

Python 2.x 的 SocketServer == Python 3.x的 socketserver

Python 2.x 的 repr == Python 3.x的 reprlib

(3)模块删除
new, md5, gopherlib等模块被删除。

参考链接:https://www.cnblogs.com/meng-wei-zhi/articles/8194849.html

你可能感兴趣的:(Python 2.x与Python 3.x版本区别)