Python2和Python3的一些語法區別

2021-09-08 13:27:29 字數 4176 閱讀 6045

python

在版本2的使用方法是:

print 'this is version 2

也可以是

print('this is version 2')

但到了3,就只能加上括號,像乙個函式一樣來使用 print:

print('this is version 3')

2裡面有兩個用來從命令列接受輸入的函式:inputraw_input

value = input()

input接收的是乙個值或變數,也就是說,你如果輸123,程式接收到的就是整數123,你輸true,就是booltrue。如果你輸了 abc,程式會認為這是乙個叫做abc的變數,而假如你沒有定義過這個變數,就會報錯。

所以,當你想用input得到一段文字的話,必須把文字寫在引號 "" 或 '' 中。

text = raw_input()

raw_input接收的則是你輸入的字串,而不管你輸的是什麼內容。如果你直接拿raw_input得到的「數字」去比較大小,則會得到奇怪的結果。

在版本3裡,為了減少混亂,這兩種輸入方式被合併了。只是合併的方式又坑了新手:它保留了input這個名字和raw_input的效果。3裡只有input函式,它接收你輸入的字串,不管你輸的是什麼。

text = input()

那麼在3裡,如何像2一樣得到使用者輸入的乙個值呢?方法是eval()

value = eval(input())

或者,如果你只是需要乙個整數值,也可以:

value = int(input())

除了一開始越到的這兩個坑外,還有其他一些可能遇到的變動,這裡以3與2相比的差異來說:

1.開啟檔案不再支援file方法,只能用open

2.range不再返回列表,而是乙個可迭代的range物件

3.除法/不再是整除,而是得到浮點數,整除需要用雙斜槓//

4.urlliburllib2合併成了urllib,常用的urllib2.urlopen()變成了urllib.request.urlopen()

5.字串及編碼相關有大變動,簡單來說就是原來的str變成了新的bytes,原來的unicode變成了新的str

相當於python2中的str型別,從網頁上抓取下來的資料流也是該型別的

在python3中,要得到乙個bytes型別的變數,可以在字串內容前面加入b得到,前提是該字串的內容是可以完全由ascii碼表示的,否則會出現語法錯誤

相當於python2中的str型別,從網頁上抓取下來的資料流也是該型別的

在python3中,要得到乙個bytes型別的變數,可以在字串內容前面加入b得到,但前提是該字串的內容是可以完全由ascii碼表示的,否則會出現語法錯誤。

python 3.6.1

>>>s1 = "你好"

>>>s1

'你好'

>>>type(s1)

>>>s2 = b'你好'

>>>

file "", line 1

syntaxerror: bytes can only contain ascii literal characters.

>>>s2 = b'abc'

>>>s2

b'abc'

>>>type(s2)

unicode為解決傳統字元編碼的侷限性而產生,為每一種語言的每乙個字元設定了統一且唯一的二進位製碼,python內部用於記錄的也是該編碼方式

上面的例子中s1就是通過unicode碼來進行儲存的

在python3中的str型別對應的就是python2中的unicode型別,即以統一的unicode碼儲存。而且,在python3中,程式中所設定的字串即直接儲存為統一的str型別(unicode)

上面的例子中s1就是str型別的變數

由於存在著這兩種不同的型別,勢必要牽涉到二者的互相轉化。bytes通過某一種編碼方式(decode)得到str,而str通過某一種解碼方式(encode)得到bytes

unicode是表示了世界上所有的字元的, 但是其內部的儲存是以二進位制位儲存的,比如你好的unicode編碼為\u4f60\u597d

但是我們所見到的並不是\u4f60\u597d這一串編碼,而是你好這兩個漢字

這是由於控制台環境本身提供乙個編碼方式,比如uft-8gbkcp936等,通過這些編碼方式,unicode碼就轉換成了我們可識別的字元了。

但是,不同的編碼方式之間是存在區別的,當得到乙個通過a方式編碼得到的bytes型別,如果用b方式去進行解碼的話,它就會按照b的標準去解讀,那樣就會出現亂碼的現象。

s = "你好"

print(s)

s1 = s.encode("utf-8").decode("gbk")

print(s1)

######output########

你好浣犲ソ

因此,開發的時候要弄清楚輸入**的編碼以及輸出環境的編碼,盡可能保證一致性,或者做好轉換的工作,可以減少出現亂碼的可能性

這一情況可以通過chardet模組的detect()函式來獲取資訊,chardet是第三方庫,可以通過pip來安裝

b是待檢測的bytes變數

import chardet

print(chardet.detect(b))

######output####

confidence是指匹配程度,encoding是指可能的編碼方式

獲取當前環境的編碼方式

這一情況可以使用sys模組下的getdefaultencoding()函式來獲取資訊

import sys

print(sys.getdefaultencoding())

######## output#####

utf-8

寫上面的東西的時候產生了乙個疑問,現在已經知道python內部儲存str的方式是使用unicode字符集,但是我們在螢幕上看到的並不是unicode字符集

s = "你好"

print(s)

#########output#############

你好

s的 unicode 是 \u4f60\u597d
那麼,這中間應該是進行了某種轉換

實際上,在執行print(str)的時候,python內部執行了encoding操作,控制台拿到的其實是乙個bytes變數

之後,控制台又根據環境內部的編碼方式,將所得到的bytes內容進行decoding的操作,就顯示了原先str的內容

python3和python2的區別

1.效能 py3.0執行 pystone benchmark的速度比py2.5慢30 guido認為py3.0有極大的優化空間,在字串和整形操作上可 以取得很好的優化結果。py3.1效能比py2.5慢15 還有很大的提公升空間。2.編碼 py3.x原始碼檔案預設使用utf 8編碼,這就使得以下 是合...

Python2和Python3的比較

python2 python3 print fish print fish unicode 是單獨的 unicode utf 8 字串 b b china byte 和 bytearrays type b type bytes s b.decode 轉化成 string 型別b1 s encode ...

python3和python2的區別

這個星期開始學習python了,因為看的書都是基於python2.x,而且我安裝的是python3.1,所以書上寫的地方好多都不適用於python3.1,特意在google上search了一下3.x和2.x的區別。特此在自己的空間中記錄一下,以備以後查詢方便,也可以分享給想學習python的frie...