我入門 Python 後總結的基礎教程

0) 先嘮叨幾句

學習 Python 有幾周了,也寫了 2 個小項目來解決本身的實際需求。簡單記錄一下,供本身備忘,也供後來者參考。html

0.0) 我爲何選擇 Python

我以前使用 Swift + Vapor 開發了 iPic (圖牀工具) 的後端服務,遇到不少問題:python

  • 主要仍是 Swift 在 Ubuntu 下並不成熟,甚至不少關鍵性、基礎性的庫,都是 TBD;
  • 以及,基於 Swift + Ubuntu 的庫並很少,開發起來很吃力。

接下來要開發 Klib (Kindle、iBooks 標註管理) 的標註分享功能,須要後端支持,因而打算好好學一學後端開發。mysql

適合後端開發的語言仍是挺多的,好比 Java、PHP、Python、Ruby、Go、Javascript、等等。我其實並無嚴格比較,最後選擇了 Python,主要緣由實際上是和 Swift 相對的:nginx

  • Python 成熟,不管在 Windows/Linux/macOS 都很穩定。
  • Python 輪子多,幾乎全部能標準化的操做都能找到庫,而後你能夠專一於本身的業務。

還有個緣由,以前我接觸過的開發語言(VB/C++/Java/C#/Swift)都是編譯型的,此次想學個 解釋型 的玩玩。git

0.1) 首先,知道要學什麼

先形而上地聊聊這個話題。github

至少從個人經驗來看,在學習同樣新東西時,我很但願能被告知要學什麼,相似於一個大綱、知識點清單。這樣,我就能夠對照着清單同樣樣學習,方向感清晰、還不怕走彎路。sql

而事實上,不多有這樣的「清單」,最接近的多是書的目錄。惋惜,好書實在太少了。尤爲技術更新快,書中的知識極可能是陳舊的。shell

出於這個理解,本文我只會 羅列我學習 Python 時所遇到的知識點,儘可能組織成系統的清單數據庫

0.2) 然而,我並不會教你怎麼學

清單上的知識點,我並不打算展開講,由於:django

  • 這太花()時()間()了
  • 一般,官方文檔已經足夠好,我不必複製粘貼

因此,對於某一個具體的點,還得你本身去學習。至於怎麼學?我建議,在項目開發實際用到某個點時,再參考官網系統性的學習

若是你實在急的必須在被炒魷魚以前解決某個問題(一般並不存在),你能夠上網搜索,一般在技術博客、StackOverflow 這樣的網站上能找到答案。

不過,這是種投機行爲、可能會有 陷阱

  • 若是你找對了方案,可能很快就解決問題。
  • 可若是你找了過時的、錯誤的、不適合你的環境的方案,你可能會掉入解決 A 問題時遇到 B 問題、解決 B 問題時又遇到 C 問題這樣的陷阱,所花的時間,會當初系統性地學習,更多。

1) Python 語法及基礎

好,嘮叨了半天,終於來乾的了。

1.0) Python 2 or 3?

Python 的 二、3 之爭,在網上能夠找到不少。雖然我一貫主張學新不學舊(好比我甚至嘗試用 Swift 開發後端,no zuo no die…),但在後端方面,因爲吃了 Swift 的虧,我本身選擇先學習 Python 2。真到了不起不用 3 的時,學。聽說差異並不大(我保證,絕對沒有 Swift 2 和 3 的差異大)

1.1) 入門教程

雖然說我一貫建議以官網爲基礎學習,但 Python 的官網的文檔實在是太長了。沒辦法,爲了全面性,各類犄角旮旯、你一生都用不到點的,官網也要說起。

這裏介紹 2 個 Python 入門教程:

2) 儘早開發 Python 項目

我建議,一旦有了語法基礎,儘早 開發實際的、能解決本身問題的項目(或表述爲工程、產品、工具、輪子)。

注意,必定要是「能解決本身問題的項目」。相信我,若是隻是作一個你本身根本用着的博客系統、爬蟲之類的,學習過程當中的困難必定會讓你半途而廢的。

2.0) 項目的文件夾結構

若是你真的想寫個好項目,項目的文件夾結果必定要拿得出手,好比要區分代碼、配置、數據、文檔、測試等文件。尤爲對於在不一樣服務器上部署、須要區分開發與生產環境的項目,更重要。

注意,文件夾結構並無惟一解;而且,和你使用的網絡框架(後面會介紹)相關。在實踐中逐漸優化,越早造成一套本身熟悉的項目結構,收益越大。

我在 GitHub 上建立了一個 Python 項目文件夾結構示例,供參考。

參考:

2.1) 單元測試

單元測試很重要、很重要、很重要

尤爲對於後端程序,幾乎沒有用戶交互,很是適合進行單元測試。也許,一些已經超出了單元測試的範疇,稱之爲功能測試、壓力測試、等等更合適。Anyway,叫測試就對了。

我在開發過程當中有寫單元測試的習慣,甚至有時會先寫單元測試、再寫功能代碼(恩,這就是測試驅動開發)。

在多個測試框架中,我目前選擇 pytest:一直在更新、對 Python 3 支持好、自動發現測試用例。

2.2) IDE

我一位大學同窗,用 Windows 記事本開發了一個局域網內 IM 工具,可那是爲了學習。人生苦短,仍是用 IDE 開發吧。

選什麼呢?其實我並無糾結,由於以前在 Windows 上使用 Visual Studio、且一直聽聞 Visual Studio Code 不錯,就直接上了 VS Code

不過,VS Code 自己只提供一個框架,要打造適合本身的 IDE,還得有一系列的配置,好比主題、字體、快捷鍵、插件、等等。

就 Python 開發,目前還有幾點不順手(若是你知道怎麼作,麻煩告訴我):

  • 出錯時,不能點擊錯誤日誌跳轉至對應的代碼
  • 單元測試有時會卡死,重啓 VS Code 後正常
  • 調試工具跟 Xcode 等工具備差距
  • 快捷鍵沒辦法和 Xcode 統一,用起來很割裂

3) 善用 Python 庫

Python 的優點之一,就是輪子多,也就是庫(模塊)豐富。碰到一個問題,你不愁找不到庫,而是不知道該選哪一個,甜蜜的煩惱。

號外:我爲 Python 造的第一個輪子:AES256CBC

3.1) 標準庫

任何語言都會把經常使用的庫,歸入本身的標準庫中。其實,不少時候咱們說一門語言,都是在學其標準庫。

對於標準庫的學習,卻是建議參考 官方文檔

3.2) 管理 Python 庫

庫多了,管理就成了問題。這個沒什麼好說的,直接使用 pip

小技巧:

  • 對於項目的依賴庫,可使用 requirements.txt 集中管理。
pip freeze > requirements.txt
pip install -r requirements.txt複製代碼
  • 能夠將 Python 的安裝源改成國內豆瓣、阿里等鏡像源,速度快。

3.3) Python 運行環境

庫+庫,就是 Python 運行環境。尤爲,當你須要在服務器上部署 Python 項目時,保證服務器和開發環境有一致的 Python 運行環境,很重要。

推薦使用 pyenv,其利用 Shell 的 shims 機制,當你 cd 到項目目錄時,自動切換 Python 版本(對比 virtualenv,其須要手動執行 source 命令,麻煩)。

小建議:要在本身的電腦上特別創建一個「Python 髒環境」,用於平時寫臨時代碼、測試新模塊時使用,確保不會破壞電腦上的 Python 環境。

4) 使用 Python 開發網絡服務

前面聽說,我學 Python 主要是爲了後端。我目前使用的是 Flask + Gunicorn + Nginx + MySQL + Supervisor 組合。

4.0) Flask

Python 的 Web 框架很多,不過聽說主要仍是 DjangoFlask。聽說:

  • Django 的特色的大而全、開箱即用。
  • Flask 的特色的小巧靈活、定製性高。

只要不是太不成熟、坑太多,我一般會選擇簡單的,因而,選 Flask.

Flask 是個大話題,根本不適合在這裏介紹,直接看 Flask Web Development 這本書吧,建議讀原文。

4.1) Gunicorn

Flask 自帶的 Web 服務器只是能讓代碼跑起來,而真正用於生產,則須要考慮併發、緩存等問題。

主要的選擇是 uWSGIGunicorn,和 Flask 與 Django 的對比很類似:

  • uWSGI 的特色的成熟、用的人多、高性能、強大(複雜)
  • Gunicorn 則更簡單、易用

因而,選 Gnuicorn.

Gnuicorn 的配置簡單,直接看官方文檔便可。

4.2) Nginx

有了 Flask + Gunicorn,爲何還要 Nignx?職責不一樣,Nginx 在處理靜態資源、https/http二、負載均衡等方面,更擅長。

Nginx 我就不介紹了吧?主要仍是和 Gnuicorn 的配合。

4.3) MySQL

本地測試,我直接使用 SQLite,但要用於服務器,仍是 MySQL 吧。

主要此次開發 Klib 後端服務,業務上的數據比較規整,適合關係數據庫;之後有機會再試試 NoSQL 吧。

4.4) Supervisor

服務,要的就是穩定。

啥叫穩定?就是程序掛了能滿血復活、從新運行。

因而,使用 Supervisor,監控程序運行,掛了就當即從新運行。

5) 尾巴

這麼長、這麼枯燥的文章你都能看完?牛!粉個人公衆號吧,之後每週二都會有一篇技術長文。

Python 我只是入門,要學的東西還不少,之後還會有小結、分享。

未完待續…

相關文章
相關標籤/搜索