Python進階之高級用法詳細總結
一、Lambda表達式
Lambda表達式又被稱之為匿名函數
格式
lambda 參數列表:函數體
def add(x,y): return x+y print(add(3,4)) #上面的函數可以寫成Lambda函數 add_lambda=lambda x,y:x+y add_lambda(3,4)
二、map函數
函數就是有輸入和輸出,map的輸入和輸出對應關系如下圖所示:
就是要把一個可迭代的對象按某個規則映射到新的對象上。
因此map函數要有兩個參數,一個是映射規則,一個是可迭代對象。
list1=[1,2,3,4,5] r=map(lambda x:x+x,list) print(list1(r))
結果:[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))
結果:[2,6,12,20,30]
三、filter函數
filter的輸入和輸出對應關系如下圖所示:
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))
結果:[‘hello’,‘xxxx’,‘ai’]
四、reduce函數
from functools import reduce f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5]) print(r)
結果:15=1+2+3+4+5
相當於每一次計算都是基於前一次計算的結果:
還可以為reduce計算添加初始值:
from functools import reduce f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5],10) print(r)
結果:25=10+1+2+3+4+5
五、三大推導式
5.1 列表推導式
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) #結果 [2,4,6,8,10,12] [2,4,6,8,10,12] [1,8,27,64,125,216] [16,25,36]
5.2 集合推導式
直接把上面代碼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) #結果 {2, 4, 6, 8, 10, 12} {64, 1, 8, 216, 27, 125}#這裡是亂序的 {16, 24, 20}
5.3 字典推導式
s={ "zhangsan":20, "lisi":15, "wangwu":31 } #拿出所有的key,並變成列表 s_key=[ key for key, value in s.items()] print(s_key) #結果 ['zhangsan','lisi','wangwu'] # 交換key和value位置,註意冒號的位置 s1={ value: key for key, value in s.items()} print(s1) #結果 {20:'zhangsan',15:'1isi',31:'wangwu'} s2={ key: value for key, value in s.items() if key=="1isi"} print(s2) #結果 {"lisi":15}
六、閉包
閉包:一個返回值是函數的函數
import time def runtime(): def now_time(): print(time.time()) return now_time #返回值是函數名字 f=runtime()#f就被賦值為一個函數now_time()瞭 f()#運行f相當於運行now_time()
再來看一個帶參數的例子:
假設有一個csv文件,內容有三行,具體如下:
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()#關閉文件 filter_doc=[i for i in lines if keep in i]#過濾文件內容 return filter_doc return the_filter filter1=make_filter("8")#這一行調用瞭make_filter函數,且把8做為參數傳給瞭keep,接受瞭the_filter函數作為返回值 #這裡的filter1等於函數the_filter filter_result=filter1("data.csv")#把文件名data.csv作為參數傳給瞭函數the_filter print(filter_result) #結果 ['6,7,8,9,10']
七、裝飾器、語法糖、註解
# 這是獲取函數開始運行時間的函數 import time def runtime(func): def get_time(): print(time.time()) func()# run被調用 return get_time @runtime def run() print('student run') #運行 run() #結果 當前時間 student run
由於有裝飾器@runtime的存在,會把run這個函數作為參數丟到runtime(func)裡面去,如果調整打印時間代碼的位置會有不同結果:
# 這是獲取函數結束運行時間的函數 import time def runtime(func): def get_time(): func()# run被調用 print(time.time()) return get_time @runtime def run() print('student run') #運行 run() #結果 student run 當前時間
這裡還要註意,這裡還用到瞭閉包的概念,在運行run函數的時候,調用的實際上是get_time函數。
對於多個參數的函數如何調用,看下面例子
#有一個參數 import time def runtime(func): def get_time(i): func(i)# run被調用 print(time.time()) return get_time @runtime def run(i) print('student run') #運行 run(1)
#有兩個參數 import time def runtime(func): def get_time(i,j): func(i,j)# run被調用 print(time.time()) return get_time @runtime def run(i,j) print('student run') #運行 run(1,2)
可以發現,這樣寫對於函數的多態不是很好,因此可以寫為:
#自動適配參數 import time def runtime(func): def get_time(*arg): func(*arg)# run被調用 print(time.time()) return get_time @runtime def run(i) print('student1 run') @runtime def run(i,j) print('student2 run') #運行 run(1) run(1,2)
再次進行擴展,更為普適的寫法,可以解決傳入類似i=4的關鍵字參數寫法:
#自動適配參數 import time def runtime(func): def get_time(*arg,**kwarg): func(*arg,**kwarg)# run被調用 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') #運行 run(1) run(1,2,j=4) run()
到此這篇關於Python進階之高級用法詳細總結的文章就介紹到這瞭,更多相關Python高級用法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python數據類型最全知識總結
- python3中apply函數和lambda函數的使用詳解
- Python函數進階與文件操作詳情
- Python 入門學習之函數式編程
- Python中不可錯過的五個超有用函數