函式進階
遞回函式
定義一個函式在函式的內部呼叫自身,如果不設定遞回邊界,將死回圈無限呼叫知道被pycharm等ide觀測到拋出例外終止
案例1:
def fun(): if n == 0: return n else: return n*fun(n-1) # 在當前函式中,就是當n=0的時候停止呼叫自身
純函式
純函式的概念,簡單來說,一個函式的回傳結果只依賴于它的引數,并且在執行程序里面沒有副作用(副作用請看到后面),就吧這個函式叫做純函式.
不管在什么時候呼叫,傳入的引數相同,回傳的結果就一定是一樣的.
純函式的三原則
- 變數都只在函式作用域內獲取,作為函式的引數傳入
- 不會產生副作用,不會改變被傳入的資料或者其他資料(全域變數)
- 相同的輸入保證相同的輸出
函式的副作用
副作用指函式被呼叫,完成函式既定的運算任務,但因為訪問了外部資料,尤其是因為對外部資料進行了操作,從而一定程度的改變了系統環境.
內置函式都是純函式,內置函式一般都是python中的內置類.
常用的內置函式 map函式,會根據提供的函式對指定序列做映射,filter函式,用于過濾序列
內置函式三劍客
filter
接收兩個引數,原始碼記述中其本質為一個python類
第一個引數為含有計算規則的函式,第二個為可迭代物件.
案例1
def fun(): # return true return n < 5 li =[1,2,3,4,5,6,7,8] fil = filter(fun,li) # 兩個引數,第一個為函式,第二個為可迭代物件 # 執行邏輯,將可迭代物件中的元素遍歷傳入fun進行計算 print(type(fil)) # 回傳為一個filter物件 print(list(fil)) # 可以通過轉換成list直接列印出來
其回傳的即是串列li中所有滿足fun中小于5的值,且組合成一個新的序列.
map
同filter一樣,接收兩個引數,直接回傳的是一個map物件.
filter會根據回傳值判斷是否將值放入新的序列中,map則會直接將回傳值拿過來,相當于將可迭代物件便利傳入func中并取到func運行之后的回傳值.
使用場景常常為需要統一處理一批資料的時候.
案例2
li_source = [ i for in range(1,20)] def func(n): # 寫一個生成斐波那契數列的map函式方法 if n==1 or b==2 : return 1 else : return func(n-1) + func(n-2) fib = map(func,li_source) # 執行邏輯即是,便利li_source將其中元素迭代傳入func,按照其內部邏輯執行并回傳
zip
主要用來打包資料,接收資料與前兩者不同,可以接收多個可迭代物件.
吧第一個可迭代元素遍歷與第二個可迭代物件打包成元組.
之后強轉為dict可以生成字典. 這種處理方式經常用來操作測驗用例資料
長短不一的時候會自動取最短的,舍棄多余項
匿名函式
匿名函式一種特殊的函式,不用def去定義,也不用給函式起名字,通過lambda運算式來定義.
這種函式稱為匿名函式
寫法 : lambda 引數 : 運算式 (回傳值)
ex: lambda var : var1 *2
lambda a,b: a+b
前面相當于兩個沒有函式的引數,冒號后面相當于return,那么如何傳引數呢?
匿名函式的適用場景 : 簡單的函式定義(只有一個運算式的那種)
我們按照傳統函式的思路來寫個傳參呼叫,
lamdba a,b : a+b(1,2)
但是匿名函式是不能按照傳統引數那樣直接在函式后添加()進行呼叫.
按照上面的寫法,會將()中的內容也當作運算式的一部分,并不會被當成是引數
解決方式是(lambda a,b:a+b)(引數1,引數2),通過()將函式體與引數分割開來即可,
匿名函式實戰的常規寫法,lambda是直接呼叫,直接使用,用完就丟,釋放記憶體,用變數去保存反而會浪費一塊記憶體去保存.
實體
iterator = filter(lambda x: x<10 ,li) # 所以lambda常常和filter,map一起使用, # 直接使用,用完就丟掉 print(list(iteraotr)) # 串列推導式中也可以使用 li2 = [(lambda x: x % 2==0)(i) for i in range(10)] # 其執行邏輯是,for回圈遍歷出i的值為1-10,然后i作為引數傳入前面的匿名函式,最終生成值形成新串列
三目運算子
三木運算子,適用于一個條件判斷,成立,做A,不成立,做B
python版本的語法支持為
為真的時候的結果 if 判斷條件 else 為假的時候的結果 ( 與其他語言不同的地方是沒有冒號
寫起來會有中寫英語的感覺.
偏函式
什么是偏函式呢?
python的內置模塊functools中提供了很多有用的功能,其中一個就是偏函式 partial
偏函式的作用
當函式的引數個數太多,需要進行簡化的時候,使用functools.partial可以創建一個新的函式,這個函式可以固定住原函式的部分引數,從而簡化呼叫時的使用.
在感覺上接近于對函式的在封裝,方便進行呼叫
partial()是不定長引數,可以封裝很多東西進去,函式寫第一位,后面則是引數位
上實體
li =[1,2,3,4,5,6,7,8,9] li1 =[1,2,3,4,5,6,7,8,9] li2 =[1,2,3,4,5,6,7,8,9] li3 =[1,2,3,4,5,6,7,8,9] li4 =[1,2,3,4,5,6,7,8,9] li5 =[1,2,3,4,5,6,7,8,9] # 有以上這么多串列等待處理. # 需求為 ,需要過濾掉小于5的元素 filter(lambda x:x<5,li) # 通過filter的方法處理資料,取滿足條件的資料組成新的序列 # 但是如此多的串列,如果要寫的話會出現很多冗余代碼,此時使用偏函式方法就很合適了 from functools import partial p = partial(filter,lambda x:x<5) # 之后呼叫 p(li) # 就可以簡單的呼叫了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/117835.html
標籤:Python
上一篇:700行代碼, 用python實作一個HTTP客戶端
下一篇:python 內置裝飾器,魔法
