#Python初學者該了解的知識
1. 前言
#歡迎來到「Python進階」欄位!來到這裡的每一位同學,應該大致上學到了很多 Python 的基礎知識,正在努力成長的過程中。在這段期間,一定遇到了許多的困惑,對未來的學習方向感到迷惘。我非常理解你們所面臨的處境。我從2007年開始接觸 python 這門程式語言,從2009年開始單一使用 python 應對所有的開發工作,直至今天。回顧自己的學習過程,也曾經遇到無數的困難,也曾經迷惘過、困惑過。開辦這篇專欄,正是為了幫助像我當年一樣困惑的 Python 初學者走出困境、快速成長。希望我的經驗能真正幫助你們。
當下是一個喧囂、浮躁的時代。我們總是被生活中大量湧現的熱點所吸引,幾乎沒有深度閱讀和思考的時間和機會。我始終認為,學習是需要沉下心來慢慢鑽研的,而且是長期的;同時,學習不應該被賦予太多的功利色彩。一個Python 程式設計師的成長路線圖應該是這樣子的:基礎文法–>語感訓練–>課題練習–>分方向繼續學習–>中級程式設計師–>拓展深度與廣度–>高級程式設計師.
然而,很多新手的學習路線圖卻是這樣子的:學完基礎語法之後,不了解http 協議和Ajax 異步請求,就興沖沖研究爬蟲去了;或者,學完基礎語法,就去搞視覺識別,連OpenCV 的資料結構都看不懂;甚至,學完基礎語法就直接研究神經網絡,結果是重演了一遍從入門到放棄。
我給初學者的建議就是,不急於求成,不好高騖遠,一步一步,穩紮穩打,功到自然成。不急於求成,可以避免走彎路,不但不會延緩你成長的速度,反倒會節省你的時間。不好高騖遠,達成一個目標,再訂定下一個目標,在連續的成功和進步中,建立起自信心,激發出更強的學習興趣。
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。安裝時不要忘記勾選最下面的兩個複選框,否則會給後續的模組安裝帶來一些麻煩。建議使用預設方式安裝。
學習程式語言,首先要找一款合用的整合開發工具,似乎是自然而然的想法。為什麼不呢? IDE可以自動補齊,可以一鍵運行,還可以斷點調試。使用IDE開發項目,就像駕駛一輛內飾豪華的汽車,盡情享受駕駛的樂趣就好了,誰還去關心引擎蓋裡面發動機是如何工作的呢?我的年輕同事們也都是IDE的擁躉,最初使用pycharm,後來是時下大熱的vscode。
可是,我始終認為,程式設計就像是駕駛,程式設計師就是司機,而且是職業司機,不是把駕駛當成通勤技能的各色白領金領。既然是職業司機,就不能滿足於打著領結、戴著白手套駕駛內裝豪華、配置高端的汽車,而是必須具備打開引擎蓋子維修和保養的能力。
基於這個觀點,我不建議初學者一開始就使用整合開發工具-至少,在開始第一週不要使用IDE。對於python這樣一種解釋型的腳本語言,一款趁手的編輯器就足夠了。 linux平台上,vim或emacs都夠好(如果你通曉二者或其中一個的話,請接受我的敬意);windows平台上,我推薦使用notepad 。 python初學者使用編輯器而非IDE的好處是:
解释型语言的优势,就是可以写一句执行一句,想到哪儿写到哪儿,不必像编译型语言那样得把程序全部写完,编译成功后才能运行。我特别喜欢使用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-100140
小技巧
- tab键自动补齐
- 光标移动到执行过的语句上敲击回车,可以重复这个命令
- 下划线(_)可以获取最后一次执行结果
实际上,IDLE就是一个IDE,你可以用它来创建或打开.py脚本文件,可以编辑、运行和调试。
Linux 平台上,一个 python 源码文件应该以下部分组成。Windows 平台上,可以省略第一项。
解释器声明
编码格式声明
模块注释或文档字符串
模块导入
常量和全局变量声明
顶级定义(函数或类定义)
执行代码
附上一个 demo,仅供参考。更详细的编码规范,请参考拙作《我的 Python 编码规范》。
#!/usr/bin/env python# -*- coding: utf-8 -*-"""通常这里是关于本文档的说明(docstring),须以半角的句号、 问号或惊叹号结尾! 本行之前应当空一行,继续完成关于本文档的说明 如果文档说明可以在一行内结束,结尾的三个双引号不需要换行;否则,就要像下面这样 """import os, timeimport datetimeimport mathimport numpy as npimport xlrd, xlwt, xlutilsimport youth_mongodbimport youth_curl BASE_PATH = r"d:\YouthGit"LOG_FILE = u"运行日志.txt"class GameRoom(object): """对局室""" def __init__(self, name, limit=100, **kwds): """构造函数! name 对局室名字 limit 人数上限 kwds 参数字典 """ passdef craete_and_start(): """创建并启动对局室""" passif __name__ == '__main__': # 开启游戏服务 start()
如果你使用的集成开发工具,那么代码的运行和调试,就完全依赖于工具了。如果你使用编辑器开写代码,那就需要手工运行和调试代码。运行代码分成两步:
第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,将会存在多个版本的pip.exe,你如果直接运行:
pip install <模块名>
则有可能因为pip.exe版本不对而出错。正确的做法是指定python版本,-m是python解释器的参数,意思是把pip模块做为脚本运行,完整命令如下:
py -3 -m pip install <模块名>
如果你使用的是Anaconda Python,或者你是通过IDE来安装模块,则需要检查它们的配置和设置,情况各有不同,没有统一的解决方案。
如果你的计算机只安装了py2 或者 py3,那么上面两种安装方法应该都没有问题。如果你的电脑找不到pip.exe文件,则可以使用这个命令生成:
python -m ensurepip
下面,就以同时安装了py2/py3的计算机为例(如果只安装了py2或py3,需要将下面演示中的py -3替换成python),演示pip模块的用法。不管任何情况,我都建议使用-m参数调用pip模块,而不是直接使用 pip.exe 安装模块。
# 虽然可以这样使用pip安装模块(以numpy为例)PS D:\XufiveGit\wxgl> pip install numpy# 但我建议这样使用pipPS 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
感谢大家的阅读,希望大家收益多多。
推荐教程:《python教程》
以上是Python是初學者該了解的知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!