python學(xué)習(xí)筆記
1蒋搜、基礎(chǔ)知識
數(shù)據(jù)類型:integer(int) string (str) float (浮點數(shù)) long? list? dictionary? ? ? tuple? set boolean
變量=定義的變量可以不確定變量類型,只有使用的時候,才會確定變量類型(java 不同)
命名規(guī)范:1叠国、不能使用數(shù)字開頭,2蔓姚、不能過長(一般可以根據(jù)內(nèi)存長度確定惕耕,所以無限制) 3、不能包含除——之外的特殊字符
4蜜自、應(yīng)該有意義(方便閱讀) 5菩貌、用下劃線分割多個單詞的命名(可讀性,不強(qiáng)制) 6重荠、一般變量名全部小寫箭阶,作為常量使用時,才全部大寫
7戈鲁、避免使用小寫的l和大寫 的o(可讀性要求仇参,不強(qiáng)制)
運算符:
支持加法、減法婆殿、乘法诈乒、除法、取反婆芦、絕對值怕磨、求冪(math方法有其他運算)
運算的優(yōu)先級(按照數(shù)學(xué)元算進(jìn)行)
邏輯
1、if else? ? 真假的判斷:integer 如果值為0消约,float值為0.0 long的值為0肠鲫,string的值為"",list的值為[],dictionary的值為{}或粮,tuple的值為()則為False,其余為真
2导饲、循環(huán) for? while
range()函數(shù),生成數(shù)字氯材。range(10)-----生成 [0,1,2,3,4,5,6,7,8,9]
range(1,4)--- 生成[1,2,3]
range(1,6,2)--生成[1,3,5]
for 循環(huán)? for i in range(3):
語句:
遍歷列表? for cat in cats:
語句:
繼續(xù)執(zhí)行下一個遍歷? continue? ? 退出循環(huán)? break 渣锦;
for語句在執(zhí)行完遍歷之后。變量的值為最后一次遍歷的值氢哮。
while 條件:
語句
無限循環(huán)需要在合適的位置設(shè)置break語句泡挺,不然,程序會一直執(zhí)行下去命浴;
3娄猫、順序--------
字符串的使用
1贱除、打印:print 語句會自動換行媳溺,如果不想換行月幌,則在print語句結(jié)束時,輸入","就不會換行了
2悬蔽、string的方法 len()---自符串長度函數(shù)? ? str.upper-------把所有字母轉(zhuǎn)換成大寫扯躺;str.lower----全部小寫
str.capitalize()? 字符串首字母大寫,其余小寫? str.title()----首字母以及每個空格或者標(biāo)點符號后的字母轉(zhuǎn)換成大寫蝎困,其他字母小寫
str.is_alpha()-------------檢查字符串是否全部有字母組成录语,str.is_digit()------檢查字符串是否全部有數(shù)字組成
str.strip() 去掉字符串中開頭或者結(jié)尾的某個值(沒有參數(shù)則為空格,有參數(shù)則為該參數(shù))
相同的方法---str.rstrip()---刪除末尾的某個值? ? str.lstrip()------刪除開頭的某個值
字符串 的加法和乘法 支持禾乘,不支持除法和減法
str.count("x")---查找字符串中某個字符出現(xiàn)的次數(shù)
str.find("x")-----查找字符串中某個字符第一次出現(xiàn)的位置(沒有該字符則返回-1)
str.replace("x","x1")---------用x1代替字符串中出現(xiàn)的所有的x
type(x)-----查看x的數(shù)據(jù)類型
獲取輸入和處理輸出
獲取輸入:input()--------? ? 用于收集信息澎埠,用戶輸入的任何內(nèi)容都將按照實際內(nèi)容保存,比如輸入5始藕,則為int蒲稳,
輸入5.0 ,則保存為浮點數(shù)伍派,輸入"你好"江耀,則保存為string型,不能保存沒有用""括住的字符串
raw_input()----收集任何非數(shù)字的信息,例如輸入5 則保存為str("5");
密碼的輸入使用getpass模塊? ? ? f=getpass()? 會自動隱藏輸入
使用format()函數(shù)或者%來格式化輸出? 例子
print("你好诉植,s%",%())
print("你好{},你多大了".format("李敏"))
list(列表)
含義:一系列事務(wù)的組合
1祥国、創(chuàng)建列表? list=[](空列表)
2、列表的第一項編號是0晾腔,及l(fā)ist[0]
方法:len(list)
list.count("value")列表中某個值的出現(xiàn)次數(shù)
list.index("value")列表中某個值的在淚飆中第一次出現(xiàn)的索引位置系宫,如果沒有該列表,則返回錯誤建车;
value in list :某個值是否在列表中
以下方法會改變列表的內(nèi)容:
list.append("value"):添加某個值到列表末尾
list.extend(list1):添加某個list到另一個list的末尾? 支持"+"加法,列表支持乘法:list*n
list[index]='value':修改某個值
list.remove("value"):刪除某個值,其他項向前移動一位,沒有則報錯
list.insert(index,"value"):在指定位置添加一個列表項--該方法效率較低
list.reverse()--反轉(zhuǎn)列表
list.sort()----按照字母順序或者按照數(shù)字升序排列列表? https://www.cnblogs.com/sunny3312/archive/2017/01/07/6260472.html
list1==list2 :比較列表椒惨,如果完全相同缤至,則為True,如果不完全相同則為False
切片操作:
[start:end:step]--start 其實索引康谆,從0開始领斥,-1結(jié)束? end ---結(jié)束索引? step---步長,為正沃暗,從左向右取值月洛,為負(fù),反向取值
切片的結(jié)果不包含結(jié)束索引的值
如下變種:[::]====默認(rèn)所有
[:]===省略全部孽锥,所有值
[:3]===省略起始位置索引以及步長嚼黔。取從開始到第三個的值
[::-1]===步長為1细层,從右向左取值』=В可以認(rèn)為是反轉(zhuǎn)原列表
list()函數(shù)====可以把tuple()或者list轉(zhuǎn)換成list? 實例:list((1,2))====[1,2];list([1,2])====[1,2]
函數(shù):
創(chuàng)建函數(shù):格式:def function_name(parameter1,parameter2):
code
code
return==================該語句是調(diào)用函數(shù)后會返回的值疫赎,如果缺少,返回值為null
函數(shù)的調(diào)用? :function_name();? 如果直接輸入函數(shù)的名稱碎节,實際得到的是函數(shù)的內(nèi)存地址
函數(shù)可以設(shè)置別名捧搞,比如 abs函數(shù)可以設(shè)置為a=abs,a(-1)=>>>1;
參數(shù)的類別:默認(rèn)參數(shù)====調(diào)用函數(shù)時可以不用傳值的參數(shù),默認(rèn)參數(shù)必須在必選參數(shù)之后狮荔,不然函數(shù)不知道默認(rèn)值是哪個參數(shù)的胎撇;
默認(rèn)參數(shù)有多個時,調(diào)用函數(shù)會按照函數(shù)定義的順序進(jìn)行殖氏,也可以根據(jù)參數(shù)名=值 來進(jìn)行判斷
需要注意的一點:默認(rèn)參數(shù)必須指向不變對象晚树!不然會出現(xiàn)默認(rèn)值改變的現(xiàn)象
可變參數(shù)====參數(shù)數(shù)量不固定,定義格式? def function_name(*params):
語句受葛;
實例:
def calc(*number):
sum=0
for n in number:
sum=sum+n;
return sum
print calc(1)? #>>>>1
print calc(1,3,4)#>>>>8
list=[1,2,3,4]
#print calc(list)? >>>>unsupported operand type(s) for +: 'int' and 'list'
print calc(*list) #>>>>10
print calc(list[0],list[1],list[2],list[3]) #>>>>10
tuple=(2,3,4,5)
#print calc(tuple) #>>>>unsupported operand type(s) for +: 'int' and 'tuple'
print calc(*tuple) # >>>14
關(guān)鍵字參數(shù)====可變參數(shù)允許你傳入0個或任意個參數(shù)题涨,這些可變參數(shù)在函數(shù)調(diào)用時自動組裝為一個tuple。
而關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù)总滩,這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict
定義格式:def person(name, age, **kw):
語句:
調(diào)用:person("Name","age"纲堵,city="北京");
或者person("Name"闰渔,"age",**dict)====dict={"city":"beijing","grade"}
**extra表示把extra這個dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kw參數(shù)席函,kw將獲得一個dict,
注意kw獲得的dict是extra的一份拷貝冈涧,對kw的改動不會影響到函數(shù)外的extra
命名關(guān)鍵字參數(shù)==對于關(guān)鍵字參數(shù)茂附,函數(shù)的調(diào)用者可以傳入任意不受限制的關(guān)鍵字參數(shù)。
至于到底傳入了哪些督弓,就需要在函數(shù)內(nèi)部通過kw檢查营曼。
如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù)愚隧,例如蒂阱,只接收city和job作為關(guān)鍵字參數(shù)。這種方式定義的函數(shù)如下:
實例:
def person(name, age, *, city, job):
print(name, age, city, job)
和關(guān)鍵字參數(shù)**kw不同狂塘,命名關(guān)鍵字參數(shù)需要一個特殊分隔符*录煤,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名荞胡,這和位置參數(shù)不同妈踊。
如果沒有傳入?yún)?shù)名,調(diào)用將報錯:TypeError: person() takes 2 positional arguments but 4 were given
如果函數(shù)定義中已經(jīng)有了一個可變參數(shù)泪漂,后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔符*了:
實例:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
使用命名關(guān)鍵字參數(shù)時廊营,要特別注意歪泳,如果沒有可變參數(shù),就必須加一個*作為特殊分隔符赘风。
如果缺少*夹囚,Python解釋器將無法識別位置參數(shù)和命名關(guān)鍵字參數(shù)
參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)邀窃、可變參數(shù)荸哟、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
函數(shù)定義中瞬捕,如果沒有return則調(diào)用函數(shù)時鞍历,會返回NOne。
實例:
def product(*args):
sum=1
if len(args)>0:
for arg in args:
sum=sum*arg
return sum
else:
return ("請輸入至少一個參數(shù)")
print(product(1,3,4))
print (product(*(2,3,4)))
print(product(4))
print(product())
高階函數(shù):
1肪虎、變量可以指向函數(shù)====例子:f=abs>>>>f(-10)=>>>10
2劣砍、函數(shù)名可以是變量 ===例子? abs=10>>>>abs(-10)>>>>typeError: 把a(bǔ)bs指向10后,就無法通過abs(-10)調(diào)用該函數(shù)了扇救!因為abs這個變量已經(jīng)不指向求絕對值函數(shù)而是指向一個整數(shù)10
定義:一個函數(shù)就可以接收另一個函數(shù)作為參數(shù)刑枝,這種函數(shù)就稱之為高階函數(shù);函數(shù)式編程就是指這種高度抽象的編程范式迅腔。
內(nèi)建高階函數(shù):
1装畅、map()====map()函數(shù)接收兩個參數(shù),一個是函數(shù)沧烈,一個是Iterable掠兄,
map將傳入的函數(shù)依次作用到序列的每個元素,并把結(jié)果作為新的Iterator返回锌雀。
實例:def f(x):
return x*x
list=[1,2,3,4,5,6]
list2=map(f,list) #f指的是函數(shù)對象本身蚂夕,如果使用f(x),則會報錯:x 未定義;
print list2
2腋逆、reduce()====reduce()函數(shù)把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上婿牍,這個函數(shù)必須接收兩個參數(shù),
reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算惩歉;例如 加法和累乘等脂;
實例:def chr2int(s):
return {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}[s]
def fn(x,y):
return 10*x+y
def str2int(s):
return reduce(fn,map(chr2int,s))
print (str2int("13456"))#>>>>13456(int類型的)
3、filter()=====filter()函數(shù)也接收一個函數(shù)和一個序列柬泽。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個元素嫁蛇,
然后根據(jù)返回值是True還是False決定保留還是丟棄該元素锨并。過濾函數(shù)。
實例:def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', '? ']))=====和filter(not_empty,['A',"",'B',None,'C',' '])沒有區(qū)別
#注釋布爾"與" - 如果 x 為 False睬棚,x and y 返回 False第煮,否則它返回 y 的計算值解幼。
#filter()函數(shù)返回的是一個Iterator,所以需要使用list()函數(shù)(是一個轉(zhuǎn)換函數(shù),而不是list[])
完成計算并獲取結(jié)果包警;https://www.cnblogs.com/spiritman/p/5158331.html迭代器的使用及特點撵摆。http://blog.csdn.net/u012671171/article/details/42169843 yield的講解;
4害晦、sorted()=====sorted()函數(shù)接受一個序列和key函數(shù)特铝,返回按照規(guī)則的排序;
sorted()函數(shù)也是一個高階函數(shù),它還可以接收一個key函數(shù)來實現(xiàn)自定義的排序;
ey指定的函數(shù)將作用于list的每一個元素上壹瘟,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序.如果反轉(zhuǎn)鲫剿,只要reverse=True 即可;
sorted()也是一個高階函數(shù)稻轨。用sorted()排序的關(guān)鍵在于實現(xiàn)一個映射函數(shù)灵莲。
實例:>>> sorted([36, 5, -12, 9, -21], key=abs)
>>>[5, 9, -12, -21, 36]
異常處理:
第一種異常邏輯
try:
語句
except 錯誤名:
語句
except 錯誤名:
語句
else:
語句
流程:先執(zhí)行 try 語句,如果出現(xiàn)了異常殴俱,則判斷異常的類型政冻,執(zhí)行相應(yīng)的except (不再執(zhí)行else語句了),如果沒有則拋出異常线欲,停止執(zhí)行程序明场,如果沒有異常,
則執(zhí)行else語句询筏;
在except的錯誤語句中古拴,需要把范圍小的放在前面,范圍大的放在后面飞主,才會有效果誉察,不然,后面的錯誤類型一直不會執(zhí)行到踱讨;
變種:except可以不帶錯誤名魏蔗,只有語句,或者錯誤名可以是多個(Exception1[, Exception2[,...ExceptionN]]])均可
第二種異常邏輯:
try:
語句
finally:
語句
不管try語句是否執(zhí)行痹筛,都會執(zhí)行finally語句
實例:
def f():
try:
print 1
return 1
except:
return 2
else:
print 3
return 3
finally:
print 0
#return 0
執(zhí)行結(jié)果:結(jié)果為 1 0 1
說明try里面運行完之后return莺治,阻擋了else的執(zhí)行,但是并沒有影響finally的執(zhí)行帚稠。
借用Vamer文章的兩句話:
“如果try中沒有異常谣旁,那么except部分將跳過,執(zhí)行else中的語句滋早,但是如果try中有return榄审,則結(jié)束運行。
finally是無論是否有異常杆麸,最后都要做的一些事情搁进±烁校”
這里補(bǔ)充一句,在含有return的情況下饼问,并不會阻礙finally的執(zhí)行影兽。
第三種處理方式:
使用raise 觸發(fā)異常