Python基礎(chǔ)
數(shù)據(jù)類型
空值
None
除法


編碼
Unicode編碼把所有的語言統(tǒng)一到一套編碼里

但是因為Unicode編碼長度較長,所以轉(zhuǎn)化成了”可變長編碼“--UTF-8
所以當(dāng)前計算機的編碼格式是這樣子的


格式化

list和tuple
list

tuple
tuple是初始化了就不變的

但是,tuple內(nèi)部的有些特殊元素是可以變的

dict和set
dict

set
set中沒有重復(fù)的key

函數(shù)
函數(shù)的參數(shù)
可變參數(shù)
可變參數(shù),此時函數(shù)內(nèi)部接收到的是一個tuple

但如果要傳入的參數(shù)是個list或tuple而非單獨的元素,那么就不太好操作
所以,python允許在list或tuple之前加一個*

關(guān)鍵參數(shù)
可變參數(shù)允許傳入0個或任意個參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時自動組裝為一個tuple。而關(guān)鍵字參數(shù)允許傳入0個或任意個含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict。

高級特性
迭代
python中可迭代對象都可以用for循環(huán)遍歷

查看是否為可迭代對象的方法如下

如果要對list實現(xiàn)下標(biāo)循環(huán),可以用enumerate函數(shù)把一個list變成索引-元素對

列表生成式

生成器
通過列表生成式,我們可以直接創(chuàng)建一個列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那后面絕大多數(shù)元素占用的空間都白白浪費了。
所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計算的機制,稱為生成器:generator。
生成器的樣式

生成器的訪問方法

對于一些不太好寫出生成式的情況,通過yield可以改成generator

generator和函數(shù)的執(zhí)行流程不一樣。函數(shù)是順序執(zhí)行的,遇到return語句或最后一行語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時候執(zhí)行,遇到y(tǒng)ield就返回
,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行
迭代器(Iterator)
生成器都是Iterator,但是list,dict,str等雖然都是Iterable的,但不是Iterator。
這是因為Python的Iterator對象表示的是一個數(shù)據(jù)流,Iterator對象可以被next()函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù),直到?jīng)]有數(shù)據(jù)時拋出StopIteration錯誤??梢园堰@個數(shù)據(jù)流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator的計算是惰性的,只有在需要返回下一個數(shù)據(jù)時它才會計算。
Iterator甚至可以表示一個無限大的數(shù)據(jù)流,例如全體自然數(shù)。而使用list是永遠不可能存儲全體自然數(shù)的。
如果要把list,dict,str等Iterable變成Iterator可以使用iter()函數(shù)

小結(jié)

函數(shù)式編程
高階函數(shù)
map
map()函數(shù)接收兩個參數(shù),一個是函數(shù),一個是Iterable,map將傳入的函數(shù)依次作用到序列的每個元素,并把結(jié)果作為新的Iterator返回。
map樣式

reduce
reduce把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上,這個函數(shù)必須接收兩個參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算

可以巧妙的運用map和reduce函數(shù)完成str2int函數(shù)

filter

sorted

返回函數(shù)

閉包,此處因為內(nèi)部函數(shù)調(diào)用了外部函數(shù)的局部變量i,所以在外部函數(shù)給f1,f2,f3賦值后,外部函數(shù)被回收,但是因為內(nèi)部函數(shù) f 調(diào)用了 i 這個變量,所以 i 被隨 f 保留了下來,另外,函數(shù) f 被append入fs中三次,所以賦值給三個變量,這三個變量代表了函數(shù) f 這個邏輯結(jié)構(gòu)。需要注意的是,fs 放入的是 f 而非f(),所以只是邏輯塊,沒有實例輸入,并未執(zhí)行該函數(shù)。因此執(zhí)行f1,f2,f3的時候,執(zhí)行的i*i這個邏輯塊時,變量i的值已經(jīng)是3了,所以結(jié)果都是三。


如果要避免這種情況,那么可以在fs中塞入執(zhí)行的f

匿名函數(shù)

裝飾器
假設(shè)我們要增強now()函數(shù)的功能,比如,在函數(shù)調(diào)用前后自動打印日志,但又不希望修改now()函數(shù)的定義,這種在代碼運行期間動態(tài)增加功能的方式,稱之為“裝飾器”(Decorator)
寫一個裝飾器log(),

把裝飾器安裝在要裝飾的函數(shù)之前

結(jié)果如下

此時now函數(shù)被裝飾成了wrapper函數(shù),now的函數(shù)名指向的也是wrapper而非now,所以要糾正這個問題,可以使用@functools.wraps(func)


偏函數(shù)
functools.partial就是幫助我們創(chuàng)建一個偏函數(shù)的,不需要我們自己定義int2(),可以直接使用下面的代碼通過int函數(shù)創(chuàng)建一個新的函數(shù)int2

模塊
使用模塊

面向?qū)ο缶幊?/h1>
類和實例
image.png
訪問限制

如果要讓內(nèi)部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線,在Python中,實例的變量名如果以開頭,就變成了一個私有變量(private),只有內(nèi)部可以訪問,外部不能訪問,所以,我們把Student類改一改

獲取對象信息
如果要獲得一個對象的所有屬性和方法,可以使用dir()函數(shù),它返回一個包含字符串的list,比如,獲得一個str對象的所有屬性和方法

類似xxx的屬性和方法在Python中都是有特殊用途的,比如len方法返回長度。在Python中,如果你調(diào)用len()函數(shù)試圖獲取一個對象的長度,實際上,在len()函數(shù)內(nèi)部,它自動去調(diào)用該對象的len()方法,所以,下面的代碼是等價的

對于函數(shù)hasattr
一個正確的用法的例子如下

實例屬性和類屬性
如果Student類本身需要綁定一個屬性

面向?qū)ο蟾呒壘幊?/h1>
slots
python作為動態(tài)語言,可以在程序運行過程中動態(tài)給class加上功能
但是,如果想要限制類的屬性,比如,只允許對Student實例添加name和age屬性,使用slots
即可


@property
Python內(nèi)置的@property裝飾器負(fù)責(zé)把一個方法變成屬性調(diào)用,這里@property表示getter方法


多重繼承
通過多重繼承,一個子類就可以同時獲得多個父類的所有功能

元類
可以使用type()創(chuàng)建類


IO編程
文件讀寫

也可以簡潔地寫

操作文件和目錄
如果是posix,說明系統(tǒng)是Linux、Unix或Mac OS X,如果是nt,就是Windows系統(tǒng)

環(huán)境變量的訪問


操作文件和目錄


序列化



進程和線程(用到了再看)
多進程


訪問數(shù)據(jù)庫
MySql
如何連接到MySql的test數(shù)據(jù)庫
