Python進(jìn)階之高級(jí)用法詳細(xì)總結(jié)
一、Lambda表達(dá)式
Lambda表達(dá)式又被稱之為匿名函數(shù)
格式
lambda 參數(shù)列表:函數(shù)體
def add(x,y): return x+y print(add(3,4)) #上面的函數(shù)可以寫成Lambda函數(shù) add_lambda=lambda x,y:x+y add_lambda(3,4)
二、map函數(shù)
函數(shù)就是有輸入和輸出,map的輸入和輸出對(duì)應(yīng)關(guān)系如下圖所示:
就是要把一個(gè)可迭代的對(duì)象按某個(gè)規(guī)則映射到新的對(duì)象上。
因此map函數(shù)要有兩個(gè)參數(shù),一個(gè)是映射規(guī)則,一個(gè)是可迭代對(duì)象。
list1=[1,2,3,4,5] r=map(lambda x:x+x,list) print(list1(r))
結(jié)果:[2,4,6,8,10]
m1=map(lambda x,y:x*x+y,[1,2,3,4,5],[1,2,3,4,5]) print(list(ml))
結(jié)果:[2,6,12,20,30]
三、filter函數(shù)
filter的輸入和輸出對(duì)應(yīng)關(guān)系如下圖所示:
def is_not_none(s): return s and len(s.strip())>0 list2=['','','hello','xxxx', None,'ai'] result=filter(is_not_none, list2) print(list(result))
結(jié)果:[‘hello',‘xxxx',‘a(chǎn)i']
四、reduce函數(shù)
from functools import reduce f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5]) print(r)
結(jié)果:15=1+2+3+4+5
相當(dāng)于每一次計(jì)算都是基于前一次計(jì)算的結(jié)果:
還可以為reduce計(jì)算添加初始值:
from functools import reduce f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5],10) print(r)
結(jié)果:25=10+1+2+3+4+5
五、三大推導(dǎo)式
5.1 列表推導(dǎo)式
list1=[1,2,3,4,5,6] f=map(lambda x:x+x,list1) print(list(f)) list2=[i+i for i in list1] print(list2) list3=[i**3 for i in list1] print(list3) #篩選列表的例子 list4=[i*4 for i in list1 if i>3] print(list4) #結(jié)果 [2,4,6,8,10,12] [2,4,6,8,10,12] [1,8,27,64,125,216] [16,25,36]
5.2 集合推導(dǎo)式
直接把上面代碼copy下來,然后把列表改成集合
list1={1,2,3,4,5,6} list2={i+i for i in list1} print(list2) list3={i**3 for i in list1} print(list3) #篩選列表的例子 list4={i*4 for i in list1 if i>3} print(list4) #結(jié)果 {2, 4, 6, 8, 10, 12} {64, 1, 8, 216, 27, 125}#這里是亂序的 {16, 24, 20}
5.3 字典推導(dǎo)式
s={ "zhangsan":20, "lisi":15, "wangwu":31 } #拿出所有的key,并變成列表 s_key=[ key for key, value in s.items()] print(s_key) #結(jié)果 ['zhangsan','lisi','wangwu'] # 交換key和value位置,注意冒號(hào)的位置 s1={ value: key for key, value in s.items()} print(s1) #結(jié)果 {20:'zhangsan',15:'1isi',31:'wangwu'} s2={ key: value for key, value in s.items() if key=="1isi"} print(s2) #結(jié)果 {"lisi":15}
六、閉包
閉包:一個(gè)返回值是函數(shù)的函數(shù)
import time def runtime(): def now_time(): print(time.time()) return now_time #返回值是函數(shù)名字 f=runtime()#f就被賦值為一個(gè)函數(shù)now_time()了 f()#運(yùn)行f相當(dāng)于運(yùn)行now_time()
再來看一個(gè)帶參數(shù)的例子:
假設(shè)有一個(gè)csv文件,內(nèi)容有三行,具體如下:
a,b,c,d,e
1,2,3,4,5
6,7,8,9,10
def make_filter(keep):# keep=8 def the_filter(file_name): file=open(file name)#打開文件 lines=file.readlines()#按行讀取文件 file.close()#關(guān)閉文件 filter_doc=[i for i in lines if keep in i]#過濾文件內(nèi)容 return filter_doc return the_filter filter1=make_filter("8")#這一行調(diào)用了make_filter函數(shù),且把8做為參數(shù)傳給了keep,接受了the_filter函數(shù)作為返回值 #這里的filter1等于函數(shù)the_filter filter_result=filter1("data.csv")#把文件名data.csv作為參數(shù)傳給了函數(shù)the_filter print(filter_result) #結(jié)果 ['6,7,8,9,10']
七、裝飾器、語法糖、注解
# 這是獲取函數(shù)開始運(yùn)行時(shí)間的函數(shù) import time def runtime(func): def get_time(): print(time.time()) func()# run被調(diào)用 return get_time @runtime def run() print('student run') #運(yùn)行 run() #結(jié)果 當(dāng)前時(shí)間 student run
由于有裝飾器@runtime的存在,會(huì)把run這個(gè)函數(shù)作為參數(shù)丟到runtime(func)里面去,如果調(diào)整打印時(shí)間代碼的位置會(huì)有不同結(jié)果:
# 這是獲取函數(shù)結(jié)束運(yùn)行時(shí)間的函數(shù) import time def runtime(func): def get_time(): func()# run被調(diào)用 print(time.time()) return get_time @runtime def run() print('student run') #運(yùn)行 run() #結(jié)果 student run 當(dāng)前時(shí)間
這里還要注意,這里還用到了閉包的概念,在運(yùn)行run函數(shù)的時(shí)候,調(diào)用的實(shí)際上是get_time函數(shù)。
對(duì)于多個(gè)參數(shù)的函數(shù)如何調(diào)用,看下面例子
#有一個(gè)參數(shù) import time def runtime(func): def get_time(i): func(i)# run被調(diào)用 print(time.time()) return get_time @runtime def run(i) print('student run') #運(yùn)行 run(1)
#有兩個(gè)參數(shù) import time def runtime(func): def get_time(i,j): func(i,j)# run被調(diào)用 print(time.time()) return get_time @runtime def run(i,j) print('student run') #運(yùn)行 run(1,2)
可以發(fā)現(xiàn),這樣寫對(duì)于函數(shù)的多態(tài)不是很好,因此可以寫為:
#自動(dòng)適配參數(shù) import time def runtime(func): def get_time(*arg): func(*arg)# run被調(diào)用 print(time.time()) return get_time @runtime def run(i) print('student1 run') @runtime def run(i,j) print('student2 run') #運(yùn)行 run(1) run(1,2)
再次進(jìn)行擴(kuò)展,更為普適的寫法,可以解決傳入類似i=4的關(guān)鍵字參數(shù)寫法:
#自動(dòng)適配參數(shù) import time def runtime(func): def get_time(*arg,**kwarg): func(*arg,**kwarg)# run被調(diào)用 print(time.time()) return get_time @runtime def run(i) print('student1 run') @runtime def run(*arg,**kwarg) print('student2 run') @runtime def run() print('no param run') #運(yùn)行 run(1) run(1,2,j=4) run()
到此這篇關(guān)于Python進(jìn)階之高級(jí)用法詳細(xì)總結(jié)的文章就介紹到這了,更多相關(guān)Python高級(jí)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談對(duì)Python變量的一些認(rèn)識(shí)理解
- 教你利用Python破解ZIP或RAR文件密碼
- Python協(xié)程asyncio模塊的演變及高級(jí)用法
- python基于socketserver實(shí)現(xiàn)并發(fā),驗(yàn)證客戶端的合法性
- python3 如何使用 goto 跳轉(zhuǎn)執(zhí)行到指定代碼行
- 如何用python抓取B站數(shù)據(jù)
- python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說明
- python實(shí)現(xiàn)某考試系統(tǒng)生成word試卷
- 解讀python基于netconf協(xié)議獲取網(wǎng)元的數(shù)據(jù)
相關(guān)文章
python pytest進(jìn)階之xunit fixture詳解
這篇文章主要介紹了python pytest進(jìn)階之xunit fixture詳解,了解unittest的同學(xué)應(yīng)該知道我們?cè)诔跏蓟h(huán)境和銷毀工作時(shí),unittest使用的是setUp,tearDown方法,那么在pytest框架中同樣存在類似的方法,今天我們就來具體說明,需要的朋友可以參考下2019-06-06Python機(jī)器學(xué)習(xí)之Kmeans基礎(chǔ)算法
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)之Kmeans基礎(chǔ)算法,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04DjangoUeditor圖片不顯示img的src沒有域名問題
在使用DjangoUeditor過程中,可能遇到圖片上傳后不顯示問題,解決辦法是修改源碼view.py,加入代碼使得保存的圖片URL帶有協(xié)議和域名,具體做法是在保存圖片代碼中添加request.scheme獲取協(xié)議,request.META['HTTP_HOST']獲取域名2024-09-09Python實(shí)現(xiàn)列表刪除重復(fù)元素的三種常用方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)列表刪除重復(fù)元素的三種常用方法,結(jié)合實(shí)例形式對(duì)比分析了Python針對(duì)列表元素的遍歷、判斷、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11