Python學習之旅
前言
偶然看到廖雪峰老師寫的《Python教程》被其通俗易懂的語言深深吸引,於是就如饑似渴般沈侵其中。從python簡介開始一直到最後完成實戰項目差不多半個多月時間,收貨頗豐,疑惑也不少,於是希望通過記錄的方式梳理一下自己的思路,也算是對自己半個多月學習的總結。以下主要記錄自己學習結構,不做詳細說明,需要看詳細教程可移步(http://www.liaoxuefeng.com)查看原文。
簡介
Python是著名的“龜叔”Guido van Rossum在1989年聖誕節期間,為了打發無聊的聖誕節而編寫的一個編程語言。許多大型網站就是用Python開發的,例如YouTube、Instagram,還有國內的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國航空航天局)都大量地使用Python。龜叔給Python的定位是“優雅”、“明確”、“簡單”,所以Python程序看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常復雜的程序。
Python的缺點:
- 運行速度慢。和C程序相比非常慢,因為Python是解釋型語言,你的代碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程非常耗時,所以很慢。而C程序是運行前直接編譯成CPU能執行的機器碼,所以非常快。但是大量的應用程序不需要這麽快的運行速度,因為用戶根本感覺不出來。例如開發一個下載MP3的網絡應用程序,C程序的運行時間需要0.001秒,而Python程序的運行時間需要0.1秒,慢了100倍,但由於網絡更慢,需要等待1秒,你想,用戶能感覺到1.001秒和1.1秒的區別嗎?這就好比F1賽車和普通的出租車在北京三環路上行駛的道理一樣,雖然F1賽車理論時速高達400公裏,但由於三環路堵車的時速只有20公裏,因此,作為乘客,你感覺的時速永遠是20公裏。
- 代碼不能加密。如果要發布你的Python程序,實際上就是發布源代碼。 這個缺點僅限於你要編寫的軟件需要賣給別人掙錢的時候。好消息是目前的互聯網時代,靠賣軟件授權的商業模式越來越少了,靠網站和移動應用賣服務的模式越來越多了,後一種模式不需要把源碼給別人。再說了,現在如火如荼的開源運動和互聯網自由開放的精神是一致的,互聯網上有無數非常優秀的像Linux一樣的開源代碼,我們千萬不要高估自己寫的代碼真的有非常大的“商業價值”。那些大公司的代碼不願開放的更重要的原因是代碼寫得太爛,一旦開源,就沒人敢用他們的產品了。
安裝
因為Python是跨平臺的,它可以運行在Windows、Mac和各種Linux/Unix系統上。在Windows上寫Python程序,放到Linux上也是能夠運行的。要開始學習Python編程,首先就得把Python安裝到你的電腦裏。安裝後,你會得到Python解釋器(就是負責運行Python程序的),一個命令行交互環境,還有一個簡單的集成開發環境。目前,Python有兩個版本,一個是2.x版,一個是3.x版,這兩個版本是不兼容的。由於3.x版越來越普及,教程將以最新的Python 3.5版本為基礎。
在Mac上安裝Python
如果你正在使用Mac,系統是OS X 10.8~10.10,那麽系統自帶的Python版本是2.7。要安裝最新的Python 3.5,有兩個方法:
方法一:從Python官網下載Python 3.5的安裝程序(網速慢的移步國內鏡像),雙擊運行並安裝。
方法二:如果安裝了Homebrew,直接通過命令brew install python3安裝即可。
在Windows上安裝Python
首先,根據你的Windows版本(64位還是32位)從官網下載Python3.5對應的64位安裝程序或32位安裝程序(網速慢的移步國內鏡像),然後運行下載的EXE安裝包。
Python語法
語言的學習總離不開語法,無論是英語,法語,德語,西班牙語等的學習都有一套自己的使用約定。我把Python的使用約定也總結出自己的一套語法,即Python語法核心五要素:
- 基本類型:內置常用的基本類型,如int, float, str, list, tuple, dict等
- 邏輯運算:如條件判斷,循環等
- 函數/方法:定義,參數
- 面向對象(OOP):一種程序設計思想,核心是繼承,封裝,多態
- 模塊:內建模塊和第三方模塊
五要素關系:語法中的基本數據類型通過一定的邏輯處理構成函數/方法,對函數/方法、基本數據類型套用面向對象的程序設計思想就能構成豐富的模塊。
基本類型
整數
Python可以處理任意大小的整數,包括負整數,在程序中的表示方法和數學上的寫法一樣,例如:1,100,-8080,0,等等。
浮點數
浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如1.23x109和12.3x108是完全相等的。浮點數可以用數學寫法,如1.23,3.14,-9.01,等等。但是對於很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。
字符串
字符串是以單引號或者雙引號括起來的任意文本,比如‘abc’。如果字符串內部包含’又包含“時可以使用轉義字符\來標識,如:‘I \’m \”OK\”!’
布爾值
一個布爾值只有True、False兩種值,在Python中可以直接用True、False表示布爾值(請註意大小寫)。
空值
空值是Python裏一個特殊的值,用None表示。None不能理解為0
,因為0
是有意義的,而None是一個特殊的空值。
List和Tuple
List
Tuple
切片
叠代
叠代器
生成式
生成器
Dict和Set
Dict
Set
邏輯運算
條件判斷
循環/叠代
函數/方法
在Python中,類中定義的函數(方法)第一個參數永遠是實例變量self(不能忘記寫上),並且調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什麽區別,所以你仍然可以使用默認參數、可變參數、關鍵字參數和命名關鍵字參數。
函數定義
函數返回
函數參數
參數檢查
參數類型
定義函數的時候,我們把參數的名字和位置確定下來,函數的接口定義就完成了。對於函數的調用者來說,只需要知道如何傳遞正確的參數,以及函數將返回什麽樣的值就夠了,函數內部的復雜邏輯被封裝起來,調用者無需了解。Python的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理復雜的參數,還可以簡化調用者的代碼。
位置參數
默認參數
可變參數
關鍵字參數
命名關鍵字參數
參數組合
參數小結
- 默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!
- 要註意定義可變參數和關鍵字參數的語法:
*args
是可變參數,args接收的是一個tuple;**kw
是關鍵字參數,kw接收的是一個dict。
- 以及調用函數時如何傳入可變參數和關鍵字參數的語法:
- 可變參數既可以直接傳入:
func(1, 2, 3)
,又可以先組裝list或tuple,再通過*args
傳入:func(*(1, 2, 3))
; - 關鍵字參數既可以直接傳入:
func(a=1, b=2)
,又可以先組裝dict,再通過**kw
傳入:func(**{‘a‘: 1, ‘b‘: 2})
。
- 可變參數既可以直接傳入:
- 使用
*args
和**kw
是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。 - 命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供默認值。
- 定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符
*
,否則定義的將是位置參數。
常用函數
類型轉換
遞歸函數
匿名函數
高階函數
變量可以指向函數
結論:函數本身也可以賦值給變量,即:變量可以指向函數。
函數名也是變量
傳入函數
偏函數
裝飾器
Filter函數
Sorted函數
返回函數
面向對象
說到面向對象,就不得不提面向過程。從字面上理解,面向對象針對的是一個事物(比如桌子,椅子,動物等)的研究偏靜態,而面向過程則是針對流程或者動作的研究,偏動態。無論是面向過程還是面向對象核心是一種設計思想,指導我們如何進行程序設計。
計算機世界只是我們現實世界的映射,如何實現這種映射就是我們廣大程序猿的工作。舉個簡單例子,“小明騎車去上學”,這是現實世界中小明的一項日常活動,如何把這一日常活動映射到計算機呢?很簡單——編程(寫代碼)。
用面向過程的思想實現上述場景:
# 面向過程設計:小明騎車去上學 def Go2School(name, vehicle): print(‘%s%s去上學!‘% (name, vehicle)) if __name__ == ‘__main__‘: Go2School(‘小明‘,‘騎車‘)
用面向對象思想實現上述場景:
# 面向對象設計:小明騎車去上學 class Student(object): """定義一個學生類""" def __init__(self, name): super(Student, self).__init__() self.__name = name def ByVehicle(self,vehicle): return (self.__name + vehicle) def Todo(self,thing): # 參數self必須寫,不寫會報錯 return thing xiaoMing=Student(‘小明‘) print(‘%s%s!‘ % (xiaoMing.ByVehicle(‘騎車‘),xiaoMing.Todo(‘上學‘)))
現在,該死的產品狗告訴我要實現“小明騎車回家”或者“小明坐車去上學”,那麽按照面向過程設計思想,就得再寫一個GoHome(name, vehicle)函數;而按照面向對象設計思想,不用做任何更改,直接把傳入的參數“騎車”換成“坐車”,把“上學”換成“回家”即可。如果下次產品狗告訴你要實現“小花坐火箭去月球”,你使用面向對象設計的程序根本不用做任何修改,直接使用就行。很明顯,面向對象設計提供了更強大的擴展,是一種非常好的設計指導思路。
類和實例
三大特性
繼承
封裝
多態
模塊
使用模塊
安裝模塊
常用模塊
內建模塊
常用內建模塊包括:datetime, collections, base64, struct, hashlib, itertools, contextlib, XML, HTMLParser, Urllib等。在此不做詳述。
第三方模塊
常用第三方模塊有:PIL, Tkinter等。在此不做詳述。
Python用法
IO編程
進程和線程
多進程
多線程
進程VS線程
分布式進程
協程
同步IO
文件讀寫
操作文件和目錄
序列化
異步IO
asyncio
async/wait
aiohttp
網絡編程
TCP編程
UDP編程
電子郵件
SMTP發送郵件
POP3收取郵件
訪問數據庫
使用SQLite
使用MySQL
使用SQLAlchemy
Web開發
WSGI接口
使用Web框架
使用模板
Python學習之旅