1. 程式人生 > >Python2.7很快就是過去式了!還在用2.7的程序員,準備一份3指南

Python2.7很快就是過去式了!還在用2.7的程序員,準備一份3指南

細節 這樣的 並不是 over har 明顯 items b16 一個

技術分享圖片

Python 3 功能簡介

Python 是機器學習和其他科學領域中的主流語言,我們通常需要使用它處理大量的數據。Python 兼容多種深度學習框架,且具備很多優秀的工具來執行數據預處理和可視化。

技術分享圖片

技術分享圖片

使用 pathlib 更好地處理路徑

pathlib 是 Python 3 的默認模塊,幫助避免使用大量的 os.path.joins:

技術分享圖片

技術分享圖片

PyCharm 中的類型提示示例:

技術分享圖片

Python 不只是適合腳本的語言,現在的數據流程還包括大量步驟,每一步都包括不同的框架(有時也包括不同的邏輯)。

技術分享圖片

上述代碼適用於 numpy.array(包括多維)、astropy.Table 和 astropy.Column、bcolz、cupy、mxnet.ndarray 等。

該代碼同樣可用於 pandas.Series,但是方式是錯誤的:

技術分享圖片

這是一個兩行代碼。想象一下復雜系統的行為多麽難預測,有時一個函數就可能導致錯誤的行為。明確了解哪些類型方法適合大型系統很有幫助,它會在函數未得到此類參數時給出提醒。


技術分享圖片

如果你有一個很棒的代碼庫,類型提示工具如 MyPy 可能成為集成流程中的一部分。不幸的是,提示沒有強大到足以為 ndarrays/tensors 提供細粒度類型,但是或許我們很快就可以擁有這樣的提示工具了,這將是 DS 的偉大功能。

技術分享圖片

函數註釋的其他用處

如前所述,註釋不會影響代碼執行,而且會提供一些元信息,你可以隨意使用。

例如,計量單位是科學界的一個普遍難題,astropy 包提供一個簡單的裝飾器(Decorator)來控制輸入量的計量單位,並將輸出轉換成所需單位。

技術分享圖片

下面 Python 3 帶有 @ 作為矩陣乘法的符號更具有可讀性,且更容易在深度學習框架中轉譯:因為一些如 X @ W + b[None, :] 的代碼在 numpy、cupy、pytorch 和 tensorflow 等不同庫下都表示單層感知機。

使用 ** 作為通配符

遞歸文件夾的通配符在 Python2 中並不是很方便,因此才存在定制的 glob2 模塊來克服這個問題。遞歸 flag 在 Python 3.6 中得到了支持。

技術分享圖片

技術分享圖片

在 Jupyter 中,非常好的一點是記錄每一個輸出到獨立的文檔,並在出現錯誤的時候追蹤出現問題的文檔,所以我們現在可以重寫 print 函數了。

在下面的代碼中,我們可以使用上下文管理器暫時重寫 print 函數的行為:

技術分享圖片

f-strings 可作為簡單和可靠的格式化

默認的格式化系統提供了一些靈活性,且在數據實驗中不是必須的。但這樣的代碼對於任何修改要麽太冗長,要麽就會變得很零碎。而代表性的數據科學需要以固定的格式叠代地輸出一些日誌信息,通常需要使用的代碼如下:

技術分享圖片

「true division」和「integer division」之間的明顯區別

對於數據科學來說這種改變帶來了便利(但我相信對於系統編程來說不是)。

技術分享圖片

嚴格排序

技術分享圖片

輸出:

  • Python 2: 6 ??
  • Python 3: 2 您好.
技術分享圖片

  • Python 2: Counter({‘\xc3‘: 2, ‘b‘: 1, ‘e‘: 1, ‘c‘: 1, ‘k‘: 1, ‘M‘: 1, ‘l‘: 1, ‘s‘: 1, ‘t‘: 1, ‘\xb6‘: 1, ‘\xbc‘: 1})
  • Python 3: Counter({‘M‘: 1, ‘?‘: 1, ‘b‘: 1, ‘e‘: 1, ‘l‘: 1, ‘s‘: 1, ‘t‘: 1, ‘ü‘: 1, ‘c‘: 1, ‘k‘: 1})

這些在 Python 2 裏也能正確地工作,但 Python 3 更為友好。

保留詞典和**kwargs 的順序

在 CPython 3.6+ 版本中,字典的默認行為類似於 OrderedDict(在 3.7+版本中已得到保證)。這在字典理解(和其他操作如 json 序列化/反序列化期間)保持順序。

技術分享圖片

註意到了嗎?名稱的唯一性也會被自動檢查。

叠代地拆封

技術分享圖片

節省 3 倍空間,而且速度更快。實際上,類似的壓縮(不過與速度無關)可以通過 protocol=2 參數來實現,但是用戶通常會忽略這個選項(或者根本不知道)。

更安全的解析

技術分享圖片

關於 super 和方法解析順序的更多內容,參見 stackoverflow:https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods

更好的 IDE 會給出變量註釋

在使用 Java、C# 等語言編程的過程中最令人享受的事情是 IDE 可以提供非常好的建議,因為在執行代碼之前,所有標識符的類型都是已知的。而在 Python 中這很難實現,但是註釋可以幫助你:

  • 以清晰的形式寫下你的期望
  • 從 IDE 獲取良好的建議
技術分享圖片

這是一個帶變量註釋的 PyCharm 示例。即使你使用的函數不帶註釋(例如,由於向後兼容性),它也能工作。

技術分享圖片

技術分享圖片

很明顯,代碼的作者還沒熟悉 Python 的代碼風格(很可能剛從 cpp 和 rust 跳到 Python)。不幸的是,這不僅僅是個人偏好的問題,因為在 SVC 中改變參數的順序(adding/deleting)會使得代碼無效。特別是,sklearn 經常會重排序或重命名大量的算法參數以提供一致的 API。每次重構都可能使代碼失效。

在 Python3,庫的編寫者可能需要使用*以明確地命名參數:

技術分享圖片

小調:單精度整數類型

Python 2 提供了兩個基本的整數類型,即 int(64 位符號整數)和用於長時間計算的 long(在 C++變的相當莫名其妙)。

Python 3 有一個單精度類型的 int,它包含了長時間的運算。

下面是查看值是否是整數的方法:

技術分享圖片

數據科學特有的代碼遷移問題(以及如何解決它們)

停止對嵌套參數的支持:

技術分享圖片

  • map(), .keys(), .values(), .items(), 等等返回叠代器,而不是列表。叠代器的主要問題有:沒有瑣碎的分割和無法叠代兩次。將結果轉化為列表幾乎可以解決所有問題。
  • 遇到問題請參見 Python 問答:我如何移植到 Python 3?(https://eev.ee/blog/2016/07/31/python-faq-how-do-i-port-to-python-3/)

用 python 教機器學習和數據科學的主要問題

  • 課程作者應該首先花時間解釋什麽是叠代器,為什麽它不能像字符串那樣被分片/級聯/相乘/叠代兩次(以及如何處理它)。
  • 我相信大多數課程作者很高興避開這些細節,但是現在幾乎不可能。

結論

Python 2 與 Python 3 共存了近 10 年,時至今日,我們必須要說:是時候轉向 Python 3 了。

研究和生產代碼應該更短,更易讀取,並且在遷移到 Python 3 代碼庫之後明顯更加的安全。

現在大多數庫同時支持 2.x 和 3.x 兩個版本。但我們不應等到流行工具包開始停止支持 Python 2 才開始行動,提前享受新語言的功能吧。

遷移過後,我敢保證程序會更加順暢:「我們不會再做向後不兼容的事情了(https://snarky.ca/why-python-3-exists/)」。

進群:125240963 ,即可獲取數十套PDF!

Python2.7很快就是過去式了!還在用2.7的程序員,準備一份3指南