學習 Python 有幾周了,也寫了 2 個小項目來解決本身的實際需求。簡單記錄一下,供本身備忘,也供後來者參考。html
我以前使用 Swift + Vapor 開發了 iPic (圖牀工具) 的後端服務,遇到不少問題:python
接下來要開發 Klib (Kindle、iBooks 標註管理) 的標註分享功能,須要後端支持,因而打算好好學一學後端開發。mysql
適合後端開發的語言仍是挺多的,好比 Java、PHP、Python、Ruby、Go、Javascript、等等。我其實並無嚴格比較,最後選擇了 Python,主要緣由實際上是和 Swift 相對的:nginx
還有個緣由,以前我接觸過的開發語言(VB/C++/Java/C#/Swift)都是編譯型的,此次想學個 解釋型 的玩玩。git
先形而上地聊聊這個話題。github
至少從個人經驗來看,在學習同樣新東西時,我很但願能被告知要學什麼,相似於一個大綱、知識點清單。這樣,我就能夠對照着清單同樣樣學習,方向感清晰、還不怕走彎路。sql
而事實上,不多有這樣的「清單」,最接近的多是書的目錄。惋惜,好書實在太少了。尤爲技術更新快,書中的知識極可能是陳舊的。shell
出於這個理解,本文我只會 羅列我學習 Python 時所遇到的知識點,儘可能組織成系統的清單。數據庫
清單上的知識點,我並不打算展開講,由於:django
因此,對於某一個具體的點,還得你本身去學習。至於怎麼學?我建議,在項目開發實際用到某個點時,再參考官網系統性的學習。
若是你實在急的必須在被炒魷魚以前解決某個問題(一般並不存在),你能夠上網搜索,一般在技術博客、StackOverflow 這樣的網站上能找到答案。
不過,這是種投機行爲、可能會有 陷阱:
好,嘮叨了半天,終於來乾的了。
Python 的 二、3 之爭,在網上能夠找到不少。雖然我一貫主張學新不學舊(好比我甚至嘗試用 Swift 開發後端,no zuo no die…),但在後端方面,因爲吃了 Swift 的虧,我本身選擇先學習 Python 2。真到了不起不用 3 的時,學。聽說差異並不大(我保證,絕對沒有 Swift 2 和 3 的差異大)
雖然說我一貫建議以官網爲基礎學習,但 Python 的官網的文檔實在是太長了。沒辦法,爲了全面性,各類犄角旮旯、你一生都用不到點的,官網也要說起。
這裏介紹 2 個 Python 入門教程:
我建議,一旦有了語法基礎,儘早 開發實際的、能解決本身問題的項目(或表述爲工程、產品、工具、輪子)。
注意,必定要是「能解決本身問題的項目」。相信我,若是隻是作一個你本身根本用着的博客系統、爬蟲之類的,學習過程當中的困難必定會讓你半途而廢的。
若是你真的想寫個好項目,項目的文件夾結果必定要拿得出手,好比要區分代碼、配置、數據、文檔、測試等文件。尤爲對於在不一樣服務器上部署、須要區分開發與生產環境的項目,更重要。
注意,文件夾結構並無惟一解;而且,和你使用的網絡框架(後面會介紹)相關。在實踐中逐漸優化,越早造成一套本身熟悉的項目結構,收益越大。
我在 GitHub 上建立了一個 Python 項目文件夾結構示例,供參考。
參考:
單元測試很重要、很重要、很重要。
尤爲對於後端程序,幾乎沒有用戶交互,很是適合進行單元測試。也許,一些已經超出了單元測試的範疇,稱之爲功能測試、壓力測試、等等更合適。Anyway,叫測試就對了。
我在開發過程當中有寫單元測試的習慣,甚至有時會先寫單元測試、再寫功能代碼(恩,這就是測試驅動開發)。
在多個測試框架中,我目前選擇 pytest:一直在更新、對 Python 3 支持好、自動發現測試用例。
我一位大學同窗,用 Windows 記事本開發了一個局域網內 IM 工具,可那是爲了學習。人生苦短,仍是用 IDE 開發吧。
選什麼呢?其實我並無糾結,由於以前在 Windows 上使用 Visual Studio、且一直聽聞 Visual Studio Code 不錯,就直接上了 VS Code
不過,VS Code 自己只提供一個框架,要打造適合本身的 IDE,還得有一系列的配置,好比主題、字體、快捷鍵、插件、等等。
就 Python 開發,目前還有幾點不順手(若是你知道怎麼作,麻煩告訴我):
Python 的優點之一,就是輪子多,也就是庫(模塊)豐富。碰到一個問題,你不愁找不到庫,而是不知道該選哪一個,甜蜜的煩惱。
號外:我爲 Python 造的第一個輪子:AES256CBC
任何語言都會把經常使用的庫,歸入本身的標準庫中。其實,不少時候咱們說一門語言,都是在學其標準庫。
對於標準庫的學習,卻是建議參考 官方文檔
庫多了,管理就成了問題。這個沒什麼好說的,直接使用 pip
小技巧:
pip freeze > requirements.txt
pip install -r requirements.txt複製代碼
庫+庫,就是 Python 運行環境。尤爲,當你須要在服務器上部署 Python 項目時,保證服務器和開發環境有一致的 Python 運行環境,很重要。
推薦使用 pyenv,其利用 Shell 的 shims
機制,當你 cd 到項目目錄時,自動切換 Python 版本(對比 virtualenv,其須要手動執行 source 命令,麻煩)。
小建議:要在本身的電腦上特別創建一個「Python 髒環境」,用於平時寫臨時代碼、測試新模塊時使用,確保不會破壞電腦上的 Python 環境。
前面聽說,我學 Python 主要是爲了後端。我目前使用的是 Flask + Gunicorn + Nginx + MySQL + Supervisor 組合。
Python 的 Web 框架很多,不過聽說主要仍是 Django 和 Flask。聽說:
只要不是太不成熟、坑太多,我一般會選擇簡單的,因而,選 Flask.
Flask 是個大話題,根本不適合在這裏介紹,直接看 Flask Web Development 這本書吧,建議讀原文。
Flask 自帶的 Web 服務器只是能讓代碼跑起來,而真正用於生產,則須要考慮併發、緩存等問題。
主要的選擇是 uWSGI 和 Gunicorn,和 Flask 與 Django 的對比很類似:
因而,選 Gnuicorn.
Gnuicorn 的配置簡單,直接看官方文檔便可。
有了 Flask + Gunicorn,爲何還要 Nignx?職責不一樣,Nginx 在處理靜態資源、https/http二、負載均衡等方面,更擅長。
Nginx 我就不介紹了吧?主要仍是和 Gnuicorn 的配合。
本地測試,我直接使用 SQLite,但要用於服務器,仍是 MySQL 吧。
主要此次開發 Klib 後端服務,業務上的數據比較規整,適合關係數據庫;之後有機會再試試 NoSQL 吧。
服務,要的就是穩定。
啥叫穩定?就是程序掛了能滿血復活、從新運行。
因而,使用 Supervisor,監控程序運行,掛了就當即從新運行。
這麼長、這麼枯燥的文章你都能看完?牛!粉個人公衆號吧,之後每週二都會有一篇技術長文。
Python 我只是入門,要學的東西還不少,之後還會有小結、分享。
未完待續…