1矫膨、注釋的作用
單行注釋: #
多行注釋:三對單引號(’’’注釋內(nèi)容’’’)
增加程序的可讀性
提高團隊開發(fā)效率
作為調(diào)試使用
2妖混、Python變量標識符
由字母萍恕、數(shù)字、下劃線組成蟀拷。只能以字母和下劃線開頭
建議使用駝峰命名法
不能與關(guān)鍵字重名碰纬,查看Python預(yù)置的關(guān)鍵字可以用:
import keyword
print(keyword.kwlist)
3、Python的數(shù)據(jù)類型包括
數(shù)字:整數(shù)int问芬、浮點數(shù)float
布爾類型
字符串
字典
列表
元祖
集合set
4悦析、運算符
邏輯運算符
賦值運算符
算術(shù)運算符
比較運算符
位運算符
5、編碼
ASCLL編碼:由大小寫英文字母此衅、數(shù)字和一些符號組成强戴,共127個,這個編碼表被稱為ASCII編碼挡鞍。大寫字母A的編碼是65骑歹,小寫字母z的編碼是122
字符串會存在編碼問題,ASCLL是不支持中文的墨微。所以出現(xiàn)了Unicode編碼道媚。ASCII編碼是1個字節(jié),而Unicode編碼通常是2個字節(jié)
在計算機內(nèi)存中翘县,統(tǒng)一使用Unicode編碼最域,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r候,就轉(zhuǎn)換為UTF-8編碼锈麸。
【注】計算機中8bit作為一個字節(jié)
6镀脂、字符串處理
輸入:input函數(shù)
輸出:print函數(shù)
格式化輸出
字符串的下標和切片
字符串的下標是從0開始
切片的語法:[起始:結(jié)束:步長] ????包左不包右
?【例】????name = 'abcdef'
? ? ? ? ? ? ? ? print(name[0:3]) # 取 下標0~2 的字符
? ? ? ? ? ? ? ? 結(jié)果:abc
字符串常用函數(shù)【重點】
【注】split函數(shù)經(jīng)常會用到,經(jīng)常用于把字符串分割掐隐。返回一個列表
【注】上訴函數(shù)都經(jīng)常使用狗热,find函數(shù)和index函數(shù)作用基本相同钞馁。find函數(shù)找不到返回-1虑省,二index函數(shù)找不到會拋異常。根據(jù)實際情況選擇
【注】strip常用于去掉特殊字符僧凰,如空格等
7探颈、列表詳解
列表創(chuàng)建:
列表可以包括各種類型的數(shù)據(jù)
訪問列表:
一般是通過索引來訪問,列表的索引值也是從0開始
列表操作
更新元素
student[0]=‘tom’? ? #直接重新賦值即可
添加元素
student.append(‘籃球’)? ?#添加到列表尾部
student.insert(4,‘音樂’)? #指定索引值添加
刪除元素
查找元素
in 【存在】训措,存在則返回True
not in 【不存在】
列表函數(shù)
【注】最常用的當(dāng)然是len方法啦伪节,比如循環(huán)遍歷得到列表中所有元素光羞,循環(huán)的次數(shù)就是列表長度
【注】這j幾個函數(shù)都用過,index函數(shù)用的更多點
8怀大、元祖
元祖:元祖也是個容器纱兑,可以存放元素。它與列表的區(qū)別是元祖創(chuàng)建好了就不能更改了【不可變特性】
元祖名=(元素1,元素2,元素n…….)
元祖操作
訪問元祖:通過索引值students[1]
刪除元祖
tuple1=('abcd',123,3.33,'hello')
? print("刪除之前的元祖為:",tuple1)
? del tuple1
? print("刪除之后的元祖為:",tuple1)
元祖截取化借、切片
students=['jack','tom','john','amy','kim','sunny']?
print("截取元素0:3",students[0:3])
元祖函數(shù)
9潜慎、字典
一種可變?nèi)萜黝愋停铱梢源鎯θ我忸愋蛯ο?/p>
創(chuàng)建
字典名={key1:value1,key2:value2}
訪問
根據(jù)鍵值訪問如:
students['name']? ? ????# 字典 students={'name':'tom','age':18,'sex‘:’男'}? ?
修改
直接重新給元素賦值即可
students['age']=20
添加元素
動態(tài)的向字典中添加元素的時候蓖康,只要添加的鍵在字典中不存在铐炫,就會新增這個元素。在以下字典中添加一個住址信息
students['address']='上海'
刪除字典元素
del? 字典名[key]? #刪除字典中指定鍵值的元素
字典名.clear()? ? ? ? ?#? 刪除字典中所有元素蒜焊,得到結(jié)果是空字典 {}
刪除字典
del? 字典名
字典方法【重點】
這三個函數(shù)都經(jīng)常使用
第一個方法可以生成一個字典倒信,第二個方法獲取指定鍵值的value值,不存在也不會拋異常泳梆。在項目中也經(jīng)常使用
通過這兩個方法鳖悠,掌握如何遍歷一個字典
for? key in dict.keys()? ? ?#遍歷key值
【注】第一個方法經(jīng)常用來設(shè)置默認值
10、可變類型和不可變類型
?Python中string优妙、tuple和number是不可變對象竞穷,而dict、list等是可變對象鳞溉;不可變對象在進行重新賦值的時候瘾带,實際上是將原始值丟棄,將變量指向一個新值熟菲;可變對象的可變性實質(zhì)上是指更改可變對象中的子對象看政,比如list中的item元素的更改。
11抄罕、淺拷貝和深拷貝
淺拷貝:不拷貝子對象(針對子對象中的item)允蚣,當(dāng)子對象進行更改的時候,原始對象也會改變呆贿。常見操作:列表的切片[:]操作嚷兔、list()操作,字典的copy()函數(shù)做入、copy模塊的copy()函數(shù)(兩個一模一樣的雙胞胎)
深拷貝:會拷貝子對象冒晰,當(dāng)對原始對象子對象進行更改的時候,原始對象不會改變竟块。常見操作是copy模塊的deepcopy()函數(shù)
import copy
list_0 = ["A", "B",["C", "D"], "E"]
list_1 = copy.copy(list_0)
list_2 = list_0.copy()
list_3 = list_0[:]
list_4 = list(list_0)
# --- 深拷貝的拷貝方式 ---
list_d = copy.deepcopy(list_0)
# --- 深淺拷貝的區(qū)別 ---
# 1. 對第一層數(shù)據(jù)進行賦值
list_0[0] = "X0"
list_1[0] = "X1"
list_2[0] = "X2"
list_3[0] = "X3"
list_4[0] = "X4"
list_d[0] = "Xd"
# 打印結(jié)果: 理所當(dāng)然,所有列表都發(fā)生了變化
# list_0: ['X0', 'B', ['C', 'D'], E]
# list_1: ['X1', 'B', ['C', 'D'], E]
# list_2: ['X2', 'B', ['C', 'D'], E]
# list_3: ['X3', 'B', ['C', 'D'], E]
# list_4: ['X4', 'B', ['C', 'D'], E]
# list_d: ['Xd', 'B', ['C', 'D'], E]
# 2. 對第二層的list引用進行賦值
list_0[2][0] = "Y0"
list_1[2][0] = "Y1"
list_2[2][0] = "Y2"
list_3[2][0] = "Y3"
list_4[2][0] = "Y4"
list_d[2][0] = "Yd"
# 打印結(jié)果:
0-1都被改成了同一個值,這說明淺拷貝只拷貝了第二層list的引用;而深拷貝則拷貝了數(shù)據(jù)結(jié)構(gòu)
# list_0: ['X0', 'B', ['Y4', 'D'], E]
# list_1: ['X1', 'B', ['Y4', 'D'], E]
# list_2: ['X2', 'B', ['Y4', 'D'], E]
# list_3: ['X3', 'B', ['Y4', 'D'], E]
# list_4: ['X4', 'B', ['Y4', 'D'], E]
# list_d: ['Xd', 'B', ['Yd', 'D'], E]
# 3. 對第三層的Ls對象引用進行賦值
list_0[3]= "Z0"
list_1[3]= "Z1"
list_2[3]= "Z2"
list_3[3]= "Z3"
list_4[3]= "Z4"
list_d[3]= "Zd"
# 執(zhí)行結(jié)果: 繼續(xù)驗證了上方論點
# list_0: ['X0', 'B', ['Y4', 'D'], Z4]
# list_1: ['X1', 'B', ['Y4', 'D'], Z4]
# list_2: ['X2', 'B', ['Y4', 'D'], Z4]
# list_3: ['X3', 'B', ['Y4', 'D'], Z4]
# list_4: ['X4', 'B', ['Y4', 'D'], Z4]
# list_d: ['Xd', 'B', ['Yd', 'D'], Zd]
print(list_0)
print(list_1)
print(list_2)
print(list_3)
print(list_4)
print(list_d)
思路一:利用切片操作和list方法拷貝等就叫淺拷貝壶运,只是拷貝了最外圍的對象本身,內(nèi)部的元素都只是拷貝了一個引用而已浪秘。
思路二:利用copy中的deepcopy方法進行拷貝就叫做深拷貝蒋情,外圍和內(nèi)部元素都進行了拷貝對象本身埠况,而不是引用。
??? 但是對于數(shù)字棵癣,字符串和元組類型對象辕翰,沒有被拷貝的說法,即便是用深拷貝狈谊,查看id的話也是一樣的金蜀,如果對其重新賦值,也只是新創(chuàng)建一個對象的畴,替換掉舊的而已
12渊抄、流程控制
條件控制語句
if條件
if條件:
????? 條件成立,執(zhí)行代碼塊
if_else
if 條件:
? 滿足條件執(zhí)行的代碼塊1
else:
? 沒有滿足if條件執(zhí)行的代碼塊2
if-elif-else
if 條件:
? 滿足if條件執(zhí)行的代碼塊1
elif 條件1:
? 滿足條件1執(zhí)行的代碼塊2
elif 條件2:
? 滿足條件2執(zhí)行的代碼塊3
else:
? 不滿足以上條件執(zhí)行的代碼塊4
循環(huán)語句
wile循環(huán):
while 條件:
? 代碼塊
while-else
while 條件:
? 滿足條件執(zhí)行代碼塊
else:
? 不滿足條件執(zhí)行代碼塊
break和continue
continue:退出當(dāng)前循環(huán)丧裁,再繼續(xù)執(zhí)行下一次循環(huán)
break:退出循環(huán)
【注】代碼塊內(nèi)一般有語句可以影響條件护桦,這樣當(dāng)條件不滿足時候才會跳出循環(huán)。在循環(huán)語句中使用break的作用是煎娇,在循環(huán)體內(nèi)遇到break則會跳出循環(huán)二庵,終止循環(huán),并且不論循環(huán)的條件是否為真缓呛,都不再繼續(xù)循環(huán)下去
for循環(huán)
for ????<variable> ????in <sequence>:
? ? ? ? ?statements
else:
????????statements
【注】sequence可以是列表元組集合催享,如果是字典只能遍歷keys,無法遍歷values
for循環(huán)也可以用break和continue
13哟绊、pass語句
?pass語句的使用表示不希望任何代碼或者命令的執(zhí)行因妙;
?pass語句是一個空操作,在執(zhí)行的時候不會產(chǎn)生任何反應(yīng)票髓;
?pass語句常出現(xiàn)在if攀涵、while、for等各種判斷或者循環(huán)語句中洽沟;
pass語句也可以出現(xiàn)在函數(shù)中
14以故、range函數(shù)
Python中range() 函數(shù)返回的是一個整數(shù)序列的對象,一般用在for 循環(huán)中裆操。比如說獲取1000個隨機數(shù)怒详。for i in range(1000)
函數(shù)語法
?range(start, stop[, step])
參數(shù)說明:
start: 計數(shù)從start 開始。默認是從 0 開始踪区。例如range(5)等價于range(0昆烁, 5);
end: 計數(shù)到end 結(jié)束,但不包括 end朽缴。例如:range(0善玫, 5) 是[0, 1, 2, 3, 4]沒有5
step:步長水援,默認為1密强。例如:range(0茅郎, 5) 等價于 range(0, 5, 1)
15、推導(dǎo)式
列表推導(dǎo)式:列表推導(dǎo)式(list comprehension)是利用其它列表創(chuàng)建新列表的一種方式或渤,工作原理類似for循環(huán)系冗,即可對得到的元素進行轉(zhuǎn)換變形 ,其基本格式如下(可以有多個for語句)
[expr for value in collection ifcondition]
例:sum=[ m[i][j]*n[i][j]for i in range(3) for j in range(3)]
????????print(sum)
集合推導(dǎo)式:集合推導(dǎo)式跟列表推導(dǎo)式非常相似薪鹦,唯一區(qū)別在于用{}代替[]掌敬。其基本格式如下:
{ expr for value in collection if????condition }
16、內(nèi)置函數(shù)
常用的內(nèi)置函數(shù)有:
iter返回一個迭代器池磁,參數(shù)是一個可 迭代對象奔害,比如說是list、dict
type :用來獲取對象類型或者構(gòu)建一個類
id:用來獲取對象的ID值地熄,經(jīng)常用來判斷兩個是否是同一個對象
len:獲取序列的長度华临,比如列表、字典端考、元祖
dir:獲取一個類或者模塊公共的屬性和方法
int雅潭、float、tuple却特、dict扶供、str、list常用于格式轉(zhuǎn)換裂明,獲取整形椿浓、浮點型、元祖闽晦、字典轰绵、字符串、列表類型的數(shù)據(jù)
input 獲取輸入值
super獲取父類
17尼荆、函數(shù)
組織好的左腔、可重復(fù)使用的、用戶實現(xiàn)單一或者關(guān)聯(lián)功能的代碼段捅儒。函數(shù)能夠提高應(yīng)用的模塊性和代碼的重復(fù)利用率液样。
函數(shù)代碼塊以?def?關(guān)鍵詞開頭,后接函數(shù)標識符名稱和圓括號()巧还。
任何傳入?yún)?shù)和自變量必須放在圓括號中間鞭莽。
函數(shù)的第一行語句可以選擇性地使用文檔字符串---用于存放函數(shù)說明。
函數(shù)內(nèi)容以冒號起始麸祷,并且縮進澎怒。
函數(shù)定義語法如下:
?def???? 函數(shù)名([參數(shù)列表]):? ????#參數(shù)列表可選項
????????? 函數(shù)體
函數(shù)名其實就是指向一個函數(shù)對象的引用,完全可以把函數(shù)名賦值給一個變量阶牍,相當(dāng)于給這個函數(shù)起了一個別名
函數(shù)調(diào)用
語法:函數(shù)名([參數(shù)列表])
函數(shù)參數(shù)
必備參數(shù) (位置實參)
關(guān)鍵字參數(shù)
關(guān)鍵字實參是傳遞給函數(shù)的名稱-值對喷面。直接在實參中將名稱和值關(guān)聯(lián)起來星瘾,因此向函數(shù)傳遞實參時不會混淆。函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的值惧辈。使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時參數(shù)的順序與聲明時不一致琳状,因為Python 解釋器能夠用參數(shù)名匹配參數(shù)值.
默認參數(shù)
函數(shù)定義的時候,設(shè)置的參數(shù)是形參盒齿。那么也可以給每個形參指定一個默認值念逞。當(dāng)調(diào)用函數(shù)時,如果沒有傳入實參边翁,就使用形參的默認值翎承。如果調(diào)用的時候傳入了實參,那么程序?qū)⑹褂脗魅氲膶崊?/p>
不定長參數(shù)
加了星號(*)的變量名會存放所有未命名的變量參數(shù)符匾,變量用元祖來接受
加了(**)會存放所有命名的變量參數(shù)审洞,變量用字典來接受
參數(shù)傳遞與數(shù)據(jù)類型
? ? ? 不可變類型:如 整數(shù)、字符串待讳、元組芒澜。如fun(a),傳遞的只是a的值创淡,沒有影響a對象本身痴晦。比如在 fun(a)內(nèi)部修改a 的值,只是修改另一個復(fù)制的對象琳彩,不會影響 a 本身誊酌。
????? 可變類型:如 列表,字典露乏。如 fun(la)碧浊,則是將la 真正的傳過去,修改后fun外部的la也會受影響
函數(shù)返回值
使用return關(guān)鍵字瘟仿。?函數(shù)并非總是將結(jié)果直接輸出箱锐,相反,函數(shù)的調(diào)用者需要函數(shù)提供一些通過函數(shù)處理過后的一個或者一組數(shù)據(jù)劳较,只有調(diào)用者擁有了這個數(shù)據(jù)驹止,才能夠做一些其他的操作。那么這個時候观蜗,就需要函數(shù)返回給調(diào)用者數(shù)據(jù)臊恋,這個就被稱之為返回值,想要在函數(shù)中把結(jié)果返回給調(diào)用者
【注】return后語句不再執(zhí)行墓捻,返 回值是個元祖抖仅。???
?print是將結(jié)果輸出到控制臺,return語句結(jié)束函數(shù)的調(diào)用,并將結(jié)果返回給調(diào)用者撤卢,且返回的結(jié)果不能輸出到控制臺(也就是不能直接打印出來)需要通過print才能打印出來
return語句用于退出函數(shù)环凿,并選擇性的向調(diào)用者返回一個表達式。直接return的語句或者沒有返回值的函數(shù)默認返回None凸丸。
18拷邢、生成器
概念:在 Python 中袱院,使用了 yield 的函數(shù)被稱為生成器(generator)屎慢。跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù)忽洛,只能用于迭代操作腻惠,更簡單點理解生成器就是一個迭代器。
生成器創(chuàng)建有兩種方式
方式1:使用yield關(guān)鍵字欲虚,?yield 的作用就是把一個函數(shù)變成一個generator集灌,帶有 yield 的函數(shù)不再是一個普通函數(shù),Python 解釋器會將其視為一個生成器复哆,如調(diào)用Xun函數(shù),不會執(zhí)行該函數(shù)欣喧,而是返回一個iterable迭代對象!?在調(diào)用生成器運行的過程中梯找,每次遇到 yield時函數(shù)會暫停并保存當(dāng)前所有的運行信息唆阿,返回yield的值。并在下一次從當(dāng)前位置繼續(xù)運行
def test_gen():
????i, a, b =0, 0, 1
? ? ? ? ? while i <1000:
????????????????a, b = b, a+b
????????????????yield b
????????????????i = i +1
區(qū)別:與return類似锈锤,都可以返回值驯鳖,但不一樣的地方,yield可以返回多次值久免,而return只能返回一次浅辙。跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù)阎姥,只能用于迭代操作记舆,更簡單點理解生成器就是一個迭代器。
方式2:可以使用列表生成式
generator_ex?=?(x*x?for?x?in?range(10))
for?i?in?generator_ex:
? ? ? print(i)
我們創(chuàng)建一個generator后呼巴,基本上永遠不會調(diào)用next()氨淌,而是通過for循環(huán)來迭代,并且不需要關(guān)心StopIteration的錯誤伊磺,generator非常強大盛正,如果推算的算法比較復(fù)雜,用類似列表生成式的for循環(huán)無法實現(xiàn)的時候屑埋,還可以用函數(shù)來實現(xiàn)豪筝。比如著名的斐波那契數(shù)列
注意:可以通過for循環(huán)或者手動調(diào)用 Xun(5) 的 next() 方法
def Xun(max):
??? ????n=0
??????? b=1
??????? while n < max:
??????????????? yield b
????????????????# print(b)
????????????????b+=1
? ? ? ? ? ? ? ? n = n + 1
一般的函數(shù)在執(zhí)行完畢之后會返回一個值然后退出,但是生成器函數(shù)會自動掛起,然后重新拾起繼續(xù)執(zhí)行,他會利用yield關(guān)鍵字關(guān)起函數(shù)怜姿,給調(diào)用者返回一個值愁茁,同時保留了當(dāng)前的足夠多的狀態(tài),可以使函數(shù)繼續(xù)執(zhí)行
19多艇、迭代器
迭代器:實現(xiàn)了兩個方法 __iter__() 與 __next__() 。
__iter__() 方法返回一個特殊的迭代器對象
__next__() 方法會返回下一個迭代器對象像吻。
迭代是Python最強大的功能之一峻黍,是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象拨匆。迭代器對象從集合的第一個元素開始訪問姆涩,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退惭每。迭代器有兩個基本的方法:iter() 和 next()骨饿。字符串,列表或元組,集合對象都可用于創(chuàng)建迭代器
生成器都是Iterator對象台腥,但list宏赘、dict、str雖然是Iterable(可迭代對象)黎侈,卻不是Iterator(迭代器)察署。
>>>list=[1,2,3,4]
>>> it =iter(list) # 創(chuàng)建迭代器對象
>>> print(next(it)) # 輸出迭代器的下一個元素 1
>>> print(next(it)) 2
小結(jié):
凡是可作用于for循環(huán)的對象都是Iterable類型;
凡是可作用于next()函數(shù)的對象都是Iterator類型蜓竹,它們表示一個惰性計算的序列箕母;
集合數(shù)據(jù)類型如list、dict俱济、str等是Iterable但不是Iterator嘶是,不過可以通過iter()函數(shù)獲得一個Iterator對象。
生成器一定是迭代器蛛碌,但是迭代器不一定是生成器
20聂喇、變量作用域
局部變量:定義在函數(shù)內(nèi)部的變量擁有一個局部作用域
不同的函數(shù),可以定義相同的名字的局部變量蔚携,但是各用個的不會產(chǎn)生影響
全局變量:全局變量是聲明在函數(shù)外部的變量希太,定義在函數(shù)外的擁有全局作用域
對于可變類型的全局變量來說,要在函數(shù)中修改可以不使用global聲明酝蜒,對于不可變類型的全局變量來說誊辉,要在函數(shù)中修改需要global聲明
21、匿名函數(shù)
匿名函數(shù):定義函數(shù)的過程中亡脑,沒有給定名稱的函數(shù)就叫做匿名函數(shù)堕澄;Python中使用lambda表達式來創(chuàng)建匿名函數(shù)邀跃。
lambda 來創(chuàng)建匿名函數(shù)規(guī)則。
?●lambda只是一個表達式蛙紫,函數(shù)體比def簡單很多拍屑。
??●lambda的主體是一個表達式,而不是一個代碼塊坑傅,所以不能寫太多的邏輯進去僵驰。
?●lambda函數(shù)擁有自己的命名空間,且不能訪問自有參數(shù)列表之外或全局命名空間里的參數(shù)唁毒。
?●lambda定義的函數(shù)的返回值就是表達式的返回值蒜茴,不需要return語句塊
?●lambda表達式的主要應(yīng)用場景就是賦值給變量、作為參數(shù)傳入其它函數(shù)
lambda匿名函數(shù)的表達式規(guī)則是:lambda ????參數(shù)列表: 表達式
22枉证、遞歸函數(shù)
遞歸函數(shù):遞歸就是子程序(或函數(shù))直接調(diào)用自己或通過一系列調(diào)用語句間接調(diào)用自己矮男,是一種描述問題和解決問題的基本方法移必。(一句話室谚,自己調(diào)用自己)
23、內(nèi)置函數(shù)
常用內(nèi)置函數(shù)
常用高階函數(shù)【面試會問】
24崔泵、面對對象
面向過程:根據(jù)業(yè)務(wù)邏輯從上到下寫代碼
函數(shù)式:將某功能代碼封裝到函數(shù)中秒赤,日后便無需重復(fù)編寫,僅調(diào)用函數(shù)即可
面向?qū)ο螅簩瘮?shù)進行分類和封裝憎瘸,讓開發(fā)“更快更好更強…”
類是對象的類型入篮,具有相同屬性和行為事物的統(tǒng)稱。類是抽象的幌甘。萬物皆對象潮售,對象擁有自己的特征和行為。類是對象的類型锅风,對象是類的實例酥诽。類是抽象的概念,而對象是一個你能夠摸得著皱埠,看得到的實體肮帐。二者相輔相成,誰也離不開誰边器。
25训枢、類的介紹
類定義:
class 類名:
????? 屬性列表
????? 方法列表
類屬性
類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數(shù)體之外忘巧。類變量通常不作為實例變量使用恒界。如果需要用在函數(shù)中使用類名.類屬性.。在__init__()里初始化砚嘴,在內(nèi)部用classname.類屬性名調(diào)用十酣,外部既可以用classname.類屬性名又可以用instancename.類屬性名來調(diào)用
實例變量:定義在方法中的變量眯勾,只作用于當(dāng)前實例的類。在__init__(self,...)中初始化婆誓,內(nèi)部調(diào)用時都需要加上self.屬性名吃环,外部調(diào)用時用“對象名.屬性名”調(diào)用
私有屬性:雙下劃線__開頭:外部不可通過“對象名.屬性名”來訪問或者更改實際將其轉(zhuǎn)化為了“_類名__屬性名”。只能在本類里面使用
【注】我們把需要用戶傳入的屬性作為實例屬性洋幻,而把同類都一樣的屬性作為類屬性郁轻。實例屬性在每創(chuàng)造一個類是都會初始化一遍,不同的實例的實例屬性可能不同文留,不同實例的類屬性都相同
屬性操作
屬性訪問【常用方式】:實例化對象名+.來訪問對象的屬性
getattr(obj, name[, default]) : 訪問對象的屬性
hasattr(obj,name) : 檢查是否存在一個屬性
setattr(obj,name,value) : 設(shè)置一個屬性好唯。如果屬性不存在,會創(chuàng)建一個新屬性
delattr(obj, name) : 刪除屬性
注意:name需要加單引號,obj為實例化對象名稱
類方法與靜態(tài)方法
(1):普通方法:外部用實例調(diào)用
def???? fun_name(self,...):
pass
(2)靜態(tài)方法
通過裝飾器 @staticmethod? 裝飾燥翅, 不能訪問實例屬性 骑篙, 參數(shù)不能傳入self,與類相關(guān)但是不依賴類與實例的方法森书。通過類或者實例調(diào)用
(3)類方法
通過@classmethod裝飾靶端,類方法不能訪問實例屬性,第一個參數(shù)必須傳入cls參數(shù)(即代表了此類對象-----區(qū)別------self代表實例對象)凛膏,并且用此來調(diào)用類屬性:cls.類屬性名
【注】靜態(tài)方法與類方法都可以通過類或者實例來調(diào)用杨名。其兩個的特點都是不能夠調(diào)用實例屬性
靜態(tài)方法不需要接收參數(shù),使用類名.類屬性
常用概念
實例化:創(chuàng)建一個類的實例,類的具體對象猖毫。
方法:類中定義的函數(shù)台谍。
對象:通過類定義的數(shù)據(jù)結(jié)構(gòu)實例。對象包括兩個數(shù)據(jù)成員(類變量和實例變量)和方法吁断。
26趁蕊、面向?qū)ο蟮娜齻€重要概念
繼承
程序中當(dāng)我們定義一個class的時候,可以從某個現(xiàn)有的class繼承仔役,新的class稱之為子類(Subclass)掷伙,而被繼承的class稱之為基類、父類或超類骂因。子類繼承了其父類的所有屬性和方法炎咖,同時還可以定義自己的屬性和方法。
【注】在子類中調(diào)用父類時候用super()表示父類
多繼承
語法格式
class???? DerivedClassName(Base1, Base2寒波,Base3):
【注】圓括號中父類的順序乘盼,如果繼承的父類中有相同的方法名,而在子類中使用時未指定俄烁,python將從左至右查找父類中是否包含方法绸栅。
重寫
指的是子類重寫父類方法。方法重寫:如果從父類繼承的方法不能滿足子類的需求页屠,可以對其進行改寫粹胯,這個過程叫方法的覆蓋(override)蓖柔,也稱為方法的重寫。
27风纠、__init__()方法介紹
__init__()是一個特殊的方法屬于類的專有方法况鸣,被稱為類的構(gòu)造函數(shù)或初始化方法,方法的前面和后面都有兩個下劃線。這是為了避免Python默認方法和普通方法發(fā)生名稱的沖突竹观。一般方法需要顯式調(diào)用才能執(zhí)行镐捧,當(dāng)時初始化方法不同。每當(dāng)創(chuàng)建類的實例化對象的時候臭增,__init__()方法都會默認被運行懂酱。作用就是初始化已實例化后的對象。
28誊抛、self參數(shù)
在實例方法定義中列牺,第一個參數(shù)self是必不可少的。類的方法和普通的函數(shù)的區(qū)別就是self拗窃,self并不是Python的關(guān)鍵字瞎领,你完全可以用其他單詞取代他,只是按照慣例和標準的規(guī)定并炮,推薦使用self默刚。self代表的是類實例
29甥郑、內(nèi)置類屬性
__dict__ : 類的屬性(包含一個字典逃魄,由類的屬性名:值組成) 實例化類名.__dict__
__doc__ :類的文檔字符串??(類名.)實例化類名.__doc__
__name__: 類名,實現(xiàn)方式 類名.__name__
__bases__ : 類的所有父類構(gòu)成元素(包含了以個由所有父類組成的元組)
30、__name__介紹
__name__:如果是放在Modules模塊中澜搅,就表示是模塊的名字伍俘; 如果是放在Classs類中,就表示類的名字勉躺;
__main__:模塊癌瘾,xxx.py文件本身.被直接執(zhí)行時,對應(yīng)的模塊名就是__main__了可以在if????__name__ == “__main__”:中添加你自己想要的饵溅,用于測試模塊妨退,演示模塊用法等代碼。作為模塊蜕企,被別的Python程序?qū)耄╥mport)時咬荷,模塊名就是本身文件名xxx了。
31轻掩、單下劃線幸乒、雙下劃線、頭尾雙下劃線說明
私有屬性【雙下劃線】:
為了保護屬性不被隨意修改和訪問唇牧,可以將屬性定義為私有屬性罕扎。如果要讓內(nèi)部屬性不被外部訪問聚唐,可以把屬性的名稱前加上兩個下劃線__,在Python中腔召,實例變量名如果以__開頭杆查,就變成了一個私有變量(private),只有內(nèi)部可以訪問臀蛛,外部不能訪問.
__foo__: 定義的是特殊方法根灯,類似 __init__() 之類的。?
_foo: 以單下劃線開頭的表示的是 protected 類型的變量掺栅,即保護類型只能允許其本身與子類進行訪問(創(chuàng)建的實例可以訪問)烙肺,不能用于 from????module????? import? ????*??
__foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個類本身進行訪問了。
32氧卧、Python模塊的概念
?????? 每一個 Python 腳本文件都可以被當(dāng)成是一個模塊桃笙,模塊里的代碼可以是一段直接執(zhí)行的腳
本,也可以是一堆類似庫函數(shù)的代碼沙绝,從而可以被別的模塊導(dǎo)入(import)調(diào)用搏明。模塊可以包含直
接運行的代碼塊、類定義闪檬、函數(shù)定義或這幾者的組合
【注】模塊導(dǎo)入順序:Python標準庫模塊????Python第三方模塊:????應(yīng)用程序自定義模塊:
模塊導(dǎo)入語法:import module1
在調(diào)用模塊中的函數(shù)時星著,必須加上模塊名調(diào)用,因為可能存在多個模塊中含有相同名稱的函數(shù)粗悯,此時虚循,如果只是通過函數(shù)名來調(diào)用,解釋器無法知道到底要調(diào)用哪個函數(shù)样傍。為了避免這樣的情況横缔,調(diào)用函數(shù)時衫哥,必須加上模塊名.
語法:模塊名.函數(shù)名
from…import
Python的from語句讓你從模塊中導(dǎo)入一個指定的部分到當(dāng)前命名空間中,可以是屬性膛锭、類蚊荣、方法,使用這種方式導(dǎo)入跷究,不會整個模塊導(dǎo)入到當(dāng)前命名空間,它只會將import的內(nèi)容導(dǎo)入敲霍。
from…import *
導(dǎo)入一個模塊的所有內(nèi)容也可以使用from…import*俊马。
語法:from modname????import*
起別名之?dāng)U展import語句(as)
?????? 有時候你導(dǎo)入的模塊名稱已經(jīng)在你的程序中使用了, 或者你不想使用現(xiàn)有的名稱丁存。可以使用一個新的名稱替換原始的名稱
import???? pandas????as? ?pd????????#使用as重新命名
當(dāng)你導(dǎo)入一個模塊柴我,Python解析器對模塊位置的搜索順序是:
【注】如果當(dāng)前路徑或 Pyth解寝。onPATH中存在與標準module同樣的module,則會覆蓋標準module所以自己創(chuàng)建的模塊命名的時候要注意
33、dir函數(shù)
dir()函數(shù)一個排好序的字符串列表艘儒,內(nèi)容是一個模塊里定義過的名字聋伦。
返回的列表容納了在一個模塊里定義的所有模塊,變量和函數(shù)界睁。
34觉增、Python標準庫
詳細請見:http://www.cnblogs.com/ribavnu/p/4886472.html
常用:os? re? sys
35、包
包是一種管理 Python 模塊命名空間的形式翻斟,采用"點模塊名稱"逾礁。比如一個模塊的名稱是 A.B, 那么他表示一個包 A中的子模塊B
目錄中只有包含一個叫做__init__.py的文件才會被認作是一個包访惜,__init__.py控制著包的導(dǎo)入行為嘹履。如果__init__.py文件為空的話,僅僅是把這個包導(dǎo)入债热,不會導(dǎo)入包中的模塊砾嫉。__init__.py中的__all__變量窒篱,是用來控制from包名import?* 時導(dǎo)入的模塊舌剂,可以在__init__.py中編寫其他內(nèi)容,在導(dǎo)入時避消,這些編寫的內(nèi)容就會被執(zhí)行∩匆猓可以在__init__.py中向sys.path添加當(dāng)前被調(diào)用模塊路徑
在導(dǎo)入包的時候迄委,Python會從sys.path中的目錄來尋找這個包中包含的子目錄
有效避免模塊名稱沖突問題,讓應(yīng)用組織結(jié)構(gòu)更加清晰
包將有聯(lián)系的模塊組織在一個信轿,即放到同一個文件夾下
36、__all__屬性
1.編寫Python代碼(不建議在__init__中寫python模塊定罢,可以在包中在創(chuàng)建另外的模塊來寫,盡量保證__init__.py簡單)
2.模塊中不使用__all__屬性惠况,則導(dǎo)入模塊內(nèi)的所有公有屬性稠屠,方法和類。 模塊中使用__all__屬性攘蔽,則表示只導(dǎo)入__all__中指定的屬性,因此唆垃,使用__all__可以隱藏不想被import的默認值辕万。__all__變量是一個由string元素組成的list變量醉途。它定義了當(dāng)我們使用 from <module> import * 導(dǎo)入某個模塊的時候能導(dǎo)出的符號(這里代表變量,函數(shù)嵌屎,類等)。
3. from<module> import * 默認的行為是從給定的命名空間導(dǎo)出所有的符號(當(dāng)然下劃線開頭的變量尼夺,方法和類除外)淤堵。 需要注意的是 __all__只影響到了from<module> import * 這種導(dǎo)入方式, 對于 from<module> import <member> 導(dǎo)入方式并沒有影響扎阶,仍然可以從外部導(dǎo)入。
37惰赋、reload
默認情況下,模塊在第一次被導(dǎo)入之后,其他的導(dǎo)入都不再有效纹坐。如果此時在另一個窗口中改變并保存了模塊的源代碼文件果漾,也無法更新該模塊绒障。這樣設(shè)計原因在于,導(dǎo)入是一個開銷很大的操作(導(dǎo)入必須找到文件庐镐,將其編譯成字節(jié)碼,并且運行代碼)名眉,以至于每個文件损拢、每個程序運行不能夠重復(fù)多于一次。當(dāng)一個模塊被導(dǎo)入到一個腳本隧膏,模塊頂層部分的代碼只會被執(zhí)行一次。因此腐泻,如果你想重新執(zhí)行模塊里頂層部分的代碼蚌斩,可以用reload()函數(shù)员魏。該函數(shù)會重新導(dǎo)入之前導(dǎo)入過的模塊受裹。語法如下: reload(module_name)
38、python文件操作
在python中,使用open函數(shù)岩梳,打開一個已經(jīng)存在的文件,或者新建一個新文件列疗。
函數(shù)語法???? open(name[, mode[, buffering[,encoding]]])
name : 一個包含了你要訪問的文件名稱的字符串值(區(qū)分絕對路徑和相對路徑)。
mode : mode決定了打開文件的模式:只讀古劲,寫入,追加等闷堡。所有可取值見如下的完全列表纵势。這個參數(shù)是非強制的吨悍,默認文件訪問模式為只讀(r)。
buffering : 如果 buffering 的值被設(shè)為 0躏仇,就不會有寄存恋脚。如果
buffering 的值取 1,訪問文件時會寄存行焰手。如果將 buffering 的值設(shè)為大于 1的整數(shù)糟描,表明了這就是的寄存區(qū)的緩沖大小。如果取負值书妻,寄存區(qū)的緩沖大小則為系統(tǒng)默認船响。
關(guān)閉文件:文件對象.close()
文件讀寫:文件對象.?read(num)
read(num)可以讀取文件里面的內(nèi)容。num表示要從文件中讀取的數(shù)據(jù)的長度(單位是字節(jié))篷帅,如果沒有傳入num,那么就表示讀取文件中所有的數(shù)據(jù)
代碼:????????file1=open('Test.txt','rw')#創(chuàng)建文件對象
? ? ? ? ? ? ? ? ? ?content = file1.read()??
? ?????????????????file1.close()#關(guān)閉文件
逐行讀取文件readlines:可以按照行的方式把整個文件中的內(nèi)容進行一次性讀取卓囚,并且返回的是一個列表,其中每一行的數(shù)據(jù)為一個元素
【注】讀取文本文件時,Python將其中的所有文本都解讀為字符串次坡。如果你讀取的是數(shù)字摊腋,并
要將其作為數(shù)值使用,就必須使用函數(shù)int()將其轉(zhuǎn)換為整數(shù)茴肥,或使用函數(shù)float()將其轉(zhuǎn)
換為浮點數(shù)
往文件寫入write
with open(filename,'w') as file_object:
????????????file_object.write("I loveprogramming.")
如果你要寫入的文件不存在胜宇,函數(shù)open()將自動創(chuàng)建它。
我們使用文件對象的方法write()將一個字符串寫入文件.這個程序是沒有終端輸出
函數(shù)write()不會在你寫入的文本末尾添加換行符,需要手動添加\n
【注】Python只能將字符串寫入文本文件。要將數(shù)值數(shù)據(jù)存儲到文本文件中羡铲,必須先使用函數(shù)
str()將其轉(zhuǎn)換為字符串格式。
文件讀寫操作常用函數(shù)
上訴是讀寫操作常用函數(shù)
with…open
關(guān)鍵字with在不再需要訪問文件后將其關(guān)閉。這可讓Python去確定:你只管打開文件滨嘱,并在需要時使用它熊锭,Python自會在合適的時候自動將其關(guān)閉毒涧。也可以調(diào)用open()和close()來打開和關(guān)閉文件,但這樣做時捡偏,如果程序存在bug,導(dǎo)致close()語句未執(zhí)行贮缅,文件將不會關(guān)閉
文件訪問模式
39挂捅、異常處理
異常是指在程序執(zhí)行過程中發(fā)生的一個事件,會影響程序的正常運行堂湖,所以一般需要進行捕獲異常并處理闲先。
異常的捕獲使用try/except/finally語句進行捕獲操作,并告訴python發(fā)生異常時怎么辦.
try:
???<語句>
except <異常類型1>[, 異常參數(shù)名1]:
???<異常處理代碼1>
except <異常類型2>[, 異常參數(shù)名2]:
???<異常處理代碼2>
else:
???<沒有異常時候的處理代碼>
finally:
???<不管是否有異常状土,最終執(zhí)行的代碼塊>
常見異常
【注】
try語句按照如下方式工作:
(1)首先,執(zhí)行try子句(在關(guān)鍵字try和關(guān)鍵字except之間的語句)
(2)如果沒有異常發(fā)生饵蒂,忽略except子句声诸,try子句執(zhí)行后結(jié)束。
(3)如果在執(zhí)行try子句的過程中發(fā)生了異常退盯,那么try子句余下的部分將被忽略彼乌。如果異常的類型和except 之后的名稱相符,那么對應(yīng)的except子句將被執(zhí)行渊迁。最后執(zhí)行 try語句之后的代碼慰照。
(4)如果一個異常沒有與任何的except匹配,那么這個異常將會傳遞給上層的try中琉朽。
(5)一個 try 語句可能包含多個except子句毒租,分別來處理不同的特定的異常。
(6)多只有一個分支會被執(zhí)行箱叁。處理程序?qū)⒅会槍?yīng)的try子句中的異常進行處理墅垮,而不是其他的 try的處理程序中的異常。
(7).一個except子句可以同時處理多個異常耕漱,這些異常將被放在一個括號里成為一個元組
40算色、OS模塊
Python的os模塊包含普遍的操作系統(tǒng)功能,并且與具體的平臺無關(guān)螟够。
常見函數(shù)與用法