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()
需要你將想要輸出的東西作為引數傳給它。
Notes | Python 2 | Python 3 |
---|---|---|
① | print |
print() |
② | print1 |
print(1) |
③ | print1,2 |
print(1,2) |
④ | print1,2, |
print(1,2,end=' ') |
⑤ | print>>sys.stderr,1,2,
3 |
print(1,2,3, file=sys.stderr) |
- 為輸出一個空白行,需要呼叫不帶引數的
print()
。 - 為輸出一個單獨的值,需要將這這個值作為
print()
- 為輸出使用一個空格分隔的兩個值,用兩個引數呼叫
print()
即可。 - 這個例子有一些技巧。在Python 2裡,如果你使用一個逗號(,)作為
print
語句的結尾,它將會用空格分隔輸出的結果,然後在輸出一個尾隨的空格(trailing space),而不輸出回車(carriage return)。在Python 3裡,通過把end=' '
作為一個關鍵字引數傳給print()
可以實現同樣的效果。引數end
的預設值為'\n'
,所以通過重新指定end
引數的值,可以取消在末尾輸出回車符。 - 在Python 2裡,你可以通過使用
>>pipe_name
語法,把輸出重定向到一個管道,比如sys.stderr
file
的值傳遞給print()
來完成同樣的功能。引數file
的預設值為std.stdout
,所以重新指定它的值將會使print()
輸出到一個另外一個管道。
Unicode字串#
Python 2有兩種字串型別:Unicode字串和非Unicode字串。Python 3只有一種型別:Unicode字串(Unicode strings)。
Notes | Python 2 | Python 3 |
---|---|---|
① | u'PapayaWhip' |
'PapayaWhip' |
② | ur'PapayaWhip\foo' |
r'PapayaWhip\foo' |
- Python 2裡的Unicode字串在Python 3裡即普通字串,因為在Python 3裡字串總是Unicode形式的。
- Unicode原始字串(raw string)(使用這種字串,Python不會自動轉義反斜線"\")也被替換為普通的字串,因為在Python 3裡,所有原始字串都是以Unicode編碼的。
全域性函式unicode()
#
Python 2有兩個全域性函式可以把物件強制轉換成字串:unicode()
把物件轉換成Unicode字串,還有str()
把物件轉換為非Unicode字串。Python 3只有一種字串型別,Unicode字串,所以str()
函式即可完成所有的功能。(unicode()
函式在Python
3裡不再存在了。)
Notes | Python 2 | Python 3 |
---|---|---|
unicode(anything) |
str(anything) |
long
長整型#
Python 2有為非浮點數準備的int
和long
型別。int
型別的最大值不能超過sys.maxint
,而且這個最大值是平臺相關的。可以通過在數字的末尾附上一個L
來定義長整型,顯然,它比int
型別表示的數字範圍更大。在Python
3裡,只有一種整數型別int
,大多數情況下,它很像Python 2裡的長整型。由於已經不存在兩種型別的整數,所以就沒有必要使用特殊的語法去區別他們。
Notes | Python 2 | Python 3 |
---|---|---|
① | x =1000000000000L |
x =1000000000000 |
② | x =0xFFFFFFFFFFFFL |
x =0xFFFFFFFFFFFF |
③ | long(x) |
int(x) |
④ | type(x)islong |
type(x)isint |
⑤ | isinstance(x,long) |
isinstance(x,int) |
- 在Python 2裡的十進位制長整型在Python 3裡被替換為十進位制的普通整數。
- 在Python 2裡的十六進位制長整型在Python 3裡被替換為十六進位制的普通整數。
- 在Python 3裡,由於長整型已經不存在了,自然原來的
long()
函式也沒有了。為了強制轉換一個變數到整型,可以使用int()
函式。 - 檢查一個變數是否是整型,獲得它的資料型別,並與一個
int
型別(不是long
)的作比較。 - 你也可以使用
isinstance()
函式來檢查資料型別;再強調一次,使用int
,而不是long
,來檢查整數型別。
<> 比較運算子#
Python 2支援<>
作為!=
的同義詞。Python 3只支援!=
,不再支援<>了。
Notes | Python 2 | Python 3 |
---|---|---|
① | if x <> y: |
if x != y: |
② | if x <> y<> z: |
if x != y!= z: |
- 簡單地比較。
- 相對複雜的三個值之間的比較。
字典類方法has_key()
#
在Python 2裡,字典物件的has_key()
方法用來測試字典是否包含特定的鍵(key)。Python 3不再支援這個方法了。你需要使用in
運算子。
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.has_key('PapayaWhip') |
'PapayaWhip'
in a_dictionary |
② | a_dictionary.has_key(x)or
a_dictionary.has_key(y) |
x in a_dictionaryor y
in a_dictionary |
③ | a_dictionary.has_key(xor y) |
(x or y)in a_dictionary |
④ | a_dictionary.has_key(x+ y) |
(x + y)in a_dictionary |
⑤ | x + a_dictionary.has_key(y) |
x +(y
in a_dictionary) |
- 最簡單的形式。
- 運算子
or
的優先順序高於運算子in
,所以這裡不需要新增括號。 - 另一方面,出於同樣的原因 —
or
的優先順序大於in
,這裡需要新增括號。(注意:這裡的程式碼與前面那行完全不同。Python會先解釋x or y
,得到結果x(如果x在布林上下文裡的值是真)或者y。然後Python檢查這個結果是不是a_dictionary的一個鍵。) - 運算子
in
的優先順序大於運算子+
,所以程式碼裡的這種形式從技術上說不需要括號,但是2to3
還是添加了。 - 這種形式一定需要括號,因為
in
的優先順序大於+
。
返回列表的字典類方法#
在Python 2裡,許多字典類方法的返回值是列表。其中最常用方法的有keys
,items
和values
。在Python 3裡,所有以上方法的返回值改為動態檢視(dynamic view)。在一些上下文環境裡,這種改變並不會產生影響。如果這些方法的返回值被立即傳遞給另外一個函式,並且那個函式會遍歷整個序列,那麼以上方法的返回值是列表或者檢視並不會產生什麼不同。在另外一些情況下,Python
3的這些改變干係重大。如果你期待一個能被獨立定址元素的列表,那麼Python 3的這些改變將會使你的程式碼卡住(choke),因為檢視(view)不支援索引(indexing)。
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.keys() |
list(a_dictionary.keys()) |
② | a_dictionary.items() |
list(a_dictionary.items()) |
③ | a_dictionary.iterkeys() |
iter(a_dictionary.keys()) |
④ | [i for iin a_dictionary.iterkeys()] |
[i for iin a_dictionary.keys()] |
⑤ | min(a_dictionary.keys()) |
no change |
- 使用
list()
函式將keys()
的返回值轉換為一個靜態列表,出於安全方面的考量,2to3
可能會報錯。這樣的程式碼是有效的,但是對於使用檢視來說,它的效率低一些。你應該檢查轉換後的程式碼,看看是否一定需要列表,也許檢視也能完成同樣的工作。 - 這是另外一種檢視(關於
items()
方法的)到列表的轉換。2to3
對values()
方法返回值的轉換也是一樣的。 - Python 3裡不再支援
iterkeys()
了。如果必要,使用iter()
將keys()
的返回值轉換成為一個迭代器。 2to3
能夠識別出iterkeys()
方法在列表解析裡被使用,然後將它轉換為Python 3裡的keys()
方法(不需要使用額外的iter()
去包裝其返回值)。這樣是可行的,因為檢視是可迭代的。2to3
也能識別出keys()
方法的返回值被立即傳給另外一個會遍歷整個序列的函式,所以也就沒有必要先把keys()
的返回值轉換到一個列表。相反的,min()
函式會很樂意遍歷檢視。這個過程對min()
,max()
,sum()
,list()
,tuple()
,set()
,sorted()
,any()
和all()
同樣有效。
被重新命名或者重新組織的模組#
從Python 2到Python 3,標準庫裡的一些模組已經被重新命名了。還有一些相互關聯的模組也被組合或者重新組織,以使得這種關聯更有邏輯性。
http
#
在Python 3裡,幾個相關的HTTP模組被組合成一個單獨的包,即http
。
Notes | Python 2 | Python 3 |
---|---|---|
① | importhttplib |
import http.client |
② | importCookie |
import http.cookies |
③ | importcookielib |
import http.cookiejar |
④ |
|
import http.server |
http.client
模組實現了一個底層的庫,可以用來請求HTTP資源,解析HTTP響應。http.cookies
模組提供一個蟒樣的(Pythonic)介面來獲取通過HTTP頭部(HTTP header)Set-Cookie傳送的cookies- 常用的流行的瀏覽器會把cookies以檔案形式存放在磁碟上,
http.cookiejar
模組可以操作這些檔案。 http.server
模組實現了一個基本的HTTP伺服器
urllib
#
Python 2有一些用來分析,編碼和獲取URL的模組,但是這些模組就像老鼠窩一樣相互重疊。在Python 3裡,這些模組被重構、組合成了一個單獨的包,即urllib
。
Notes | Python 2 | Python 3 |
---|---|---|
① | importurllib |
import urllib.request, urllib.parse,
urllib.error |
② | importurllib2 |
import urllib.request, urllib.error |
③ | importurlparse |
import urllib.parse |
④ | importrobotparser |
import urllib.robotparser |
⑤ |
|
|
⑥ |
|
|
- 以前,Python 2裡的
urllib
模組有各種各樣的函式,包括用來獲取資料的urlopen()
,還有用來將URL分割成其組成部分的splittype()
,splithost()
和splituser()
函式。在新的urllib
包裡,這些函式被組織得更有邏輯性。2to3將會修改這些函式的呼叫以適應新的命名方案。 - 在Python 3裡,以前的
urllib2
模組被併入了urllib
包。同時,以urllib2
裡各種你最喜愛的東西將會一個不缺地出現在Python 3的urllib
模組裡,比如build_opener()
方法,Request
物件,HTTPBasicAuthHandler
和friends。 - Python 3裡的
urllib.parse
模組包含了原來Python 2裡urlparse
模組所有的解析函式。 urllib.robotparse
模組解析robots.txt
檔案。- 處理HTTP重定向和其他狀態碼的
FancyURLopener
類在Python 3裡的urllib.request
模組裡依然有效。urlencode()
函式已經被轉移到了urllib.parse
裡。 Request
物件在urllib.request
裡依然有效,但是像HTTPError
這樣的常量已經被轉移到了urllib.error
裡。
我是否有提到2to3
也會重寫你的函式呼叫?比如,如果你的Python 2程式碼裡匯入了urllib
模組,呼叫了urllib.urlopen()
函式獲取資料,2to3
會同時修改import
語句和函式呼叫。
Notes | Python 2 | Python 3 |
---|---|---|
|
|
dbm
#
所有的DBM克隆(DBM clone)現在在單獨的一個包裡,即dbm
。如果你需要其中某個特定的變體,比如GNUDBM,你可以匯入dbm
包中合適的模組。
Notes | Python 2 | Python 3 |
---|---|---|
importdbm |
import dbm.ndbm |
|
importgdbm |
import dbm.gnu |
|
importdbhash |
import dbm.bsd |
|
importdumbdbm |
import dbm.dumb |
|
|
import dbm |
xmlrpc
#
XML-RPC是一個通過HTTP協議執行遠端RPC呼叫的輕重級方法。一些XML-RPC客戶端和XML-RPC服務端的實現庫現在被組合到了獨立的包,即xmlrpc
。
Notes | Python 2 | Python 3 |
---|---|---|
importxmlrpclib |
import xmlrpc.client |
|
|
import xmlrpc.server |
其他模組#
Notes | Python 2 | Python 3 |
---|---|---|
① |
|
import io |
② |
|
import pickle |
③ | import__builtin__ |
import builtins |
④ | importcopy_reg |
import copyreg |
⑤ | importQueue |
import queue |
⑥ | importSocketServer |
import socketserver |
⑦ | importConfigParser |
import configparser |
⑧ | import repr |
import reprlib |
⑨ | importcommands |
import subprocess |
- 在Python 2裡,你通常會這樣做,首先嚐試把
cStringIO
匯入作為StringIO
的替代,如果失敗了,再匯入StringIO
。不要在Python 3裡這樣做;io
模組會幫你處理好這件事情。它會找出可用的最快實現方法,然後自動使用它。 - 在Python 2裡,匯入最快的
pickle
實現也是一個與上邊相似的能用方法。在Python 3裡,pickle
模組會自動為你處理,所以不要再這樣做。 builtins
模組包含了在整個Python語言裡都會使用的全域性函式,類和常量。重新定義builtins
模組裡的某個函式意味著在每處都重定義了這個全域性函式。這聽起來很強大,但是同時也是很可怕的。copyreg
模組為用C語言定義的使用者自定義型別添加了pickle
模組的支援。queue
模組實現一個生產者消費者佇列(multi-producer, multi-consumer queue)。socketserver
模組為實現各種socket server提供了通用基礎類。configparser
模組用來解析INI-style配置檔案。reprlib
模組重新實現了內建函式repr()
,並添加了對字串表示被截斷前長度的控制。subprocess
模組允許你建立子程序,連線到他們的管道,然後獲取他們的返回值。
包內的相對匯入#
包是由一組相關聯的模組共同組成的單個實體。在Python 2的時候,為了實現同一個包內模組的相互引用,你會使用import foo
或者from foo import Bar
。Python 2直譯器會先在當前目錄裡搜尋foo.py
,然後再去Python搜尋路徑(sys.path
)裡搜尋。在Python 3裡這個過程有一點不同。Python 3不會首先在當前路徑搜尋,它會直接在Python的搜尋路徑裡尋找。如果你想要包裡的一個模組匯入包裡的另外一個模組,你需要顯式地提供兩個模組的相對路徑。
假設你有如下包,多個檔案在同一個目錄下:
chardet/ | +--__init__.py | +--constants.py | +--mbcharsetprober.py | +--universaldetector.py
現在假設universaldetector.py
需要整個匯入constants.py
,另外還需要匯入mbcharsetprober.py
的一個類。你會怎樣做?
Notes | Python 2 | Python 3 |
---|---|---|
① | import constants |
from.import constants |
② | from mbcharsetproberimportMultiByteCharSetProber |
from.mbcharsetproberimportMultiByteCharsetProber |
- 當你需要從包的其他地方匯入整個模組,使用新的
from . import
語法。這裡的句號(.)即表示當前檔案(universaldetector.py
)和你想要匯入檔案(constants.py
)之間的相對路徑。在這個樣例中,這兩個檔案在同一個目錄裡,所以使用了單個句號。你也可以從父目錄(from .. import anothermodule
)或者子目錄裡匯入。 - 為了將一個特定的類或者函式從其他模組裡直接匯入到你的模組的名字空間裡,在需要匯入的模組名前加上相對路徑,並且去掉最後一個斜線(slash)。在這個例子中,
mbcharsetprober.py
與universaldetector.py
在同一個目錄裡,所以相對路徑名就是一個句號。你也可以從父目錄(from .. import anothermodule)或者子目錄裡匯入。
迭代器方法next()
#
在Python 2裡,迭代器有一個next()
方法,用來返回序列裡的下一項。在Python 3裡這同樣成立,但是現在有了一個新的全域性的函式next()
,它使用一個迭代器作為引數。
Notes | Python 2 | Python 3 |
---|---|---|
① | anIterator.next() |
next(anIterator) |
② | a_function_that_returns_an_iterator().next() |
next(a_function_that_returns_an_iterator()) |
③ |
|
|
④ |
|
no change |
⑤ |
|
|
- 最簡單的例子,你不再呼叫一個迭代器的
next()
方法,現在你將迭代器自身作為引數傳遞給全域性函式next()
。 - 假如你有一個返回值是迭代器的函式,呼叫這個函式然後把結果作為引數傳遞給
next()
函式。(2to3
指令碼足夠智慧以正確執行這種轉換。) - 假如你想定義你自己的類,然後把它用作一個迭代器,在Python 3裡,你可以通過定義特殊方法
__next__()
來實現。 - 如果你定義的類裡剛好有一個
next()
,它使用一個或者多個引數,2to3
執行的時候不會動它。這個類不能被當作迭代器使用,因為它的next()
方法帶有引數。 - 這一個有些複雜。如果你恰好有一個叫做next的本地變數,在Python 3裡它的優先順序會高於全域性函式
next()
。在這種情況下,你需要呼叫迭代器的特別方法__next__()
來獲取序列裡的下一個元素。(或者,你也可以重構程式碼以使這個本地變數的名字不叫next,但是2to3不會為你做這件事。)
全域性函式filter()
#
在Python 2裡,filter()
方法返回一個列表,這個列表是通過一個返回值為True
或者False
的函式來檢測序列裡的每一項得到的。在Python 3裡,filter()
函式返回一個迭代器,不再是列表。
Notes | Python 2 | Python 3 |
---|---|---|
① | filter(a_function, a_sequence) |
list(filter(a_function, a_sequence)) |
② | list(filter(a_function, a_sequence)) |
no change |
③ | filter(None, a_sequence) |
[i for iin a_sequence
if i] |
④ | for i in filter(None, a_sequence): |
no change |
⑤ | [i for iin filter(a_function,
a_sequence)] |
no change |
- 最簡單的情況下,
2to3
會用一個list()
函式來包裝filter()
,list()
函式會遍歷它的引數然後返回一個列表。 - 然而,如果
filter()
呼叫已經被list()
包裹,2to3
不會再做處理,因為這種情況下filter()
的返回值是否是一個迭代器是無關緊要的。 - 為了處理
filter(None, ...)
這種特殊的語法,2to3
會將這種呼叫從語法上等價地轉換為列表解析。 - 由於
for
迴圈會遍歷整個序列,所以沒有必要再做修改。 - 與上面相同,不需要做修改,因為列表解析會遍歷整個序列,即使
filter()
返回一個迭代器,它仍能像以前的filter()
返回列表那樣正常工作。
全域性函式map()
#
跟filter()
作的改變一樣,map()
函式現在返回一個迭代器。(在Python 2裡,它返回一個列表。)
Notes | Python 2 | Python 3 |
---|---|---|
① | map(a_function,'PapayaWhip') |
list(map(a_function,'PapayaWhip')) |
② | map(None,'PapayaWhip') |
list('PapayaWhip') |
③ | map(lambda x: x+1,
range(42)) |
[x+1for x
in range(42)] |
④ | for i in map(a_function, a_sequence): |
no change |
⑤ | [i for iin map(a_function,
a_sequence)] |
no change |
- 類似對
filter()
的處理,在最簡單的情況下,2to3
會用一個list()
函式來包裝map()
呼叫。 - 對於特殊的
map(None, ...)
語法,跟filter(None, ...)
類似,2to3
會將其轉換成一個使用list()
的等價呼叫 - 如果
map()
的第一個引數是一個lambda函式,2to3
會將其等價地轉換成列表解析。 - 對於會遍歷整個序列的
for
迴圈,不需要做改變。 - 再一次地,這裡不需要做修改,因為列表解析會遍歷整個序列,即使
map()
的返回值是迭代器而不是列表它也能正常工作。
全域性函式reduce()
#
在Python 3裡,reduce()
函式已經被從全域性名字空間裡移除了,它現在被放置在fucntools
模組裡。
Notes | Python 2 | Python 3 |
---|---|---|
reduce(a, b, c) |
|
全域性函式apply()
#
Python 2有一個叫做apply()
的全域性函式,它使用一個函式f和一個列表[a, b, c]
作為引數,返回值是f(a, b, c)
。你也可以通過直接呼叫這個函式,在列表前新增一個星號(*)作為引數傳遞給它來完成同樣的事情。在Python 3裡,apply()
函式不再存在了;必須使用星號標記法。
Notes | Python 2 | Python 3 |
---|---|---|
① | apply(a_function, a_list_of_args) |
a_function(*a_list_of_args) |
② | apply(a_function, a_list_of_args, a_dictionary_of_named_args) |
a_function(*a_list_of_args,**a_dictionary_of_named_args) |
③ | apply(a_function, a_list_of_args+ z) |
a_function(*a_list_of_args+ z) |
④ | apply(aModule.a_function, a_list_of_args) |
aModule.a_function(*a_list_of_args) |
- 最簡單的形式,可以通過在引數列表(就像
[a, b, c]
一樣)前新增一個星號來呼叫函式。這跟Python 2裡的apply()
函式是等價的。 - 在Python 2裡,
apply()
函式實際上可以帶3個引數:一個函式,一個引數列表,一個字典命名引數(dictionary of named arguments)。在Python 3裡,你可以通過在引數列表前新增一個星號(*
),在字典命名引數前新增兩個星號(**
)來達到同樣的效果。 - 運算子
+
在這裡用作連線列表的功能,它的優先順序高於運算子*
,所以沒有必要在a_list_of_args + z
周圍新增額外的括號。 2to3
指令碼足夠智慧來轉換複雜的apply()
呼叫,包括呼叫匯入模組裡的函式。
全域性函式intern()
#
在Python 2裡,你可以用intern()
函式作用在一個字串上來限定(intern)它以達到效能優化。在Python 3裡,intern()
函式被轉移到sys
模組裡了。
Notes | Python 2 | Python 3 |
---|---|---|
intern(aString) |
sys.intern(aString) |
exec
語句#
就像print
語句在Python 3裡變成了一個函式一樣,exec
語句也是這樣的。exec()
函式使用一個包含任意Python程式碼的字串作為引數,然後就像執行語句或者表示式一樣執行它。exec()
跟eval()
是相似的,但是exec()
更加強大並更具有技巧性。eval()
函式只能執行單獨一條表示式,但是
能夠執行多條語句,匯入(import),函式宣告 — 實際上整個Python程式的字串表示也可以。exec
()
Notes | Python 2 | Python 3 |
---|---|---|
① | exec codeString |
exec(codeString) |
② | exec codeString
in a_global_namespace |
exec(codeString, a_global_namespace) |
③ | exec codeString
in a_global_namespace, a_local_namespace |
exec(codeString, a_global_namespace, a_local_namespace) |
- 在最簡單的形式下,因為
exec()
現在是一個函式,而不是語句,2to3
會把這個字串形式的程式碼用括號圍起來。 - Python 2裡的
exec
語句可以指定名字空間,程式碼將在這個由全域性物件組成的私有空間裡執行。Python 3也有這樣的功能;你只需要把這個名字空間作為第二個引數傳遞給exec()
函式。 - 更加神奇的是,Python 2裡的
exec
語句還可以指定一個本地名字空間(比如一個函式裡宣告的變數)。在Python 3裡,exec()
函式也有這樣的功能。
execfile
語句#
就像以前的exec
語句,Python 2裡的execfile
語句也可以像執行Python程式碼那樣使用字串。不同的是exec
使用字串,而execfile
則使用檔案。在Python
3裡,execfile
語句已經被去掉了。如果你真的想要執行一個檔案裡的Python程式碼(但是你不想匯入它),你可以通過開啟這個檔案,讀取它的內容,然後呼叫compile()
全域性函式強制Python直譯器編譯程式碼,然後呼叫新的exec()
函式。
Notes | Python 2 | Python 3 |
---|---|---|
execfile('a_filename') |
exec(compile(open('a_filename').read(),'a_filename','exec')) |
repr
(反引號)#
在Python 2裡,為了得到一個任意物件的字串表示,有一種把物件包裝在反引號裡(比如`x`
)的特殊語法。在Python 3裡,這種能力仍然存在,但是你不能再使用反引號獲得這種字串表示了。你需要使用全域性函式repr()
。
Notes | Python 2 | Python 3 |
---|---|---|
① | `x` |
repr(x) |
② | `'PapayaWhip' + `2`` |
repr('PapayaWhip'+ repr(2)) |
- 記住,x可以是任何東西 — 一個類,函式,模組,基本資料型別,等等。
repr()
函式可以使用任何型別的引數。 - 在Python 2裡,反引號可以巢狀,導致了這種令人費解的(但是有效的)表示式。
2to3
足夠智慧以將這種巢狀呼叫轉換到repr()
函式。
try...except
語句
相關推薦
python2 與 python3 語法區別
概述#
幾乎所有的Python 2程式都需要一些修改才能正常地執行在Python 3的環境下。為了簡化這個轉換過程,Python 3自帶了一個叫做2to3的實用指令碼(Utility Script),這個指令碼會將你的Python 2程式原始檔作為輸入,然後自動將其轉換到
Python2與Python3的區別收集
python3 列表 2.7 tel edits str more 推導 test 1、python2中,在列表推導中for關鍵字之後的賦值操作可能會影響到列表推導上下文中的同名變量:
Python 2.7.8 (default, Jun 30 2014, 16:03:49
Python中的元組,字典、計算器代碼實例及python2與python3的區別
所有 time tor result inpu __name__ 字符 img 歡迎來到 1.計算器實例#/usr/bin/env python
# -*- coding:utf-8 -*-
# @time :2018/1/22 21:09
# @Author :Fen
Python2與Python3的區別
enc 區別 col 編碼方式 windows asc 運行 問題 現在 python2與python3的區別:
(1)python2 默認編碼方式是ASCII碼(不識別中文),python3 默認編碼方式是utf-8(識別中文)。所以想要在python2中支持
Python基礎-python的輸入輸出(python2與python3的區別);算術運算子
程式:輸入(鍵盤)----程式碼(java/python/c)----輸出(螢幕)
#每一行程式碼只負責完成一個動作 #print的作用:把內容輸出到螢幕上來 #python是一個格式非常嚴格的程式設計語言,每行程式碼前面都不要增加空格
輸入:
1.1 pyhon2*
python2 與 python3的區別
原文出自
幾乎所有的python2程式都需要一些修改才能正常的執行在python3的環境下。為了簡化這個轉換過程,Python3自帶了一個2to3的實用指令碼.這個指令碼會將python2程式原始檔作為輸入,然後自動轉換到python3.但並不是所有內容都可以自動轉換。
Python2與Python3的區別(八):commands與subprocess
36.16. commands — Utilities for running commands
Deprecated since version 2.6: The commands module has been removed in Python 3. U
Python2與Python3的區別(七):Python3使用mysqldb的方法
MySQLdb只支援Python2.,還不支援3.
可以用PyMySQL代替。
安裝方法:
pip install PyMySQL
然後在需要的專案中,把 init.py中新增兩行:
import pymysql
pymysql.install_a
Python2與Python3的區別:
抽象 傳參數 super() peer bytes 當前 內部函數 優化 使用 前言:目前python兩個版本Python2與Python3同時存在,並且這兩個版本都在維護更新,但是Python2應該在2020年就停止維護更新了,那麽到底選擇Python2還
(個人記錄)Python2 與Python3的版本區別
字節 title border idt == 編碼 補全 默認 異常信息 現在還有些開源模塊還沒有更新到python3 ,不了解版本區別,無法對不合適的地方進行更改。 由於只追求向Python3靠近,所以對於python2的特別用法不探究。 此文不補全所有版本區別
python2與python3中編碼與解碼的區別
需要 顯示 數據類型 在屏幕上 nbsp gb2312 python2 想要 區別 python2中程序默認數據類型為ASCII,
所以需要先將數據解碼(decode)成為Unicode類型,
然後再編碼(encode)成為想要轉換的數據類型(gbk,utf-8,gb180
python2與python3區別
pytho ascii碼 混亂 區別 去除 統一 utf-8 python 重復 (1)python2與python3區別
宏觀:python2源碼不標準,混亂,重復代碼多
python3統一標準,去除重復代碼
(2)p
使用python2與python3中md5的區別以及需要注意的地方
你可能不知道的是,有很多字元,使用python2和python3的md5加密出來的結果是不一樣的
# python2.7 zfc = "xxx" + chr(163) + "fj" cd = hashlib.md5(zfc).h
python2與python3的主要區別
print
在進行程式除錯時用得最多的語句可能就是 print,在 Python 2 中,print 是一條語句,而 Python3 中作為函式存在。有人可能就有疑問了,在 Python2 中明明也看到當函式使用:
# py2
print("hello") # 等價 print ("hell
python2與python3的簡單區別
1、表示式
在 Python 2 中為獲得計算表示式,你會鍵入:
X = raw_input ("enter some values)
但在 Python 3 中,你會鍵入:
X = input ("enter some values")
因此,
Python---round函式四捨五入詳解之python2與python3版本間區別
round()方法返回 數值 的小數點四捨五入到n個數字。
語法
以下是round()方法的語法:
round( x [, n] )
引數
x --這是一個數值,表示需要格式化的數值
n --這也是一個數值,表示小數點後保留多少位
返回值
該方法返回 數值x 的小數點四捨五入
Python2 與 Python3 區別
Python2 中 print 用法為 print "Hello World"Python3 中 print 用法為 print("Hello World")
Python2 中的 input() 函式:獲取當前輸入的內容,並將其作為數字型別來處理Python3 中的 input() 函式:獲取當前輸入的內
python2 與python3 的一些區別
1、print函式python2:print語句 ( Python2 中若把 print 當函式使用,那麼可以匯入 future 模組 中的 print_function)Python3:print函式
關於Python2與python3共存的一點補充
python2 python3 本人實驗是在windows下cmd環境下完成的。 py -2與py -3分別指定運行python2和python3。但python命令依然可以使用,默認進入python3,virtualenv是使用pip3安裝的,只能新建python3的虛擬環境。 py -2
win10下安裝python2與python3以及pip共存
用戶目錄 strong exe 路徑 org enc setup 最新版 .com 一 分別安裝python2和python3
註意: 安裝時記得勾選 Add Python.exe to Path
二 安裝pip
Python3最新版本有pip,無需安裝
Pytho
python2 與 python3 語法區別
概述# 幾乎所有的Python 2程式都需要一些修改才能正常地執行在Python 3的環境下。為了簡化這個轉換過程,Python 3自帶了一個叫做2to3的實用指令碼(Utility Script),這個指令碼會將你的Python 2程式原始檔作為輸入,然後自動將其轉換到
Python2與Python3的區別收集
python3 列表 2.7 tel edits str more 推導 test 1、python2中,在列表推導中for關鍵字之後的賦值操作可能會影響到列表推導上下文中的同名變量: Python 2.7.8 (default, Jun 30 2014, 16:03:49
Python中的元組,字典、計算器代碼實例及python2與python3的區別
所有 time tor result inpu __name__ 字符 img 歡迎來到 1.計算器實例#/usr/bin/env python # -*- coding:utf-8 -*- # @time :2018/1/22 21:09 # @Author :Fen
Python2與Python3的區別
enc 區別 col 編碼方式 windows asc 運行 問題 現在 python2與python3的區別: (1)python2 默認編碼方式是ASCII碼(不識別中文),python3 默認編碼方式是utf-8(識別中文)。所以想要在python2中支持
Python基礎-python的輸入輸出(python2與python3的區別);算術運算子
程式:輸入(鍵盤)----程式碼(java/python/c)----輸出(螢幕) #每一行程式碼只負責完成一個動作 #print的作用:把內容輸出到螢幕上來 #python是一個格式非常嚴格的程式設計語言,每行程式碼前面都不要增加空格 輸入: 1.1 pyhon2*
python2 與 python3的區別
原文出自 幾乎所有的python2程式都需要一些修改才能正常的執行在python3的環境下。為了簡化這個轉換過程,Python3自帶了一個2to3的實用指令碼.這個指令碼會將python2程式原始檔作為輸入,然後自動轉換到python3.但並不是所有內容都可以自動轉換。
Python2與Python3的區別(八):commands與subprocess
36.16. commands — Utilities for running commands Deprecated since version 2.6: The commands module has been removed in Python 3. U
Python2與Python3的區別(七):Python3使用mysqldb的方法
MySQLdb只支援Python2.,還不支援3. 可以用PyMySQL代替。 安裝方法: pip install PyMySQL 然後在需要的專案中,把 init.py中新增兩行: import pymysql pymysql.install_a
Python2與Python3的區別:
抽象 傳參數 super() peer bytes 當前 內部函數 優化 使用 前言:目前python兩個版本Python2與Python3同時存在,並且這兩個版本都在維護更新,但是Python2應該在2020年就停止維護更新了,那麽到底選擇Python2還
(個人記錄)Python2 與Python3的版本區別
字節 title border idt == 編碼 補全 默認 異常信息 現在還有些開源模塊還沒有更新到python3 ,不了解版本區別,無法對不合適的地方進行更改。 由於只追求向Python3靠近,所以對於python2的特別用法不探究。 此文不補全所有版本區別
python2與python3中編碼與解碼的區別
需要 顯示 數據類型 在屏幕上 nbsp gb2312 python2 想要 區別 python2中程序默認數據類型為ASCII, 所以需要先將數據解碼(decode)成為Unicode類型, 然後再編碼(encode)成為想要轉換的數據類型(gbk,utf-8,gb180
python2與python3區別
pytho ascii碼 混亂 區別 去除 統一 utf-8 python 重復 (1)python2與python3區別 宏觀:python2源碼不標準,混亂,重復代碼多 python3統一標準,去除重復代碼 (2)p
使用python2與python3中md5的區別以及需要注意的地方
你可能不知道的是,有很多字元,使用python2和python3的md5加密出來的結果是不一樣的 # python2.7 zfc = "xxx" + chr(163) + "fj" cd = hashlib.md5(zfc).h
python2與python3的主要區別
print 在進行程式除錯時用得最多的語句可能就是 print,在 Python 2 中,print 是一條語句,而 Python3 中作為函式存在。有人可能就有疑問了,在 Python2 中明明也看到當函式使用: # py2 print("hello") # 等價 print ("hell
python2與python3的簡單區別
1、表示式 在 Python 2 中為獲得計算表示式,你會鍵入: X = raw_input ("enter some values) 但在 Python 3 中,你會鍵入: X = input ("enter some values") 因此,
Python---round函式四捨五入詳解之python2與python3版本間區別
round()方法返回 數值 的小數點四捨五入到n個數字。 語法 以下是round()方法的語法: round( x [, n] ) 引數 x --這是一個數值,表示需要格式化的數值 n --這也是一個數值,表示小數點後保留多少位 返回值 該方法返回 數值x 的小數點四捨五入
Python2 與 Python3 區別
Python2 中 print 用法為 print "Hello World"Python3 中 print 用法為 print("Hello World") Python2 中的 input() 函式:獲取當前輸入的內容,並將其作為數字型別來處理Python3 中的 input() 函式:獲取當前輸入的內
python2 與python3 的一些區別
1、print函式python2:print語句 ( Python2 中若把 print 當函式使用,那麼可以匯入 future 模組 中的 print_function)Python3:print函式
關於Python2與python3共存的一點補充
python2 python3 本人實驗是在windows下cmd環境下完成的。 py -2與py -3分別指定運行python2和python3。但python命令依然可以使用,默認進入python3,virtualenv是使用pip3安裝的,只能新建python3的虛擬環境。 py -2
win10下安裝python2與python3以及pip共存
用戶目錄 strong exe 路徑 org enc setup 最新版 .com 一 分別安裝python2和python3 註意: 安裝時記得勾選 Add Python.exe to Path 二 安裝pip Python3最新版本有pip,無需安裝 Pytho