1. 程式人生 > >python2和python3的差別

python2和python3的差別

概述#

幾乎所有的Python 2程式都需要一些修改才能正常地執行在Python 3的環境下。為了簡化這個轉換過程,Python 3自帶了一個叫做2to3的實用指令碼(Utility Script),這個指令碼會將你的Python 2程式原始檔作為輸入,然後自動將其轉換到Python 3的形式。案例研究:將chardet移植到Python 3(porting chardet to Python 3)描述瞭如何執行這個指令碼,然後展示了一些它不能自動修復的情況。這篇附錄描述了它能夠自動修復的內容。

print語句#

在Python 2裡,print是一個語句。無論你想輸出什麼,只要將它們放在print

關鍵字後邊就可以。在Python 3裡,print()是一個函式。就像其他的函式一樣,print()需要你將想要輸出的東西作為引數傳給它。

NotesPython 2Python 3
printprint()
print1print(1)
print1,2print(1,2)
print1,2,print(1,2,end=' ')
print>>sys.stderr,1,2,3print(1,2,3, file=sys.stderr)
  1. 為輸出一個空白行,需要呼叫不帶引數的print()
  2. 為輸出一個單獨的值,需要將這這個值作為print()的一個引數就可以了。
  3. 為輸出使用一個空格分隔的兩個值,用兩個引數呼叫print()
    即可。
  4. 這個例子有一些技巧。在Python 2裡,如果你使用一個逗號(,)作為print語句的結尾,它將會用空格分隔輸出的結果,然後在輸出一個尾隨的空格(trailing space),而不輸出回車(carriage return)。在Python 3裡,通過把end=' '作為一個關鍵字引數傳給print()可以實現同樣的效果。引數end的預設值為'\n',所以通過重新指定end引數的值,可以取消在末尾輸出回車符。
  5. 在Python 2裡,你可以通過使用>>pipe_name語法,把輸出重定向到一個管道,比如sys.stderr。在Python 3裡,你可以通過將管道作為關鍵字引數file
    的值傳遞給print()來完成同樣的功能。引數file的預設值為std.stdout,所以重新指定它的值將會使print()輸出到一個另外一個管道。

Unicode字串#

Python 2有兩種字串型別:Unicode字串和非Unicode字串。Python 3只有一種型別:Unicode字串(Unicode strings)

NotesPython 2Python 3
u'PapayaWhip''PapayaWhip'
ur'PapayaWhip\foo'r'PapayaWhip\foo'
  1. Python 2裡的Unicode字串在Python 3裡即普通字串,因為在Python 3裡字串總是Unicode形式的。
  2. Unicode原始字串(raw string)(使用這種字串,Python不會自動轉義反斜線"\")也被替換為普通的字串,因為在Python 3裡,所有原始字串都是以Unicode編碼的。

全域性函式unicode()#

Python 2有兩個全域性函式可以把物件強制轉換成字串:unicode()把物件轉換成Unicode字串,還有str()把物件轉換為非Unicode字串。Python 3只有一種字串型別,Unicode字串,所以str()函式即可完成所有的功能。(unicode()函式在Python 3裡不再存在了。)

NotesPython 2Python 3
unicode(anything)str(anything)

long 長整型#

Python 2有為非浮點數準備的intlong型別。int型別的最大值不能超過sys.maxint,而且這個最大值是平臺相關的。可以通過在數字的末尾附上一個L來定義長整型,顯然,它比int型別表示的數字範圍更大。在Python 3裡,只有一種整數型別int,大多數情況下,它很像Python 2裡的長整型。由於已經不存在兩種型別的整數,所以就沒有必要使用特殊的語法去區別他們。

NotesPython 2Python 3
=1000000000000L=1000000000000
=0xFFFFFFFFFFFFL=0xFFFFFFFFFFFF
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裡被替換為十六進位制的普通整數。
  3. 在Python 3裡,由於長整型已經不存在了,自然原來的long()函式也沒有了。為了強制轉換一個變數到整型,可以使用int()函式。
  4. 檢查一個變數是否是整型,獲得它的資料型別,並與一個int型別(不是long)的作比較。
  5. 你也可以使用isinstance()函式來檢查資料型別;再強調一次,使用int,而不是long,來檢查整數型別。

<> 比較運算子#

Python 2支援<>作為!=的同義詞。Python 3只支援!=,不再支援<>了。

NotesPython 2Python 3
if x <> y:if x != y:
if x <> y<> z:if x != y!= z:
  1. 簡單地比較。
  2. 相對複雜的三個值之間的比較。

字典類方法has_key()#

在Python 2裡,字典物件的has_key()方法用來測試字典是否包含特定的鍵(key)。Python 3不再支援這個方法了。你需要使用in運算子

NotesPython 2Python 3
a_dictionary.has_key('PapayaWhip')'PapayaWhip'in a_dictionary
a_dictionary.has_key(x)or a_dictionary.has_key(y)in a_dictionaryor y in a_dictionary
a_dictionary.has_key(xor y)(or y)in a_dictionary
a_dictionary.has_key(x+ y)(+ y)in a_dictionary
+ a_dictionary.has_key(y)+(in a_dictionary)
  1. 最簡單的形式。
  2. 運算子or的優先順序高於運算子in,所以這裡不需要新增括號。
  3. 另一方面,出於同樣的原因 — or的優先順序大於in,這裡需要新增括號。(注意:這裡的程式碼與前面那行完全不同。Python會先解釋x or y,得到結果x(如果x在布林上下文裡的值是真)或者y。然後Python檢查這個結果是不是a_dictionary的一個鍵。)
  4. 運算子in的優先順序大於運算子+,所以程式碼裡的這種形式從技術上說不需要括號,但是2to3還是添加了。
  5. 這種形式一定需要括號,因為in的優先順序大於+

返回列表的字典類方法#

在Python 2裡,許多字典類方法的返回值是列表。其中最常用方法的有keysitemsvalues。在Python 3裡,所有以上方法的返回值改為動態檢視(dynamic view)。在一些上下文環境裡,這種改變並不會產生影響。如果這些方法的返回值被立即傳遞給另外一個函式,並且那個函式會遍歷整個序列,那麼以上方法的返回值是列表或者檢視並不會產生什麼不同。在另外一些情況下,Python 3的這些改變干係重大。如果你期待一個能被獨立定址元素的列表,那麼Python 3的這些改變將會使你的程式碼卡住(choke),因為檢視(view)不支援索引(indexing)。

NotesPython 2Python 3
a_dictionary.keys()list(a_dictionary.keys())
a_dictionary.items()list(a_dictionary.items())
a_dictionary.iterkeys()iter(a_dictionary.keys())
[for iin a_dictionary.iterkeys()][for iin a_dictionary.keys()]
min(a_dictionary.keys())no change
  1. 使用list()函式將keys()的返回值轉換為一個靜態列表,出於安全方面的考量,2to3可能會報錯。這樣的程式碼是有效的,但是對於使用檢視來說,它的效率低一些。你應該檢查轉換後的程式碼,看看是否一定需要列表,也許檢視也能完成同樣的工作。
  2. 這是另外一種檢視(關於items()方法的)到列表的轉換。2to3values()方法返回值的轉換也是一樣的。
  3. Python 3裡不再支援iterkeys()了。如果必要,使用iter()keys()的返回值轉換成為一個迭代器。
  4. 2to3能夠識別出iterkeys()方法在列表解析裡被使用,然後將它轉換為Python 3裡的keys()方法(不需要使用額外的iter()去包裝其返回值)。這樣是可行的,因為檢視是可迭代的。
  5. 2to3也能識別出keys()方法的返回值被立即傳給另外一個會遍歷整個序列的函式,所以也就沒有必要先把keys()的返回值轉換到一個列表。相反的,min()函式會很樂意遍歷檢視。這個過程對min()max()sum()list()tuple()set()sorted()any()all()同樣有效。

被重新命名或者重新組織的模組#

從Python 2到Python 3,標準庫裡的一些模組已經被重新命名了。還有一些相互關聯的模組也被組合或者重新組織,以使得這種關聯更有邏輯性。

http#

在Python 3裡,幾個相關的HTTP模組被組合成一個單獨的包,即http

NotesPython 2Python 3
importhttplibimport http.client
importCookieimport http.cookies
importcookielibimport http.cookiejar
importBaseHTTPServerimportSimpleHTTPServerimportCGIHttpServer
import http.server
  1. http.client模組實現了一個底層的庫,可以用來請求HTTP資源,解析HTTP響應。
  2. http.cookies模組提供一個蟒樣的(Pythonic)介面來獲取通過HTTP頭部(HTTP header)Set-Cookie傳送的cookies
  3. 常用的流行的瀏覽器會把cookies以檔案形式存放在磁碟上,http.cookiejar模組可以操作這些檔案。
  4. http.server模組實現了一個基本的HTTP伺服器

urllib#

Python 2有一些用來分析,編碼和獲取URL的模組,但是這些模組就像老鼠窩一樣相互重疊。在Python 3裡,這些模組被重構、組合成了一個單獨的包,即urllib

NotesPython 2Python 3
importurllibimport urllib.request, urllib.parse, urllib.error
importurllib2import urllib.request, urllib.error
importurlparseimport urllib.parse
importrobotparserimport urllib.robotparser
from urllib importFancyURLopenerfrom urllib import urlencode
from urllib.request importFancyURLopenerfrom urllib.parse import urlencode
from urllib2 importRequestfrom urllib2 importHTTPError
from urllib.request importRequestfrom urllib.error importHTTPError
  1. 以前,Python 2裡的urllib模組有各種各樣的函式,包括用來獲取資料的urlopen(),還有用來將URL分割成其組成部分的splittype()splithost()splituser()函式。在新的urllib包裡,這些函式被組織得更有邏輯性。2to3將會修改這些函式的呼叫以適應新的命名方案。
  2. 在Python 3裡,以前的urllib2模組被併入了urllib包。同時,以urllib2裡各種你最喜愛的東西將會一個不缺地出現在Python 3的urllib模組裡,比如build_opener()方法,Request物件,HTTPBasicAuthHandler和friends。
  3. Python 3裡的urllib.parse模組包含了原來Python 2裡urlparse模組所有的解析函式。
  4. urllib.robotparse模組解析robots.txt檔案
  5. 處理HTTP重定向和其他狀態碼的FancyURLopener類在Python 3裡的urllib.request模組裡依然有效。urlencode()函式已經被轉移到了urllib.parse裡。
  6. Request物件在urllib.request裡依然有效,但是像HTTPError這樣的常量已經被轉移到了urllib.error裡。

我是否有提到2to3也會重寫你的函式呼叫?比如,如果你的Python 2程式碼裡匯入了urllib模組,呼叫了urllib.urlopen()函式獲取資料,2to3會同時修改import語句和函式呼叫。

NotesPython 2Python 3
import urllib
print urllib.urlopen('http://diveintopython3.org/').read()
import urllib.request, urllib.parse, urllib.error
print(urllib.request.urlopen('http://diveintopython3.org/').read())

相關推薦

python2python3差別

概述#幾乎所有的Python 2程式都需要一些修改才能正常地執行在Python 3的環境下。為了簡化這個轉換過程,Python 3自帶了一個叫做2to3的實用指令碼(Utility Script),這個指令碼會將你的Python 2程式原始檔作為輸入,然後自動將其轉換到Pyt

Python2Python3之間關於字串編碼處理的差別

0x00 字元的編碼 計算機畢竟是西方國家的發明,最開始並沒有想到會普及到全世界,只用一個位元組中的7位(ASCII)來表示字元對於現在龐大的文字數量來說顯然不夠,所以先後經歷了好幾套編碼方案,不同國家和地區又有自己的方案,造成了現在諸多的歷史遺留問題。具體講

Mac系統下安裝ipython分別支持python2python3

python cnblogs rip fff tro -c 我們 usr sta 操作系統:Mac10.11.5 python2.7.13 python3.6.1 安裝python2: brew install python 安裝python3: brew in

創建Python2Python3的虛擬環境virtualenv

get python版本 pan ear ubunt 虛擬環境 區分 切換 https 首先要先在電腦上安裝了Python2和Python3(可以參考一下我這篇文章:http://www.cnblogs.com/tk2049jq/p/7043480.html) 依次安

win10系統同時安裝python2python3

2.4 pen 管理 enc pack 顯示 sta port bsp 1、官網下載python2和python3版本 2、安裝python3,勾上Add Python3.5 to PATH,自定義選擇安裝目錄,安裝,驗證:WIN+R--->cmd,輸入python看

Python2Python3的一些語法區別

pythonPython2和Python3的一些語法區別pythonPython2和Python3的一些語法區別1.print2.input3. python3版本相對2版本的部分其他區別問題:為何會出現亂碼的情況問題:如何獲取編碼方式的信息?問題:在控制臺上看到的到底是什麽?1.print在版本2的使用方法

Windows下python2python3共存時pip失效的解決辦法

python ins win style color python3安裝 解決 pan python3 同時有python2和python3的時候,使用pip install命令系統不能檢測出對應的python,所有不能再用pip install安裝包.改用以下命令: 為p

pycharm下同存Python2Python3的運行方式問題

image set unit 運行方式 右鍵 16px ima span .cn 遇到問題:Python2和3同存的環境下,pycharm修改配置的路徑後,以“run unittest in xx”還是以Python2的環境執行。 原修改配置:file-settings

windows下python2python3共存

python3 安裝目錄 script 3.5 .py https 默認 操作系統 真的 從github下載的python項目有時需要python2,有時需要python3,這個真的很惡心 配置步驟如下: 操作系統:win10 安裝步驟省略,相信都能安裝 (1)改名稱給電腦

Python2Python3中print的不同點

換行 避免 不換行 現在 lap 信息 內置 引號 輸出字符串 在Python2和Python3中都提供print()方法來打印信息,但兩個版本間的print稍微有差異 主要體現在以下幾個方面: 1.python3中print是一個內置函數,有多個參數,而python2中p

python2python3的區別?

ima tps python3 cnblogs .cn alt mage log http python2和python3的區別?

同時裝了python2python3,pip沒法使用

clas 命令 csharp 解決方案 har 令行 highlight python3 怎麽辦 問題:windows系統,先裝了Python2,又裝了Python3,pip命令沒法使用,怎麽辦? 解決方案:打開命令行窗口,輸入以下命令 python3 -m pip in

urllib庫python2python3具體區別

ble log redirect proxy dmgr python3 button ner net Python 2 name Python 3 name urllib.urlretrieve() urllib.request.urlretrieve(

python2python3編碼

spa cal str -s span utf8編碼 odin post bytes python2編碼           unicode:unicode 你好 u‘\u4f60\u597d‘           | |           

win 安裝python2python3

gpo upload tps 分享 brush amd64 ima nbsp amd 1. 下載安裝包 https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi

windows下安裝Python2Python3共存

scripts python3.6 令行 class for gpo 環境 分享圖片 python 一、Python安裝 1.下載安裝包      1 https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64

python2python3比較好的共存方法

python3 col 很多 和數 由於 log 多人 naconda packages 文章根據網絡資料編寫,只為個人學習使用。青山。。。 ---------------------------------------------------- 由於工作學習的需求,大家都

windows下同時安裝python2python3

htm 正常 post 麻煩 ima 分享圖片 pos 一位 mage 之前學習的時候使用2.7比較多。 想練習3.7的時候,兩個版本兼容的問題,苦惱了幾天。 查了一下資料,發現了一個很好的方法。記錄一下,也做一個分享。 本篇內容主要講一下,在同一臺電腦上如何同時安裝P

Python2Python3的區別

rexec args ring 獲得 mapping decorator 整型 import true 17年入手Python語言,直接學的是Python3的語法,後來出去面試發現幾乎所有招Python後端開發的都會問到Python2和Python3的區別,而且說得越詳細則

在同一臺電腦上同時安裝Python2Python3

出現 有時 支持 無需 截圖 install path 文件 str 親測可行!! 目前Python的兩個版本Python2和Python3同時存在,且這兩個版本同時在更新與維護。 到底是選擇Python2還是選擇Python3,取決於當前要使用的庫、框架支持哪個版本。