python
在版本2的使用方法是:
print 'this is version 2
也可以是
print('this is version 2')
但到了3,就只能加上括號,像乙個函式一樣來使用 print:
print('this is version 3')
2裡面有兩個用來從命令列接受輸入的函式:input
和raw_input
。
value = input()
input
接收的是乙個值或變數,也就是說,你如果輸123
,程式接收到的就是整數123
,你輸true
,就是bool
值true
。如果你輸了 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.urllib
和urllib2
合併成了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-8
,gbk
,cp93
6等,通過這些編碼方式,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...