如何從C++轉Python:改變你的思維方式
從 C++ 轉 Python 的時候,我已經是一個有四年全職工作經驗的軟體開發者了。我的工作主要是用 C++在 Linux 上程式設計,是 QT 庫的重度使用者。但剛開始用 Python 的時候,我卻寫得很爛。
從 C++到 Python 的過渡已經有了大約三年時間,我覺得是時候總結一下這段時間的經歷了。回想起來,我改變的不只是自己所用的程式語言,還有工作方式和我對程式碼的看法。
C++和 Python 的區別此處不做贅述,網上可以找到很多相關資訊。此處只講述我的個人經歷。
從 C++跳到 Python(圖源:Unsplash ;上傳者:Erik Dungan )
C++是跳水,Python 是潛水
C++給人的感覺就像是一頭扎進奇幻神祕的大海里——它是如此美妙,但需要更多學習和訓練。總的來看,你遊過的水面不會很大。而 Python 有點像潛水——把頭伸進水裡就能看到它的美,但你不會太深入,而是在淺水裡遊啊遊,可以輕易地遊過很大一片地方。兩種語言如此不同,所以適用的場景也不同。
深入 C++並努力成為倖存者
C++更為嚴格,在你犯錯的時候會更加嚴厲地懲罰你。一次都沒有收到過 Segmentation fault 的編碼會話算不上有效的編碼會話。因此,你需要更加了解計算機、編譯器和語言。如果深入下去,你會被其中蘊含的美所打動,如編譯過程和記憶體管理。
作為一名 C++程式員,我更關心句法調整和奇怪的例子。我一直知道我是怎麼分配、釋放記憶體的。我寫的程式更加獨立,因為我更想知道自己的程式碼內部究竟發生了什麼。我主要是覺得其他人編寫的程式碼不太可靠,更容易出錯,並且可能會增加記憶體使用量。
Vim、GDB 和 Valgrind 是我用到的主要日常工具*。*Vim 有很多用於編寫程式碼的外掛,GDB 用於 debug,Valgrind 用於分析我的記憶體佔用和錯誤。我用 g++編譯,自己寫 Makefiles。那時候,我覺得 IDE 沒什麼用,還會拖慢速度,讓我失去接觸程式碼的機會。回想起來,我非常依賴編譯器來查詢型別錯誤。
圖源:Unsplash;上傳者:Jakob Boman
淺嘗 Python
轉向 Python 時,你需要學習的第一件事情就是如何放手:你不知道程式碼的底層到底發生了什麼,記憶體被分配到哪裡、釋放到哪裡,但沒關係。你也會被鼓勵使用其他人寫的封裝為庫的程式碼,這能幫助你節省時間,提高編碼速度。這並不意味著你需要寫慢如蝸牛並依賴於無維護和無功能的庫的程式碼,其中的關鍵是很不同的。
剛開始用 Python 寫程式碼時,我用 Python 寫 C++。這也行得通,但我並沒有從這門語言中獲得任何收益。當我開始以更加 Python 式的風格來寫程式碼並使用庫以及更多高階概念(如 generators、decorators 和 contexts)時,我的程式設計技巧才得到提升。
作為一個 Python 開發者,我傾向於首先尋找能解決眼前問題的庫。Python 擁有豐富的庫生態系統和社群的支援。有很多具有專門用途的庫。這些是我經常會用到的庫: ofollow,noindex" target="_blank">NumPy (數值計算)、 OpenCV (計算機視覺)、json(閱讀 json 檔案)、SciPy(科學計算)、sqlite3(資料庫)。
我每天使用的工具是帶有 IdeaVim 外掛的 PyCharm (這是一個 IDE)。我開始用這個工具是因為它是一個很強大的偵錯程式,比預設的 Python 偵錯程式 pdb 更加友好。我還使用了 pip 來安裝需要的庫。除非必要,我一般都不再監控記憶體使用了。
圖源:Unsplash ;上傳者:Channey
一些實用技巧
如果你是一個 C++開發者,並且考慮開始寫 Python,以下是我的一些建議:
-
改掉老習慣:別再使用 C++編譯器作為偵錯程式。不用再過度優化記憶體使用。避免寫出 C++風格的程式碼。並且無論如何,不要再依賴型別。
-
養成新習慣:開始使用庫。寫 Python 式的程式碼(但不要為了寫而寫),保證程式碼的可讀性。嘗試使用一些更加複雜的概念,如 generators、decorators、contexts。嘗試 PyCharm。
-
使用 C++和 Python 共用庫:一些 C++庫(如OpenCV、QT)有 Python 介面。在 Python 中使用相同的庫會比從零開始學習一個新庫更加容易。
-
勿忘初心:有時候 Python 實在是太慢或者不適合你的任務,C++經驗就派上用場了。有很多方式(SIP、ctypes 等)可以讓你在 Python 內使用 C++程式碼。
結語
無論其他人說什麼,切換到另一種程式語言都不容易,尤其是切換到一種與你用過的語言完全不同的語言。你要花時間去學習、挖掘、發現。但最重要的是,你要改變的不僅僅是語言,還有編碼風格和工作方法。