明確學習目標,不急於求成 當下是一個喧囂、浮躁的時代。我們總是被生活中大量涌現的熱點所吸引,幾乎沒有深度閱讀和思考的時間和機會。我始終認為,學習是需要沉下心來慢慢鑽研的,是長 期的;同時,學習不應該被賦予太多的功利色彩。一個Python 程式員的成長路線圖應該是這樣子的:基礎語法–>語感訓練–>課題 ...
明確學習目標,不急於求成
當下是一個喧囂、浮躁的時代。我們總是被生活中大量涌現的熱點所吸引,幾乎沒有深度閱讀和思考的時間和機會。我始終認為,學習是需要沉下心來慢慢鑽研的,是長
期的;同時,學習不應該被賦予太多的功利色彩。一個Python 程式員的成長路線圖應該是這樣子的:基礎語法–>語感訓練–>課題練習–>分方向繼續學習–>中級程式員–>
拓展深度和廣度–>高級程式員。
然而,很多新手的學習路線圖卻是這樣子的:學完基礎語法之後,不瞭解 http 協議和 Ajax 非同步請求,就興衝衝研究爬蟲去了;或者,學完基礎語法,就去搞視覺識別
連 OpenCV 的數據結構都看不懂;甚至,學完基礎語法就直接研究神經網路,結果是重演了一遍從入門到放棄。
我體會和建議就是,不急於求成,不好高騖遠,一步一步,穩扎穩打,功到自然成。不急於求成,可以避免走彎路,非但不會延緩你成長的速度,反倒會節省你的時間。
不好高騖遠,達成一個目標,再制定下一個目標,在連續的成功和進步中,建立起自信心,激發出更強的學習興趣。
在開始學習 Python 之前,你需要做一些準備
Now is better than never, Although never is often better than *right* now. 翻譯過來的意思是,做也許好過不做,但不假思索就動手還不如不做。的確,在開始學習 Python 之前,你需要瞭解的一些背景,做出一些選擇,併在你的電腦上做好準備工作。
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實現方案已經處於緊鑼密鼓的開發當中。
安裝Python
從 Python 官網下載時,請註意選擇正確的版本。如果是用於學習,下載最新版沒有問題,如果是用於生產,則要考慮你開發需要的第三方模塊是否支持最新版的 Python。
安裝時不要忘記勾選最下麵的兩個覆選框,否則會給後續的模塊安裝帶來一些麻煩。推薦使用預設方式安裝
選擇一款趁手的開發工具
學習一種編程語言,首先要找一款合用的集成開發工具,似乎是自然而然的想法。為什麼不呢?IDE可以自動補齊,可以一鍵運行,還可以斷點調試。使用IDE開發項目
就像駕駛一輛內飾豪華的汽車,盡情享受駕駛的樂趣就好了,誰還去關心引擎蓋裡面發動機是如何工作的呢?我的年輕同事們也都是IDE的擁躉,最初使用pycharm後來
是時下大熱的vscode。可是,我始終認為,編程就像是駕駛,程式員就是司機,而且是職業司機,不是把駕駛當成通勤技能的各色白領金領。既然是職業司機,就不能
滿足於打著領結、戴著白手套駕駛內飾豪華、配置高端的汽車,而是必須具備打開引擎蓋子維修和保養的能力。
基於這個觀點,我不建議初學者一開始就使用集成開發工具——至少,在開始第一個星期不要使用IDE。對於python這樣一種解釋型的腳本語言,一款趁手的編輯器就足
夠了。linux平臺上,vim或者emacs都足夠好(如果你通曉二者或者其中之一的話,請接受我的敬意);windows平臺上,我推薦使用notepad++。python初學者使用編
輯器而非IDE的好處是:
1、專註於python本身,而不是被工具使用問題所困擾。君不見,知乎上關於pycharm和vscode的使用說明、常見問題的解決方案,多得幾乎超過了討論python本身
2、手工運行代碼,可以更直觀、更深刻地瞭解腳本的解釋執行過程
3、手工調試代碼,有助於代碼優化,提高代碼把控能力
4、可以更好地使用pip安裝和管理第三方模塊
習慣使用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
小技巧
- tab鍵自動補齊
- 游標移動到執行過的語句上敲擊回車,可以重覆這個命令
- 下劃線(_)可以獲取最後一次執行結果
實際上,IDLE就是一個IDE,你可以用它來創建或打開.py腳本文件,可以編輯、運行和調試。
嚴格遵從編碼規範
Linux 平臺上,一個 python 源碼文件應該以下部分組成。Windows 平臺上,可以省略第一項。
- 解釋器聲明
- 編碼格式聲明
- 模塊註釋或文檔字元串
- 模塊導入
- 常量和全局變數聲明
- 頂級定義(函數或類定義)
- 執行代碼
好在龜叔說過,A Foolish Consistency is the Hobgoblin of Little Minds(盡信書,不如無書),只要保持一致性、可讀性,就是一個好的規範。基於PEP8規範的原則
結合開發團隊在工作中的養成的習慣,我整理了一份實用的編碼規範,推薦給初學者。
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()
編碼格式聲明
通常,編碼格式聲明是必需的。如果 python 源碼文件沒有聲明編碼格式,python 解釋器會預設使用 ASCII 編碼,一旦源碼文件包含非ASCII編碼的字元,python 解釋器
就會報錯。以 UTF-8 為例,以下兩種編碼格式聲明都是合乎規則的。
# -*- coding: utf-8 -*- # coding = utf-8
我一直 UTF-8 編碼格式,喜歡使用第一種聲明方式。
Windows 平臺上,編碼格式聲明必須位於 python 文件的第一行。Linux 平臺上,編碼格式聲明通常位於 python 文件的第二行,第一行是 python 解釋器的路徑聲明。
#!/usr/bin/env python # -*- coding: utf-8 -*-
縮進
統一使用 4 個空格進行縮進。絕對不要用tab, 也不要tab和空格混用。對於行連接的情況,我一般使用4空格的懸掛式縮進。例如:
var_dict = { 'name': 'xufive', 'mail': '[email protected]' }
引號
引號使用的一般性原則:
- 自然語言使用雙引號
- 機器標識使用單引號
- 正則表達式使用雙引號
- 文檔字元串 (docstring) 使用三個雙引號
註釋
#號後空一格,段落件用空行分開(同樣需要#號):
# 塊註釋 # 塊註釋 # # 塊註釋 # 塊註釋
行內註釋,至少使用兩個空格和語句分開:
age += 1 # 年齡增加一歲
比較重要的註釋段, 使用多個等號隔開, 可以更加醒目, 突出重要性:
server= gogame(room, options) # ===================================== # 請勿在此處傾倒垃圾!!! # ===================================== if __name__ == '__main__': server.run()
空行
空行使用的一般性原則:
- 編碼格式聲明、模塊導入、常量和全局變數聲明、頂級定義和執行代碼之間空兩行
- 頂級定義之間空兩行,方法定義之間空一行
- 在函數或方法內部,可以在必要的地方空一行以增強節奏感,但應避免連續空行
空格
空格使用的一般性原則:
- 在二元運算符兩邊各空一格,算術操作符兩邊的空格可靈活使用,但兩側務必要保持一致
- 不要在逗號、分號、冒號前面加空格,但應該在它們後面加(除非在行尾)
- 函數的參數列表中,逗號之後要有空格
- 函數的參數列表中,預設值等號兩邊不要添加空格
- 左括弧之後,右括弧之前不要加添加空格
- 參數列表, 索引或切片的左括弧前不應加空格
文檔字元串
文檔字元串是包、模塊、類或函數里的第一個語句。這些字元串可以通過對象的__doc__成員被自動提取,並且被pydoc所用。文檔字元串的使用三重雙引號(""")。
如果文檔字元串內容不能在一行內寫完,首行須以句號、 問號或驚嘆號結尾,接一空行,結束的三重雙引號必須獨占一行。
導入模塊
導入總應該放在文件頂部,位於模塊註釋和文檔字元串之後,模塊全局變數和常量之前。導入應該按照從最通用到最不通用的順序分組,分組之間空一行:
- 標準庫導入
- 第三方庫導入
- 應用程式指定導入
應當避免使用以下的導入方法:
from math import *
命名規範
命名建議遵循的一般性原則:
- 模塊儘量使用小寫命名,首字母保持小寫,儘量不要用下劃線
- 類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭
- 函數名一律小寫,如有多個單詞,用下劃線隔開
- 私有函數可用一個下劃線開頭
- 變數名儘量小寫, 如有多個單詞,用下劃線隔開
- 常量採用全大寫,如有多個單詞,使用下劃線隔開
代碼的運行、調試
如果你使用的集成開發工具,那麼代碼的運行和調試,就完全依賴於工具了。如果你使用編輯器開寫代碼,那就需要手工運行和調試代碼。運行代碼分成兩步:
第1步:打開一個命令行視窗,路徑切換到腳本所在的文件夾。我習慣在腳本所在視窗的空白位置(確保沒有選中任何對象),按下shift鍵點擊滑鼠右鍵,在彈
出的菜單中選擇打開Powershell視窗。如下圖所示。
第2步:輸入python+空格+腳本文件名,回車即可運行。輸入腳本文件名時,按tab可以自動補齊。腳本的運行信息、錯誤信息、運行結果等,都可以顯示在這個視窗中
這是最原始的信息。你在其他開發工具中看到信息,都是對這些信息的再加工。
當然,很多編輯器也支持自定義運行命令,可以實現一鍵運行python腳本。以Notdpan++為例,點擊“運行”->“運行”菜單,在彈出的視窗中輸入:
cmd /k cd /d “$(CURRENT_DIRECTORY)” & python “$(FULL_CURRENT_PATH)” & echo. & pause & exit
因為轉義緣故,複製該命令的話,請檢查$符號前面是否有\符號,如有,請刪除。接下來,點擊“保存”按鈕,在彈出的視窗中輸入新增命令的名稱,比如PyRun,定義快捷
鍵,最後點擊“確定”按鈕。
完成以上設置後,就可以在Notepad++中使用菜單命令或者快捷鍵運行Python代碼了。手工調試代碼的手段不多,除了 print 信息,幾乎只有把調試信息寫成調試文件了
聽起來,好像問題很嚴重,其實只是理念和取向不同而已。反過來想,手段單一不恰好意味著簡單、簡明嗎?我一直使用 print 調試,堅信沒有比它更好的了
模塊管理
在python語言的發展過程中,安裝和管理第三方模塊的方法也歷經變化。現在,我們終於等來了pip這個近乎完美的工具。pip除了安裝(install)和刪除(uninstall)這
兩大功能,還可以指定模塊的安裝版本(無需預先刪除當前已安裝版本),可以顯示所有已安裝的模塊,還可以通過 upgrade 自主升級。很多學者在使用pip時會遇到
各種各樣稀奇古怪的問題,我在這裡解釋一下:
同時安裝了py2/py3
同時安裝了py2/py3,將會存在多個版本的pip.exe,你如果直接運行:
pip install <模塊名>
則有可能因為pip.exe版本不對而出錯。正確的做法是指定python版本,-m是python解釋器的參數,意思是把pip模塊做為腳本運行,完整命令如下:
py -3 -m pip install <模塊名>
使用Anaconda,或者通過IDE來安裝模塊
如果你使用的是Anaconda Python,或者你是通過IDE來安裝模塊,則需要檢查它們的配置和設置,情況各有不同,沒有統一的解決方案。
僅安裝了py2 或 py3
如果你的電腦只安裝了py2 或者 py3,那麼上面兩種安裝方法應該都沒有問題。如果你的電腦找不到pip.exe文件,則可以使用這個命令生成:
python -m ensurepip
pip應用演示
下麵,就以同時安裝了py2/py3的電腦為例(如果只安裝了py2或py3,需要將下麵演示中的py -3替換成python),演示pip模塊的用法。不管任何情況,我都建議使用
-m參數調用pip模塊,而不是直接使用 pip.exe 安裝模塊。
# 雖然可以這樣使用pip安裝模塊(以numpy為例) D:\XufiveGit\wxgl> pip install numpy # 但我建議這樣使用pip D:\XufiveGit\wxgl> py -3 -m pip install numpy # 刪除模塊 D:\XufiveGit\wxgl> py -3 -m pip uninstall numpy # 安裝模塊,指定版本
D:\XufiveGit\wxgl> py -3 -m pip install numpy=1.15.0 # 自主升級 D:\XufiveGit\wxgl> py -3 -m pip install --upgrade pip # 顯示已安裝的模塊 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文件:
D:\PyPackage\py3> py -3 -m pip install .\basemap-1.2.0-cp37-cp37m-win_amd64.whl
模塊倉庫
如果你需要下載python模塊,這裡是我見過的最全、最穩定的python模塊倉庫,由加州大學歐文分校熒光動力學實驗室創建並維護。
Python模塊倉庫:https://www.lfd.uci.edu/~gohlke/pythonlibs/
模塊安裝包
如果你的很多個項目中,都會用到你自己的某些模塊,那麼,把這些模塊做成安裝包,安裝到你的開發環境里,可能是最佳選擇。
發佈自己的python模塊安裝包,首先得把自己的模塊做成 .whl 格式的文件,然後再找個地兒存放它,接下來就是在 pip 命令中使用 -i 參數指定這個地兒(下載源)。
Just so sooooooooo
準備工作
註冊 pypi.org 用戶
我原本就是 pypi 的註冊用戶,但當我上傳 .whl 格式的文件時,卻被提示無許可權。仔細閱讀相關文檔才發現,還需要在https://test.pypi.org/account/register/ 註冊。
我不確定是不是僅在這裡註冊就可用了。
使用 pip 安裝或升級幾個必備工具
生成和上傳 .whl 格式的文件需要幾個特殊工具,好在這幾個工具使用 pip 就可以輕鬆搞定。
py -3 -m pip install --user --upgrade setuptools wheel
py -3 -m pip install --user --upgrade twine
規劃文件目錄
假定要發佈的模塊名稱為 wxgl,包含 scene.py, region.py, colorbar.py 等三個文件。文件目錄結構如下:
/wxgl_pkg wxgl __init__.py colorbar.py region.py scene.py README.md setup.py
init.py
該文件其內容可以為空。我的 init.py文件如下:
-*- coding: utf-8 -*- name = 'wxgl' version = "0.3.0" version_info = (0, 3, 0, 0)
README.md
關於安裝和使用的說明,文本文件,不能使用中文。
setup.py
# -*- coding: utf-8 -*- import setuptools with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="wxgl", version="0.3.0", author="xufive", author_email="[email protected]", description="A 3d library based pyOpenGL.", long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/xufie/wxgl", packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
提醒一點:License 很重要,pipy 檢查很嚴格,不可亂寫。最初是我使用 GPL,檢查失敗,後改用 MIT 才通過。
生成安裝包文件
運行 setup.py 腳本,生成安裝包文件
py -3 setup.py sdist bdist_wheel
順利的話,你可以看到 dist 文件夾:
/wxgl_pkg dist wxgl-0.3.0-py3-none-any.whl wxgl-0.0.1.tar.gz wxgl __init__.py colorbar.py region.py scene.py README.md setup.py
如果只需要 .whl 文件,就運行:
py -3 setup.py bdist_wheel
上傳安裝包文件
切換到 dist 路徑下,運行:
py -3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
根據提示輸入用戶名、密碼,稍等片刻,即可完成。
安裝
使用 -i 參數,指定安裝源為https://test.pypi.org/simple/,其他參數不變:
py -3 -m pip install -i https://test.pypi.org/simple/ wxgl