python2.x和3.x的區別java
文:鐵樂與貓
2018.3.16新增博文,爲方便之後總結Python2.x與3.x的不一樣版本之間的區別,隨時更新。python
python本來的宗旨是崇尚優美、清晰、簡單。但python剛推出的時候,自身除了創始者龜叔等谷歌少數人外,全世界的phthon大牛還不多,因此python社區來講,有不少各個語言的大牛去爲python提供源碼,而這些大牛提供的源碼比較傾向於各自善長領域的語言的語法規範。例若有善長C的,有善長java的,寫出來的源碼都帶有C或java的印記。這就致使一個情況:python2.x版本的源碼相對混亂,重複代碼較多顯得繁擁。
有鑑於此,python的創始人龜叔在2008年的時候就「憤怒」了,這有別於python的初衷阿。python3.x
【關於龜叔】
python的創始人爲吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆(中文名字:龜叔)爲了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,做爲ABC語言的一種繼承。
(龜叔:2005年加入谷歌至2012年,2013年加入Dropbox直到如今,依然掌握着Python發展的核心方向,被稱爲仁慈的獨裁者)。網絡
一個頗有趣的現象,python版本在2008年的時候出現了轉折點:2.6版本以後「憤怒」的龜叔「規範」了python後直接跳躍到python3.0,最初他宣佈要使用2.6版本的公司兩個月後直接中止使用過渡到使用3.0版本。可這時間也過短了,遭到了全世界的抗議,因此後來纔有了2.7版本的python作爲過渡,提供更新直至到2020年。
原話以下:
Python 2.7 - July 3, 2010 In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible
python2.7
大至意思就是龜叔在2014年11月,宣佈Python 2.7的支持直到2020年爲止,重申不會再有2.8版本的發佈,但願用戶儘快遷移到Python 3.4+版本。函數
這也就是爲什麼python2.7與python3.x共存發行的獨特之處,也是爲什麼python2.7與python3.x的語法規範等有50+以上的不一樣之處的緣由所在。學習
讓咱們來隨着學習python的腳步來逐一記錄下2.x和3.x版本的各個不一樣之處,以便總結和應對,不過2020年快到了,也許很快就不用再記着2.7的不一樣了吧。測試
python2.x:源碼相對混亂,重複代碼較多,顯得繁冗;
python3.x:源碼規範,優美清晰簡單;ui
python2.x:print被視爲一條語句;
python3.x:print做爲函數存在,print()接收字符串做爲參數。編碼
如上圖,很明顯區別了。
在py2中,print語句後面接的是一個元組對象,而在py3中,print函數能夠接收多個位置參數。
python2.x: 使用raw_input();Python2.x 中 input() 相等於 eval(raw_input(prompt)) ,用來獲取控制檯的輸入。
python3.x:使用input()函數接受一個標準輸入數據,返回爲 string 類型。。
raw_input() 將全部輸入做爲字符串看待,返回字符串類型。
而 input() 在對待純數字輸入時具備本身的特性,它返回所輸入的數字的類型( int, float )。
注意:input() 和 raw_input() 這兩個函數均能接收 字符串 ,但 raw_input() 直接讀取控制檯的輸入(任何類型的輸入它均可以接收)。而對於 input() ,它但願可以讀取一個合法的 python 表達式,即你輸入字符串的時候必須使用引號將它括起來,不然它會引起一個 SyntaxError 。
除非對 input() 有特別須要,不然通常狀況下咱們都是推薦使用 raw_input() 來與用戶交互。
Python2.x: 默認編碼是 asscii;
Python 3.x: 默認UTF-8 , 所以再也不須要在文件頂部寫 # coding=utf-8 了。
Python2.x: 字符串有兩個類型,一個是 unicode,一個是 str,前者表示文本字符串,後者表示字節序列,不過二者並無明顯的界限,開發者也感受很混亂;
Python3.x: 二者作了嚴格區分,用 str 表示字符串,byte 表示字節序列,任何須要寫入文本或者網絡傳輸的數據都只接收字節序列,從源頭上阻止了編碼錯誤的問題。
補充:bytes 類型提供的操做和 str 同樣,支持分片、索引、基本數值運算等操做。可是 str 與 bytes 類型的數據不能執行 + 操做,儘管在py2中是可行的。
python2 與 python3 字節與字符的對應關係:
python2 | python3 | 表現 | 轉換 | 做用 |
---|---|---|---|---|
str | bytes | 字節 | encode | 存儲 |
unicode | str | 字符 | decode | 顯示 |
Python2.x: True 和 False 在 Python2 中是兩個全局變量(名字),在數值上分別對應 1 和 0, 做爲變量,能夠指向其它對象,產生了混亂,也違背了設計初衷。
Python3.x: Python3 修正了這個缺陷,True 和 False 變爲兩個關鍵字,永遠指向兩個固定的對象,不容許再被從新賦值。
Python2.x: 支持<>做爲!=的同義詞;
Python3.x: 只支持!=,再也不支持<>。
Python2.x: 字典對象has_key()方法測試字典是否包含指定的鍵。
Python3.x:python3再也不支持這個方法,使用in就能夠了。
Python2.x: 有兩種方法得到必定範圍內的數字:range()返回一個列表,xrange()返回一個迭代器。
Python3.x:range()也能夠返回迭代器,xrange()再也不存在。
Python2.x:支持intern()
Python3.x:不支持intern()
注:
python默認只會對由字符
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
構成字符串進行intern。
(未完待續)