姓名:姚麗冰 學號:16050120089
原文鏈接 mp.weixin.qq.com
題圖:from Instagram
【嵌牛導讀】:在 Python 3 出現(xiàn)之前怕膛,Python 在我眼里一直是一位穩(wěn)重扎實的大叔,資歷深厚掸茅,語法簡單柠逞,功能強大,兼顧面向?qū)ο蠛秃瘮?shù)式編程陵且,庫包豐富程度讓其他語言轉(zhuǎn)過來的程序員瞠目結(jié)舌并喟嘆:人生苦短个束,要用 Python 啊……這種情況一直持續(xù)到 Python 3 的出現(xiàn)。
【嵌牛鼻子】:python2,python3沪悲,兼容性阱表,轉(zhuǎn)型
【嵌牛提問】:python3為何出現(xiàn),python2涉馁、python3的對比爱致,該學python2還是python3
【嵌牛正文】:一個語言的版本升級是極為普通的事情,不升級才不正常糠悯,但 Python 3 是個例外,因為 Python 3 放棄了向下兼容试和,也就是說,你在 Python 2 系列版本中寫的代碼好渠,一直運行的好好的节视,放到 3 的環(huán)境里,有 99% 的可能性不能正常運行。最簡單的但指,你在 Python 2 中打印語句print "Hello World",放到 Python 3 里拦坠,系統(tǒng)會告訴你「SyntaxError: Missing parentheses in call to 'print'」剩岳。刺激不刺激?
Python 的開發(fā)者為什么要這么做呢晓铆,或者說為什么會出現(xiàn) Python 3绰播?在很長一段時間內(nèi),沒人解釋這事链蕊,Python 的創(chuàng)造者們認為谬泌,這不是很顯然的嘛。這就像一個具備超高幽默感的人聽到一個冷笑話樂得前仰后合哈哈大笑陪蜻,另一個人 —— 比如普通開發(fā)者 —— 把一顆冰涼的花生米放嘴里邊嚼邊問贱鼻,哥們勇婴,你特么到底笑啥呢嘱腥?
為什么會有 Python 3 的存在?Brett Cannon —— Python 的核心開發(fā)者 —— 在一次問答活動中終于做了一個合理的解釋橱脸。在此之前他一直神奇的認為大家都清楚為什么 Python 3 會出現(xiàn)分苇。他說:
回想起來我真是太傻了,竟然認為大部分人 —— 不管是剛接觸 Python 或者已經(jīng)有一段時間 —— 要么應該知道栏赴,要么有好奇心去獲取一個解釋或答案靖秩。但是并沒有。所以我會解釋一下為什么 Python 3 會存在花颗。為什么要破壞兼容性惠拭,改變 unicode/str/bytes,使得老代碼移植到 Python 3 非常困難棒呛。
最根本的原因是域携,在 Python 2 中文本和二進制數(shù)據(jù)是一個爛攤子。比如 'abcd' 這個表達式宰睡,在 Python 3 中气筋,語義非常明確,就是包含四個字母的字符串麸恍,但是在 Python 2 里,可以是四個字母的字符串抹沪,也可以代表 97融欧、98、99噪馏、100 的數(shù)組。你可以使用 print ord('a') 獲取到這個字母的 ASCII瓶颠〈烫遥總之,在 Python 2 中桃移,對于 str 代表的含義有兩種封豪,這改變了語言的唯一性炒瘟。而在 Python 3 中答案是唯一的。
「Python之禪」里講過缘琅,「找到一種或唯一的一種解決方案去解決問題」廓推。文字既能代表文本數(shù)據(jù)又能代表二進制數(shù)據(jù)這很麻煩。一旦對象脫離我們的控制呻纹,就會讓人變得恐慌专缠。有人說我們可以用 Unicode,但實際中人們并不會那么做哥力,有事還會引發(fā)不必要的麻煩。比如在 Python 2 中寞射,中文顯示是這樣的:
>>> geektime = “極客時間”>>> geektime'\xe6\x9e\x81\xe5\xae\xa2\xe6\x97\xb6\xe9\x9\xb4'
Python 3 就簡明很多:
>>> geektime = “極客時間”>>> geektime'極客時間'
簡化語言锌钮,移除 str 的二義性能夠減少代碼的出錯率。避免 bug 是一件很重要的事情策治,但卻經(jīng)常被人遺忘兰吟。Python 之禪中的另一句話「清晰勝于晦澀」也表達了這個意思混蔼,歧義和隱性知識使得代碼不容易溝通,并容易形成 bug惭嚣。
正如 Brett Cannon 所言,人們有時會忘記 Python 有多久的歷史了
1989年的冬天延旧,Guido 為了度過一個有意義的圣誕節(jié)開始編寫 Python 語言的編譯器和解釋器槽地。1991年2月,第一個 Python 版本誕生集畅,編譯器是 C 語言實現(xiàn)的缅糟。這意味著 Python 的出現(xiàn)早于 1991年10月發(fā)布的第一版 Unicode 標準窗宦。后面出現(xiàn)的語言,比如 Java赴涵,Ruby 等都選擇在支持 Unicode 的標準上實現(xiàn)自己的 str 類型句占,這就讓 Python 3 變得很尷尬。2004年 Python 3 的方案開始醞釀,開發(fā)者們意識到祈餐,支持 Unicode 和來自任何語言的的文本是非常重要的。
Python 是一門面向世界的語言哄陶,而不只是那些支持 ASCII 碼覆蓋的羅馬數(shù)字的語言帆阳。這是 Python 3 在處理文本時選擇使用 Unicode 的原因。
Python 3 的開發(fā)過程大致是這樣的:
在 2004 年我們開始開始設(shè)計 Python 3屋吨。我們清楚 Python 的受歡迎程度在不斷上升蜒谤,我們也希望能夠延續(xù)這種勢頭。但這也同時意味著如果我們想及時修正所有的設(shè)計缺陷來保證它的受歡迎度至扰,最好趁現(xiàn)在而不是以后鳍徽。我們設(shè)想 Python 3 相較于 Python 2 會持續(xù)更長一段時間,而 Python 2.7 僅僅是用來維護以前遺留的項目敢课,不會用于新項目中阶祭,那用 Python 3 寫出的代碼一定會多于用 Python 2 的。所以我們決定來承受由 Python 2 向 3 轉(zhuǎn)型之痛濒募。并且在這種設(shè)想下開發(fā)了 Python 3。
以后我們再也不會做這種打破向后兼容性的事情圾结。
但是事情顯然沒有開發(fā)者想象的那么簡單瑰剃,由于缺乏向下的兼容性,而且 Python 2 的代碼歷史悠久筝野,庫包豐富晌姚,并且大部分程序都是生產(chǎn)環(huán)境的應用,遷移成本太高遗座,看不到顯而易見的好處舀凛。另外俊扳,由于 Python 2 是如此好用以至于開發(fā)者們掌握了熟練的技巧避免 str 帶來的陷阱途蒋。發(fā)布完 Python 3 之后,Python 的核心開發(fā)者們認為社區(qū)會最終摒棄上一個版本馋记,痛痛快快的轉(zhuǎn)向新世界号坡。但事與愿違,兩個版本并存的情況持續(xù)了近十年之久梯醒。Python 的開發(fā)者們又花費了更多的時間設(shè)計了一個 Python 2/3 的兼容子集來實現(xiàn)這種過渡宽堆。
關(guān)于 Python 2 和 3的主要區(qū)別,可以參考這篇文章:
http://www.runoob.com/python/python-2x-3x.html
那么該學 Python 2 還是 Python 3 呢茸习?如果是五年前我推薦學習 Python 2畜隶,兩年前我推薦都要學都要掌握,事實上在 Mac 環(huán)境里用 homebrew 安裝和使用兩個版本的環(huán)境是非常方便的。時至今日籽慢,大量的庫已經(jīng)開始普遍支持 Python 3 了浸遗,而且 Python 3 的特性已經(jīng)遠遠不是解決 str 問題了,所以現(xiàn)在我會推薦你直接學習 Python 3箱亿。
看看 Instagram 的案例跛锌,在相當長的一段時間,Instagram 都跑在 Python 2.7 + Django 1.3 的組合之上届惋。在經(jīng)過一系列的討論后髓帽,他們最終做出一個重大的決定:升級到 Python 3。
Python 3 有什么優(yōu)勢呢脑豹?新特性郑藏,比如類型注解 Type Annotations;提供了更好的性能瘩欺;并且社區(qū)的支持重心已經(jīng)完全遷移到 Python 3译秦,有什么理由再去使用 Python 2 呢?
關(guān)于 Instagram 和 Python 的故事击碗,大家可以下載「極客時間」筑悴,找到熱點專題里的「編程語言」,一篇長文稍途,有詳細的描述阁吝。
Python 相關(guān)文章:
人生苦短,我用 PythonPython 之禪Python 的進擊
點擊 閱讀原文械拍,下載極客時間 iOS 版突勇。