對python初學(xué)者的一些話
1. 前言
歡迎來到“Python進(jìn)階”專欄!來到這里的每一位同學(xué),應(yīng)該大致上學(xué)習(xí)了很多 Python 的基礎(chǔ)知識,正在努力成長的過程中。在此期間,一定遇到了很多的困惑,對未來的學(xué)習(xí)方向感到迷茫。我非常理解你們所面臨的處境。我從2007年開始接觸 python 這門編程語言,從2009年開始單一使用 python 應(yīng)對所有的開發(fā)工作,直至今天?;仡欁约旱膶W(xué)習(xí)過程,也曾經(jīng)遇到過無數(shù)的困難,也曾經(jīng)迷茫過、困惑過。開辦這個(gè)專欄,正是為了幫助像我當(dāng)年一樣困惑的 Python 初學(xué)者走出困境、快速成長。希望我的經(jīng)驗(yàn)?zāi)苷嬲龓偷侥銈儭?/p>
2. 明確學(xué)習(xí)目標(biāo),不急于求成,不好高騖遠(yuǎn)
當(dāng)下是一個(gè)喧囂、浮躁的時(shí)代。我們總是被生活中大量涌現(xiàn)的熱點(diǎn)所吸引,幾乎沒有深度閱讀和思考的時(shí)間和機(jī)會。我始終認(rèn)為,學(xué)習(xí)是需要沉下心來慢慢鉆研的,是長期的;同時(shí),學(xué)習(xí)不應(yīng)該被賦予太多的功利色彩。一個(gè)Python 程序員的成長路線圖應(yīng)該是這樣子的:基礎(chǔ)語法–>語感訓(xùn)練–>課題練習(xí)–>分方向繼續(xù)學(xué)習(xí)–>中級程序員–>拓展深度和廣度–>高級程序員。
然而,很多新手的學(xué)習(xí)路線圖卻是這樣子的:學(xué)完基礎(chǔ)語法之后,不了解 http 協(xié)議和 Ajax 異步請求,就興沖沖研究爬蟲去了;或者,學(xué)完基礎(chǔ)語法,就去搞視覺識別,連 OpenCV 的數(shù)據(jù)結(jié)構(gòu)都看不懂;甚至,學(xué)完基礎(chǔ)語法就直接研究神經(jīng)網(wǎng)絡(luò),結(jié)果是重演了一遍從入門到放棄。
我給初學(xué)者的建議就是,不急于求成,不好高騖遠(yuǎn),一步一步,穩(wěn)扎穩(wěn)打,功到自然成。不急于求成,可以避免走彎路,非但不會延緩你成長的速度,反倒會節(jié)省你的時(shí)間。不好高騖遠(yuǎn),達(dá)成一個(gè)目標(biāo),再制定下一個(gè)目標(biāo),在連續(xù)的成功和進(jìn)步中,建立起自信心,激發(fā)出更強(qiáng)的學(xué)習(xí)興趣。
3. 在開始學(xué)習(xí) Python 之前,你需要做一些準(zhǔn)備
Now is better than never,
Although never is often better than *right* now.
這是Python之禪中的一句,翻譯過來的意思是,做也許好過不做,但不假思索就動手還不如不做。的確,在開始學(xué)習(xí) Python 之前,你需要了解的一些背景,做出一些選擇,并在你的計(jì)算機(jī)上做好準(zhǔn)備工作。
2.1 Python 的各種發(fā)行版
Python 是龜叔的獨(dú)生子,但他有很多堂兄弟,比較有名的也有好幾位。如果你不確定哪個(gè)對你更友好,我建議你選擇嫡傳的 Python——即便你將來需要和他的其他堂兄弟打交道,那也是熟門熟路。不建議初學(xué)者選擇AnacondaPython 和 ActivePython,在我看來他們提供的便利不如給用戶學(xué)習(xí)帶來的麻煩多。
Cpython
CPython 屬于 Python 參考實(shí)現(xiàn)方案,可算是所有其他 Python 衍生發(fā)行版的一套標(biāo)準(zhǔn)化版本。CPython 利用 C 語言編寫而成,而其編寫者包含多位 Python 語言頂級決策層中的核心人員。CPython 在優(yōu)化方面表現(xiàn)得最為保守。當(dāng)然,這并不是缺點(diǎn),而是設(shè)計(jì)取向。Python 的維護(hù)者們希望將 CPython 打造為 Python 最具廣泛兼容性與標(biāo)準(zhǔn)化的實(shí)現(xiàn)方案。CPython 最適合對 Python 標(biāo)準(zhǔn)的兼容性與一致性要求較高的用戶。此外,CPython 同樣適用于希望以最基本方式使用 Python并愿意為此放棄某些便捷性的專業(yè)人士。
Anaconda Python
Anaconda 源自 Anaconda 公司之手(原名為 Continuum Analytics),其設(shè)計(jì)目標(biāo)在于服務(wù)那些需要由商業(yè)供應(yīng)商提供支持且具備企業(yè)支持服務(wù)的 Python 開發(fā)者。Anaconda Python 的主要用例包括數(shù)學(xué)、統(tǒng)計(jì)學(xué)、工程、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)以及其他相關(guān)應(yīng)用。Anaconda 捆綁有 Python 商業(yè)與科學(xué)使用場景當(dāng)中的各類常用庫——包括 SciPy、NumPy 以及 Numba 等等,同時(shí)通過一套定制化軟件包管理系統(tǒng)提供更多庫訪問能力。
ActivePython
與Anaconda類似,ActivePython同樣由營利性企業(yè)創(chuàng)建及維護(hù)——ActiveState公司。該公司還在銷售多種語言運(yùn)行時(shí)以及多語言Komodo IDE。ActivePython主要面向企業(yè)用戶與數(shù)據(jù)科學(xué)家——即希望使用Python語言,但又不愿把大量精力浪費(fèi)在Python的組裝與管理方面。ActivePython使用Python中的常規(guī)pip軟件包管理器,但同時(shí)亦以認(rèn)證壓縮包的形式提供數(shù)百套通用庫,外加英特爾數(shù)學(xué)核心庫等其他一些具有第三方依賴關(guān)系的公共庫。
PyPy
PyPy 屬于CPython解釋器的替代品,其利用即時(shí)(JIT)編譯以加速Python程序的執(zhí)行。根據(jù)實(shí)際執(zhí)行的任務(wù)情況,其性能提升可能非常顯著。人們對于Python——特別是CPython的抱怨之聲,主要圍繞其速度表現(xiàn)展開。在默認(rèn)情況下,Python的運(yùn)行速度遠(yuǎn)不及C語言——差距甚至可能達(dá)到數(shù)百倍。PyPy JIT將Python代碼編譯為機(jī)器語言,從而帶來平均7.7倍于CPython的運(yùn)行速度。在某些特定任務(wù)中,其提速效果能夠達(dá)到50倍。
Jython
JVM(Java虛擬機(jī))能夠作為除Java之外的多種語言的運(yùn)行時(shí)選項(xiàng)。這份長的名單包括Groovy、Scala、Clojure、Kotlin、Python以及——沒錯(cuò),當(dāng)然還有Jython 。Jython最大的弊端在于其僅支持Python的2.x版本。目前對Python 3.x版本的支持能力尚在開發(fā)當(dāng)中,但仍需要相當(dāng)一段時(shí)間。當(dāng)下,還沒有任何相關(guān)版本放出。
IronPython
類似于Jython的JVM上Python實(shí)現(xiàn)方案定位,IronPython屬于一套立足.Net運(yùn)行時(shí)——或者CLR(公共語言運(yùn)行時(shí))——的Python實(shí)現(xiàn)方案。IronPython利用CLR的DLR(動態(tài)語言運(yùn)行時(shí))以允許Python程序以等同于CPython的動態(tài)水平實(shí)現(xiàn)運(yùn)行。與Jython類似,IronPython目前只支持Python 2.x版本。不過IronPython 3.x實(shí)現(xiàn)方案已經(jīng)處于緊鑼密鼓的開發(fā)當(dāng)中。
2.2 安裝 Python
從 Python 官網(wǎng)下載時(shí),請注意選擇正確的版本。如果是用于學(xué)習(xí),下載最新版沒有問題,如果是用于生產(chǎn),則要考慮你開發(fā)需要的第三方模塊是否支持最新版的 Python。安裝時(shí)不要忘記勾選最下面的兩個(gè)復(fù)選框,否則會給后續(xù)的模塊安裝帶來一些麻煩。推薦使用默認(rèn)方式安裝。
2.3 選擇一款趁手的開發(fā)工具
學(xué)習(xí)一種編程語言,首先要找一款合用的集成開發(fā)工具,似乎是自然而然的想法。為什么不呢?IDE可以自動補(bǔ)齊,可以一鍵運(yùn)行,還可以斷點(diǎn)調(diào)試。使用IDE開發(fā)項(xiàng)目,就像駕駛一輛內(nèi)飾豪華的汽車,盡情享受駕駛的樂趣就好了,誰還去關(guān)心引擎蓋里面發(fā)動機(jī)是如何工作的呢?我的年輕同事們也都是IDE的擁躉,最初使用pycharm,后來是時(shí)下大熱的vscode。
可是,我始終認(rèn)為,編程就像是駕駛,程序員就是司機(jī),而且是職業(yè)司機(jī),不是把駕駛當(dāng)成通勤技能的各色白領(lǐng)金領(lǐng)。既然是職業(yè)司機(jī),就不能滿足于打著領(lǐng)結(jié)、戴著白手套駕駛內(nèi)飾豪華、配置高端的汽車,而是必須具備打開引擎蓋子維修和保養(yǎng)的能力。
基于這個(gè)觀點(diǎn),我不建議初學(xué)者一開始就使用集成開發(fā)工具——至少,在開始第一個(gè)星期不要使用IDE。對于python這樣一種解釋型的腳本語言,一款趁手的編輯器就足夠了。linux平臺上,vim或者emacs都足夠好(如果你通曉二者或者其中之一的話,請接受我的敬意);windows平臺上,我推薦使用notepad++。python初學(xué)者使用編輯器而非IDE的好處是:
專注于python本身,而不是被工具使用問題所困擾。君不見,知乎上關(guān)于pycharm和vscode的使用說明、常見問題的解決方案,多得幾乎超過了討論python本身
手工運(yùn)行代碼,可以更直觀、更深刻地了解腳本的解釋執(zhí)行過程
手工調(diào)試代碼,有助于代碼優(yōu)化,提高代碼把控能力
可以更好地使用pip安裝和管理第三方模塊
3. 習(xí)慣使用IDLE,這是學(xué)習(xí)python最好的方式
解釋型語言的優(yōu)勢,就是可以寫一句執(zhí)行一句,想到哪兒寫到哪兒,不必像編譯型語言那樣得把程序全部寫完,編譯成功后才能運(yùn)行。我特別喜歡使用python的IDLE,甚至拿它當(dāng)計(jì)算器用。很多時(shí)候,我用IDLE驗(yàn)證代碼的寫法是否正確,查看模塊是否安裝成功以及版本號。IDLE支持tab鍵自動補(bǔ)齊,我經(jīng)常用這個(gè)功能查看某個(gè)對象的方法和屬性。
>>> import numpy as np
>>> np.__version__
'1.17.0'
>>> np.hypot(3,4)
5.0
>>> def factorial(n): # 計(jì)算n的階乘
if n == 0: # 遞歸出口
return 1
return n*factorial(n-1) # 向遞歸出口方向靠近的自身調(diào)用
>>> factorial(5)
120
>>> _*2-100
140
小技巧
tab鍵自動補(bǔ)齊
光標(biāo)移動到執(zhí)行過的語句上敲擊回車,可以重復(fù)這個(gè)命令
下劃線(_)可以獲取最后一次執(zhí)行結(jié)果
實(shí)際上,IDLE就是一個(gè)IDE,你可以用它來創(chuàng)建或打開.py腳本文件,可以編輯、運(yùn)行和調(diào)試。
4. 嚴(yán)格遵從編碼規(guī)范
Linux 平臺上,一個(gè) python 源碼文件應(yīng)該以下部分組成。Windows 平臺上,可以省略第一項(xiàng)。
解釋器聲明
編碼格式聲明
模塊注釋或文檔字符串
模塊導(dǎo)入
常量和全局變量聲明
頂級定義(函數(shù)或類定義)
執(zhí)行代碼
附上一個(gè) demo,僅供參考。更詳細(xì)的編碼規(guī)范,請參考拙作《我的 Python 編碼規(guī)范》。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""通常這里是關(guān)于本文檔的說明(docstring),須以半角的句號、 問號或驚嘆號結(jié)尾!
本行之前應(yīng)當(dāng)空一行,繼續(xù)完成關(guān)于本文檔的說明
如果文檔說明可以在一行內(nèi)結(jié)束,結(jié)尾的三個(gè)雙引號不需要換行;否則,就要像下面這樣
"""
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"運(yùn)行日志.txt"
class GameRoom(object):
? ? """對局室"""
? ??
? ? def __init__(self, name, limit=100, **kwds):
? ? ? ? """構(gòu)造函數(shù)!
? ? ? ??
? ? ? ? name? ? ? ? 對局室名字
? ? ? ? limit? ? ? ?人數(shù)上限
? ? ? ? kwds? ? ? ? 參數(shù)字典
? ? ? ? """
? ? ? ??
? ? ? ? pass
def craete_and_start():
? ? """創(chuàng)建并啟動對局室"""
? ??
? ? pass
if __name__ == '__main__':
? ? # 開啟游戲服務(wù)
? ? start()
5. 代碼的運(yùn)行、調(diào)試
如果你使用的集成開發(fā)工具,那么代碼的運(yùn)行和調(diào)試,就完全依賴于工具了。如果你使用編輯器開寫代碼,那就需要手工運(yùn)行和調(diào)試代碼。運(yùn)行代碼分成兩步:
第1步,打開一個(gè)命令行窗口,路徑切換到腳本所在的文件夾。我習(xí)慣在腳本所在窗口的空白位置(確保沒有選中任何對象),按下shift鍵點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇打開Powershell窗口。如下圖所示。
第2步,輸入python+空格+腳本文件名,回車即可運(yùn)行。輸入腳本文件名時(shí),按tab可以自動補(bǔ)齊。腳本的運(yùn)行信息、錯(cuò)誤信息、運(yùn)行結(jié)果等,都可以顯示在這個(gè)窗口中。這是最原始的信息。你在其他開發(fā)工具中看到信息,都是對這些信息的再加工。
手工調(diào)試代碼的手段不多,除了 print 信息,幾乎只有把調(diào)試信息寫成調(diào)試文件了。聽起來,好像問題很嚴(yán)重,其實(shí)只是理念和取向不同而已。反過來想,手段單一,不恰好意味著簡單、簡明嗎?十幾年來,我一直使用 print 調(diào)試,堅(jiān)信沒有比它更好的了。
5. 模塊管理
在python語言的發(fā)展過程中,安裝和管理第三方模塊的方法也歷經(jīng)變化?,F(xiàn)在,我們終于等來了pip這個(gè)近乎完美的工具。pip除了安裝(install)和刪除(uninstall)這兩大功能,還可以指定模塊的安裝版本(無需預(yù)先刪除當(dāng)前已安裝版本),可以顯示所有已安裝的模塊,還可以通過 upgrade 自主升級。
很多同學(xué)在使用pip時(shí)會遇到各種各樣稀奇古怪的問題,我在這里解釋一下:
5.1 同時(shí)安裝了py2/py3
同時(shí)安裝了py2/py3,將會存在多個(gè)版本的pip.exe,你如果直接運(yùn)行:
pip install <模塊名>
則有可能因?yàn)閜ip.exe版本不對而出錯(cuò)。正確的做法是指定python版本,-m是python解釋器的參數(shù),意思是把pip模塊做為腳本運(yùn)行,完整命令如下:
py -3 -m pip install <模塊名>
5.2 使用Anaconda,或者通過IDE來安裝模塊
如果你使用的是Anaconda Python,或者你是通過IDE來安裝模塊,則需要檢查它們的配置和設(shè)置,情況各有不同,沒有統(tǒng)一的解決方案。
5.3 僅安裝了py2 或 py3
如果你的計(jì)算機(jī)只安裝了py2 或者 py3,那么上面兩種安裝方法應(yīng)該都沒有問題。如果你的電腦找不到pip.exe文件,則可以使用這個(gè)命令生成:
python -m ensurepip
5.4 pip應(yīng)用演示
下面,就以同時(shí)安裝了py2/py3的計(jì)算機(jī)為例(如果只安裝了py2或py3,需要將下面演示中的py -3替換成python),演示pip模塊的用法。不管任何情況,我都建議使用-m參數(shù)調(diào)用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
1
5.5 模塊倉庫
如果你需要下載python模塊,這里是我見過的最全、最穩(wěn)定的python模塊倉庫,由加州大學(xué)歐文分校熒光動力學(xué)實(shí)驗(yàn)室創(chuàng)建并維護(hù)。
5.4 發(fā)布自己的模塊安裝包
如果你的很多個(gè)項(xiàng)目中,都會用到你自己的某些模塊,那么,把這些模塊做成安裝包,安裝到你的開發(fā)環(huán)境里,可能是最佳選擇。拙作《學(xué)習(xí)筆記:發(fā)布自己的python模塊安裝包》對此有詳細(xì)說明。