基礎(chǔ)
使用#完成注釋
引號的下一行如果有縮進(jìn)拙寡,視為代碼塊庐橙。
布爾值為True,F(xiàn)alse
布爾值運算符為and怯伊,or琳轿,not
空值為None
Python中無常量定義,如表示常量,應(yīng)該寫為大寫字母崭篡,但仍可修改值挪哄。
Python中有兩種除法,/為浮點除琉闪,運算結(jié)果為浮點數(shù)迹炼,//為地板除,運算結(jié)果為整數(shù)
ASCII碼颠毙,Unicode編碼斯入,UTF-8編碼
在計算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼蛀蜜,當(dāng)需要保存到硬盤或者需要傳輸時刻两,就轉(zhuǎn)換為UTF8編碼
ord與chr
python中的str與bytes
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,使用decode()方法將bytes轉(zhuǎn)為str
list與tuple元組
classmates =['1','2','3']
Classmates=('1','2','3')
python中下標(biāo)從0開始滴某,可以用負(fù)下標(biāo)
tuple一旦初始化就不能修改
只有1個元素的tuple定義時必須加個逗號磅摹,來消除歧義。
Input()返回的數(shù)據(jù)類型為str
python循環(huán)分為for和while兩種霎奢,可使用break與continue語句
For x in list:
Xxx
While True:
Xxx
dict與set
d={'M':1,'N':2,'O':3}
可使用in與get判斷dict中某元素是否存在
set與dict類似户誓,也是一組key的集合,但不存儲value
set中元素不可重復(fù)椰憋,要創(chuàng)建一個set厅克,需要提供一個list作為輸入集合
s=set([1,2,3])
不可變對象
函數(shù)定義
Def my_abs(x):
pass語句,空操作
判斷變量類型isinstance(x, (int, float))
python中函數(shù)可以返回多個值橙依,這些值以tuple元組的形式返回
Python還可以使用默認(rèn)參數(shù)证舟,可變參數(shù)和關(guān)鍵字參數(shù)
Def power(x, m=3,n=2)
調(diào)用時窗骑,power(x, n=2)
定義默認(rèn)參數(shù)時女责,默認(rèn)參數(shù)必須指向不可變對象
可變參數(shù)
Def calc(*numbers)
在函數(shù)內(nèi)部,numbers接收到的是一個tuple
python允許在list或tuple前面加一個*號创译,把list或tuple的元素變成可變參數(shù)傳進(jìn)去抵知。
關(guān)鍵字參數(shù)允許傳入0個或任意個含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict
Def person(name,age, **kw)
Extra={'1':1,'2':2,'3':3}
Person('name',11,**extra);此時kw將獲得extra的一份拷貝
python可以限制關(guān)鍵字參數(shù)的名字软族,稱為命名關(guān)鍵字參數(shù)
Def person(name,age,*,city,job);*后參數(shù)視為命名關(guān)鍵字參數(shù)
python中參數(shù)定義順序必須是:必選參數(shù)刷喜,默認(rèn)參數(shù),可變參數(shù)立砸,命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)
遞歸調(diào)用的次數(shù)過多掖疮,會導(dǎo)致棧溢出。
解決遞歸調(diào)用棧溢出的方法是通過尾遞歸優(yōu)化颗祝。
尾遞歸是指在函數(shù)返回的時候調(diào)用自身本身浊闪,并且return語句不能包含表達(dá)式恼布,編譯器或解釋器會做相應(yīng)優(yōu)化。
遺憾的是搁宾,大多數(shù)編程語言沒有針對尾遞歸做優(yōu)化折汞,Python解釋器也沒有做優(yōu)化。
高級特性
在Python中盖腿,代碼不是越多越好爽待,而是越少越好。代碼不是越復(fù)雜越好奸忽,而是越簡單越好堕伪。
切片输瓜,與Matlab中取元素相似
tuple也可以做切片操作卧波,但操作結(jié)果仍是tuple
字符串也可以做切片操作饮笛,但操作結(jié)果仍是字符串
判斷一個對象是否是可迭代對象,isinstance(x,Iterable);
python內(nèi)置的enumerate函數(shù)可以把一個list變成索引-元素對
列表生成式疙筹,List Comprehension,是Python內(nèi)置的非常簡單卻強(qiáng)大的可以用來創(chuàng)建list的生成式
List(range(1,100))
[x*x, for x in range(1,100)]
[x*x, for x in range(1,100) if x%2==0]
[m*n, for m in range(1,100) for n in range(1,100)]
[d for d in os.listdir('.')]
d={}
[k+'='+v for k,v in d.items()]
[s.lower() for s in L]
Python中一邊循環(huán)一邊計算的機(jī)制禁炒,稱為生成器而咆,generator
將列表生成式的[]改為(),就創(chuàng)建了一個generator幕袱,可使用next()函數(shù)獲得generator的下一個返回值
如果一個函數(shù)定義中包含yield關(guān)鍵字暴备,那么這個函數(shù)就不再是一個普通函數(shù),而是一個generator们豌,可使用next()不斷獲取yield返回的值
可直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
一類是集合類數(shù)據(jù)類型涯捻,如list、tuple望迎、dict障癌、set、str等
一類是generator辩尊,包括生成器和帶yield的generator function
Iterable vs Iterator
可以被next函數(shù)調(diào)用并不斷返回下一個值得對象稱為迭代器涛浙,Iterator
Iter()可將非Iterator的Iterable對象轉(zhuǎn)換為Iterator
函數(shù)式編程
Python對函數(shù)式編程提供部分支持
函數(shù)式編程的一大特點是,允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù)摄欲,還允許返回一個函數(shù)
高階函數(shù) Higher-Order function
把函數(shù)作為參數(shù)傳入轿亮,這樣的函數(shù)稱為高階函數(shù),函數(shù)式編程就是指這種高度抽象的編程范式胸墙。
Map/reduce
Filter用于過濾序列我注,返回值為True保留該元素
Iterator是惰性計算的序列
Sorted,擴(kuò)展功能的參數(shù)有key與reverse
提供閉包功能
關(guān)鍵字lambda表示匿名函數(shù)劳秋,冒號前面的x表示函數(shù)參數(shù)
Lambda x:x*x
相當(dāng)于
Def f(x):
Return x*x
函數(shù)對象有一個__name__屬性仓手,可拿到函數(shù)名字
在代碼運行期間動態(tài)增加功能的方式胖齐,稱為裝飾器Decorator
本質(zhì)上,decorator是一個返回函數(shù)的高階函數(shù)嗽冒,
@log
Def now():
Xxx
相當(dāng)于now=log(now)
偏函數(shù)
Int2=functools.partial(int, base=2)
模塊
Python中呀伙,一個.py文件稱為一個模塊module
為了避免模塊名沖突,python又引入了按目錄來組織模塊的方法添坊,稱為包Package
python中安裝第三方模塊剿另,是通過包管理工具pip完成的
面向?qū)ο缶幊?/p>
Class Student(object):
Def __init__(self,…):
Xxx
Def print(self):
xxx
判斷對象類型
isinstance()
type()
dir()獲取對象的所有屬性與方法
getattr(), setattr(),hasattr()
相同名稱的實例屬性將屏蔽掉類屬性
面向?qū)ο蟾呒壘幊?/p>
為了限制動態(tài)綁定類的屬性,Python允許在定義類的時候贬蛙,定義一個特殊的__slots__變量雨女,來限制該class實例能添加的屬性
Python內(nèi)置的@property裝飾器就是負(fù)責(zé)把一個方法變成屬性調(diào)用的
在設(shè)計類的時候,我們優(yōu)先考慮通過多重繼承來組合多個mixin的功能阳准,而不是設(shè)計多層次的復(fù)雜的繼承關(guān)系氛堕。
定制類
__str__, __repr__,__iter__, __next__,__getitem__,__getattr__,__call__,
使用枚舉類
Month = Enum('Month',('Jan','Feb',))
使用元類
type()可動態(tài)創(chuàng)建類型
Hello=Type('Hello',(object),dict(hello=fn))
先定義metaclass野蝇,再創(chuàng)建類讼稚,最后創(chuàng)建實例
錯誤,調(diào)試和測試
try:
except Exception as e:
finally:
Python內(nèi)置的logging模塊可以方便地記錄錯誤信息
拋出錯誤绕沈,raise 锐想。。乍狐。
三種調(diào)試方法
使用print
使用assert
使用logging
使用pdb
IO編程
With open('file path') as f:
StringIO和BytesIO是在內(nèi)存中操作str和bytes的方法赠摇,使得和讀寫文件具有一致的接口。
Python的os模塊封裝了操作系統(tǒng)的目錄和文件操作浅蚪,要注意這些函數(shù)有的在os模塊中藕帜,有的在os.path模塊中。
Python語言特定的序列化模塊是pickle掘鄙,但如果要把序列化搞得更通用耘戚、更符合Web標(biāo)準(zhǔn),就可以使用json模塊操漠。
virtualenv
virtualenv就是用來為一個應(yīng)用創(chuàng)建一套“隔離”的Python運行環(huán)境收津。
pip3 install virtualenv