致 Python 初學者

天元浪子發表於2019-11-13

1. 前言

歡迎來到“Python進階”專欄!來到這裡的每一位同學,應該大致上學習了很多 Python 的基礎知識,正在努力成長的過程中。在此期間,一定遇到了很多的困惑,對未來的學習方向感到迷茫。我非常理解你們所面臨的處境。我從2007年開始接觸 python 這門程式語言,從2009年開始單一使用 python 應對所有的開發工作,直至今天。回顧自己的學習過程,也曾經遇到過無數的困難,也曾經迷茫過、困惑過。開辦這個專欄,正是為了幫助像我當年一樣困惑的 Python 初學者走出困境、快速成長。希望我的經驗能真正幫到你們。

2. 明確學習目標,不急於求成,不好高騖遠

當下是一個喧囂、浮躁的時代。我們總是被生活中大量湧現的熱點所吸引,幾乎沒有深度閱讀和思考的時間和機會。我始終認為,學習是需要沉下心來慢慢鑽研的,是長期的;同時,學習不應該被賦予太多的功利色彩。一個Python 程式設計師的成長路線圖應該是這樣子的:基礎語法–>語感訓練–>課題練習–>分方向繼續學習–>中級程式設計師–>擴充深度和廣度–>高階程式設計師。
在這裡插入圖片描述然而,很多新手的學習路線圖卻是這樣子的:學完基礎語法之後,不瞭解 http 協議和 Ajax 非同步請求,就興沖沖研究爬蟲去了;或者,學完基礎語法,就去搞視覺識別,連 OpenCV 的資料結構都看不懂;甚至,學完基礎語法就直接研究神經網路,結果是重演了一遍從入門到放棄。
在這裡插入圖片描述我給初學者的建議就是,不急於求成,不好高騖遠,一步一步,穩紮穩打,功到自然成。不急於求成,可以避免走彎路,非但不會延緩你成長的速度,反倒會節省你的時間。不好高騖遠,達成一個目標,再製定下一個目標,在連續的成功和進步中,建立起自信心,激發出更強的學習興趣。

3. 在開始學習 Python 之前,你需要做一些準備

Now is better than never,
Although never is often better than *right* now.

這是Python之禪中的一句,翻譯過來的意思是,做也許好過不做,但不假思索就動手還不如不做。的確,在開始學習 Python 之前,你需要了解的一些背景,做出一些選擇,並在你的計算機上做好準備工作。

2.1 Python 的各種發行版

Python 是龜叔的獨生子,但他有很多堂兄弟,比較有名的也有好幾位。如果你不確定哪個對你更友好,我建議你選擇嫡傳的 Python——即便你將來需要和他的其他堂兄弟打交道,那也是熟門熟路。不建議初學者選擇AnacondaPython 和 ActivePython,在我看來他們提供的便利不如給使用者學習帶來的麻煩多。

Cpython

CPython 屬於 Python 參考實現方案,可算是所有其他 Python 衍生髮行版的一套標準化版本。CPython 利用 C 語言編寫而成,而其編寫者包含多位 Python 語言頂級決策層中的核心人員。CPython 在優化方面表現得最為保守。當然,這並不是缺點,而是設計取向。Python 的維護者們希望將 CPython 打造為 Python 最具廣泛相容性與標準化的實現方案。CPython 最適合對 Python 標準的相容性與一致性要求較高的使用者。此外,CPython 同樣適用於希望以最基本方式使用 Python並願意為此放棄某些便捷性的專業人士。

Anaconda Python

Anaconda 源自 Anaconda 公司之手(原名為 Continuum Analytics),其設計目標在於服務那些需要由商業供應商提供支援且具備企業支援服務的 Python 開發者。Anaconda Python 的主要用例包括數學、統計學、工程、資料分析、機器學習以及其他相關應用。Anaconda 捆綁有 Python 商業與科學使用場景當中的各類常用庫——包括 SciPy、NumPy 以及 Numba 等等,同時通過一套定製化軟體包管理系統提供更多庫訪問能力。

ActivePython

與Anaconda類似,ActivePython同樣由營利性企業建立及維護——ActiveState公司。該公司還在銷售多種語言執行時以及多語言Komodo IDE。ActivePython主要面向企業使用者與資料科學家——即希望使用Python語言,但又不願把大量精力浪費在Python的組裝與管理方面。ActivePython使用Python中的常規pip軟體包管理器,但同時亦以認證壓縮包的形式提供數百套通用庫,外加英特爾數學核心庫等其他一些具有第三方依賴關係的公共庫。

PyPy

PyPy 屬於CPython直譯器的替代品,其利用即時(JIT)編譯以加速Python程式的執行。根據實際執行的任務情況,其效能提升可能非常顯著。人們對於Python——特別是CPython的抱怨之聲,主要圍繞其速度表現展開。在預設情況下,Python的執行速度遠不及C語言——差距甚至可能達到數百倍。PyPy JIT將Python程式碼編譯為機器語言,從而帶來平均7.7倍於CPython的執行速度。在某些特定任務中,其提速效果能夠達到50倍。

Jython

JVM(Java虛擬機器)能夠作為除Java之外的多種語言的執行時選項。這份長的名單包括Groovy、Scala、Clojure、Kotlin、Python以及——沒錯,當然還有Jython 。Jython最大的弊端在於其僅支援Python的2.x版本。目前對Python 3.x版本的支援能力尚在開發當中,但仍需要相當一段時間。當下,還沒有任何相關版本放出。

IronPython

類似於Jython的JVM上Python實現方案定位,IronPython屬於一套立足.Net執行時——或者CLR(公共語言執行時)——的Python實現方案。IronPython利用CLR的DLR(動態語言執行時)以允許Python程式以等同於CPython的動態水平實現執行。與Jython類似,IronPython目前只支援Python 2.x版本。不過IronPython 3.x實現方案已經處於緊鑼密鼓的開發當中。

2.2 安裝 Python

從 Python 官網下載時,請注意選擇正確的版本。如果是用於學習,下載最新版沒有問題,如果是用於生產,則要考慮你開發需要的第三方模組是否支援最新版的 Python。安裝時不要忘記勾選最下面的兩個核取方塊,否則會給後續的模組安裝帶來一些麻煩。推薦使用預設方式安裝。
在這裡插入圖片描述

2.3 選擇一款趁手的開發工具

學習一種程式語言,首先要找一款合用的整合開發工具,似乎是自然而然的想法。為什麼不呢?IDE可以自動補齊,可以一鍵執行,還可以斷點除錯。使用IDE開發專案,就像駕駛一輛內飾豪華的汽車,盡情享受駕駛的樂趣就好了,誰還去關心引擎蓋裡面發動機是如何工作的呢?我的年輕同事們也都是IDE的擁躉,最初使用pycharm,後來是時下大熱的vscode。

可是,我始終認為,程式設計就像是駕駛,程式設計師就是司機,而且是職業司機,不是把駕駛當成通勤技能的各色白領金領。既然是職業司機,就不能滿足於打著領結、戴著白手套駕駛內飾豪華、配置高階的汽車,而是必須具備開啟引擎蓋子維修和保養的能力。

基於這個觀點,我不建議初學者一開始就使用整合開發工具——至少,在開始第一個星期不要使用IDE。對於python這樣一種解釋型的指令碼語言,一款趁手的編輯器就足夠了。linux平臺上,vim或者emacs都足夠好(如果你通曉二者或者其中之一的話,請接受我的敬意);windows平臺上,我推薦使用notepad++。python初學者使用編輯器而非IDE的好處是:

  1. 專注於python本身,而不是被工具使用問題所困擾。君不見,知乎上關於pycharm和vscode的使用說明、常見問題的解決方案,多得幾乎超過了討論python本身
  2. 手工執行程式碼,可以更直觀、更深刻地瞭解指令碼的解釋執行過程
  3. 手工除錯程式碼,有助於程式碼優化,提高程式碼把控能力
  4. 可以更好地使用pip安裝和管理第三方模組

3. 習慣使用IDLE,這是學習python最好的方式

解釋型語言的優勢,就是可以寫一句執行一句,想到哪兒寫到哪兒,不必像編譯型語言那樣得把程式全部寫完,編譯成功後才能執行。我特別喜歡使用python的IDLE,甚至拿它當計算器用。很多時候,我用IDLE驗證程式碼的寫法是否正確,檢視模組是否安裝成功以及版本號。IDLE支援tab鍵自動補齊,我經常用這個功能檢視某個物件的方法和屬性。

>>> import numpy as np
>>> np.__version__
'1.17.0'
>>> np.hypot(3,4)
5.0
>>> def factorial(n): # 計算n的階乘
	if n == 0: # 遞迴出口
		return 1
	return n*factorial(n-1) # 向遞迴出口方向靠近的自身呼叫

>>> factorial(5)
120
>>> _*2-100
140

小技巧

  1. tab鍵自動補齊
  2. 游標移動到執行過的語句上敲擊回車,可以重複這個命令
  3. 下劃線(_)可以獲取最後一次執行結果

實際上,IDLE就是一個IDE,你可以用它來建立或開啟.py指令碼檔案,可以編輯、執行和除錯。

在這裡插入圖片描述

4. 嚴格遵從編碼規範

Linux 平臺上,一個 python 原始碼檔案應該以下部分組成。Windows 平臺上,可以省略第一項。

  1. 直譯器宣告
  2. 編碼格式宣告
  3. 模組註釋或文件字串
  4. 模組匯入
  5. 常量和全域性變數宣告
  6. 頂級定義(函式或類定義)
  7. 執行程式碼

附上一個 demo,僅供參考。更詳細的編碼規範,請參考拙作《我的 Python 編碼規範》

#!/usr/bin/env python
# -*- coding: utf-8 -*-


"""通常這裡是關於本文件的說明(docstring),須以半形的句號、 問號或驚歎號結尾!

本行之前應當空一行,繼續完成關於本文件的說明
如果文件說明可以在一行內結束,結尾的三個雙引號不需要換行;否則,就要像下面這樣
"""


import os, time
import datetime
import math

import numpy as np
import xlrd, xlwt, xlutils

import youth_mongodb
import youth_curl


BASE_PATH = r"d:\YouthGit"
LOG_FILE = u"執行日誌.txt"


class GameRoom(object):
    """對局室"""
    
    def __init__(self, name, limit=100, **kwds):
        """建構函式!
        
        name        對局室名字
        limit       人數上限
        kwds        引數字典
        """
        
        pass


def craete_and_start():
    """建立並啟動對局室"""
    
    pass


if __name__ == '__main__':
    # 開啟遊戲服務
    start()

5. 程式碼的執行、除錯

如果你使用的整合開發工具,那麼程式碼的執行和除錯,就完全依賴於工具了。如果你使用編輯器開寫程式碼,那就需要手工執行和除錯程式碼。執行程式碼分成兩步:

第1步,開啟一個命令列視窗,路徑切換到指令碼所在的資料夾。我習慣在指令碼所在視窗的空白位置(確保沒有選中任何物件),按下shift鍵點選滑鼠右鍵,在彈出的選單中選擇開啟Powershell視窗。如下圖所示。
在這裡插入圖片描述
第2步,輸入python+空格+指令碼檔名,回車即可執行。輸入指令碼檔名時,按tab可以自動補齊。指令碼的執行資訊、錯誤資訊、執行結果等,都可以顯示在這個視窗中。這是最原始的資訊。你在其他開發工具中看到資訊,都是對這些資訊的再加工。

手工除錯程式碼的手段不多,除了 print 資訊,幾乎只有把除錯資訊寫成除錯檔案了。聽起來,好像問題很嚴重,其實只是理念和取向不同而已。反過來想,手段單一,不恰好意味著簡單、簡明嗎?十幾年來,我一直使用 print 除錯,堅信沒有比它更好的了。

5. 模組管理

在python語言的發展過程中,安裝和管理第三方模組的方法也歷經變化。現在,我們終於等來了pip這個近乎完美的工具。pip除了安裝(install)和刪除(uninstall)這兩大功能,還可以指定模組的安裝版本(無需預先刪除當前已安裝版本),可以顯示所有已安裝的模組,還可以通過 upgrade 自主升級。

很多同學在使用pip時會遇到各種各樣稀奇古怪的問題,我在這裡解釋一下:

5.1 同時安裝了py2/py3

同時安裝了py2/py3,將會存在多個版本的pip.exe,你如果直接執行:

pip install <模組名>

則有可能因為pip.exe版本不對而出錯。正確的做法是指定python版本,-m是python直譯器的引數,意思是把pip模組做為指令碼執行,完整命令如下:

py -3 -m pip install <模組名>

5.2 使用Anaconda,或者通過IDE來安裝模組

如果你使用的是Anaconda Python,或者你是通過IDE來安裝模組,則需要檢查它們的配置和設定,情況各有不同,沒有統一的解決方案。

5.3 僅安裝了py2 或 py3

如果你的計算機只安裝了py2 或者 py3,那麼上面兩種安裝方法應該都沒有問題。如果你的電腦找不到pip.exe檔案,則可以使用這個命令生成:

python -m ensurepip

5.4 pip應用演示

下面,就以同時安裝了py2/py3的計算機為例(如果只安裝了py2或py3,需要將下面演示中的py -3替換成python),演示pip模組的用法。不管任何情況,我都建議使用-m引數呼叫pip模組,而不是直接使用 pip.exe 安裝模組。

# 雖然可以這樣使用pip安裝模組(以numpy為例)
PS D:\XufiveGit\wxgl> pip install numpy

# 但我建議這樣使用pip
PS D:\XufiveGit\wxgl> py -3 -m pip install numpy

# 刪除模組
PS D:\XufiveGit\wxgl> py -3 -m pip uninstall numpy

# 安裝模組,指定版本
PS D:\XufiveGit\wxgl> py -3 -m pip install numpy=1.15.0

# 自主升級
PS D:\XufiveGit\wxgl> py -3 -m pip install --upgrade pip

# 顯示已安裝的模組
PS D:\XufiveGit\wxgl> py -3 -m pip list
Package           Version
----------------- -----------
-pencv-python     4.1.1
argh              0.26.2
attrs             19.1.0
Automat           0.7.0
basemap           1.2.0
beautifulsoup4    4.6.3
bleach            3.1.0
cefpython3        66.0
... ...

pip也用來安裝本地whl檔案:

PS D:\PyPackage\py3> py -3 -m pip install .\basemap-1.2.0-cp37-cp37m-win_amd64.whl

5.5 模組倉庫

如果你需要下載python模組,這裡是我見過的最全、最穩定的python模組倉庫,由加州大學歐文分校熒光動力學實驗室建立並維護。

5.4 釋出自己的模組安裝包

如果你的很多個專案中,都會用到你自己的某些模組,那麼,把這些模組做成安裝包,安裝到你的開發環境裡,可能是最佳選擇。拙作《學習筆記:釋出自己的python模組安裝包》對此有詳細說明。

後記

近期有很多朋友通過私信諮詢有關Python學習問題。為便於交流,我在CSDN的app上建立了“Python作業輔導”大本營,面向Python初學者,為大家提供諮詢服務、輔導Python作業。歡迎有興趣的同學使用微信掃碼加入。

在這裡插入圖片描述

從部落格到公眾號,每一篇、每一題、每一句、每一行程式碼,都堅持原創,絕不復制抄襲,這是我堅守的原則。如果喜歡,請關注我的微信公眾號“Python作業輔導員”。

在這裡插入圖片描述

相關文章