【Python基础】Python 函数使用总结
我的施工之路
目前已完成,以下五期Python專題總結:
1我的施工計劃
2數字專題
3字符串專題
4列表專題
5流程控制專題
6編程風格專題
今天是Python函數專題,目錄結構:
Python 函數專題
基礎部分
1 函數組成
2 引用傳參
3 默認參數與關鍵字參數
4 可變參數
5 內置函數
進階部分
6 偏函數
7 遞歸函數
8 匿名函數
9 高階函數
10 嵌套函數
總結
Python 函數專題
函數是一個接受輸入、進行特定計算并產生輸出的語句集。
我們把一些經常或反復被使用的任務放在一起,創建一個函數,而不是為不同的輸入反復編寫相同的代碼。
Python提供了print、sorted、max、map等內置函數,但我們也可以創建自己的函數,稱為用戶定義函數。
基礎部分
1 函數組成
如下自定義函數:
def?foo(nums):"""?返回偶數序列"""evens?=?[]for?num?in?nums:if?num%2==0:evens.append(num)return?evens可以看到函數主要組成部分:
函數名:foo
函數形參:nums
:: 函數體的控制字符,作用類似Java或C++的一對{}
縮進:一般為4個字符
""":為函數添加注釋
return: 函數返回值
以上函數求出列表nums中的所有偶數并返回,通過它了解Python函數的主要組成部分。
2 引用傳參
定義好一個函數后,使用:函數名+()+實參,調用函數,如下方法:
foo([10,2,5,4])其中[10,2,5,4]為實參,它通過by reference方式傳給形參nums,即nums指向列表頭,而不是重新復制一個列表給nums.
再看一個引用的例子:
def?myFun(x):?x[0]?=?20如下調用:
lst?=?[10,?11,?12,?13,?14,?15]? myFun(lst)實參lst和形參x都指向同一個列表:
因此,對x[0]修改實際就是對實參lst的修改,結果如下:
但是,有時在函數內部形參指向改變,因此實參與形參的指向分離,如下例子:
def?myFun(x):??x?=?[20,?30,?40]x[0]?=?0調用:
lst?=?[10,?11,?12,?13,?14,?15]? myFun(lst)x 被傳參后初始指向lst,如下所示:
但是,執行x = [20, 30, 40]后,對象x重新指向一個新的列表對象[20,30,40]:
因此,對于x內元素的任何修改,都不會同時影響到lst,因為指向已經分離。
3 默認參數與關鍵字參數
Python函數的參數,可以有初始默認值,在調用時如果不賦值,則取值為默認值,如下例子:
def?foo(length,width,height=1.0):return?length*width*height調用foo函數,沒有為height傳參,所以取為默認值1.0:
r?=?foo(1.2,2.0) print(r)?#?2.4使用默認值有一點需要區分,有的朋友會與關鍵字參數混淆,因為它們都是para=value的結構,但是有一個很明顯的不同:默認值是聲明在函數定義時,關鍵字參數是在函數調用時使用的此結構。如下例子:
def?foo(length,width,height=1.0):?#?height是默認參數return?length*width*heightfoo(width=2.0,length=1.2)?#確定這種調用后才確定width和length是關鍵字參數確定以上調用后,才確定width和length是關鍵字參數,并且關鍵字參數不必按照形參表的順序調用。
4 可變參數
Java和C++在解決同一個函數但參數個數不同時,會使用函數重載的方法。Python使用可變參數的方法,非常靈活。
可變參數是指形參前帶有*的變量,如下所示:
def?foo(length,*others):s?=?lengthfor?para?in?others:s?*=?parareturn?s我們可以像下面這樣方便的調用:
foo(1.2,2.0,1.0)?#?2.4如上,帶一個星號的參數被傳參后,實際被解釋為元組對象。我們還可以這樣調用:
foo(1.2)?#?1.25 內置函數
總結完函數的參數后,再舉幾個Python內置的常用函數。
pow
大部分朋友應該知道pow是個冪次函數,比如求:
pow(2,3)?除此以外,pow還有第三個參數,使用更高效的算法實現求冪后再求余數:
pow(2,3,5)?#?3max,min
max,min用來求解最大最小值,實現relu函數:
def?relu(x):return?max(x,0)sorted
sorted函數完成對象排序,它能接收一個指定排序規則的函數,完成定制排序。如下,根據字典值絕對值從小到大排序:
d?=?{'a':0,'b':-2,'c':1} dr?=?sorted(d.items(),key=lambda?x:abs(x[1]))? print(dr)?#?[('a',?0),?('c',?1),?('b',?-2)]進階部分
Python有一個專門操作函數的模塊:functools,能實現一些關于函數的特殊操作。
6 偏函數
偏函數固定函數的某些參數后,重新生成一個新的函數。
通常用法,當函數的參數個數太多,需要簡化時,使用partial創建一個新的函數。
假設我們要經常調用int函數轉換二進制字符,設置參數base為2:
int('1010',base=2)為了避免每次都寫一個參數base,我們重新定義一個函數:
def?int2(s):return?int(s,base=2)以后每次轉化字符串時,只需int2('1010)即可,更加簡便。
偏函數也能實現上述功能:
from?functools?import?partialintp?=?partial(int,base=2)?那么有的朋友會問,偏函數就是個雞肋,重新定義的int2更加直觀容易理解,這個角度講確實是這樣。但是int2不能再接收base參數,但是intp函數還是能接收base參數,依然保留了原來的參數:
intp('10',base=16)?#?16可能看到這里的讀者還是有些迷糊,不太確定怎么使用偏函數。可以先記住:修改內置函數的默認參數,就像內置函數int默認參數base等于10,使用偏函數調整默認base值為2.
7 遞歸函數
遞歸函數是指調用自身的函數。如下使用遞歸反轉字符串:
def?reverseStr(s):?if?not?s:return?s?return?reverseStr(s[1:])+s[0]print(reverseStr('nohtyp'))?#?pythonreverseStr函數里面又調用了函數reverseStr,所以它是遞歸函數。
使用遞歸函數需要注意找到正確的遞歸基,防止陷入無限遞歸。
更多使用遞歸的例子大家可參考此公眾號之前推送。
8 匿名函數
匿名函數是指使用lambda關鍵字創建的函數。它的標準結構如下:
lambda?形參列表:?含有形參列表的表達式表達式的計算值即為lambda函數的返回值。
如下lambda函數:
lambda?x,y:?x+y它等價于下面的f函數:
def?f(x,y):return?x+ylambda函數常做為max,sorted,map,filter等函數的key參數。
9 高階函數
可以用來接收另一個函數作為參數的函數叫做高階函數。
如下f有一個參數g,而g又是函數,所以f是高階函數:
def?f(g):g()Python 中經常會遇到高階函數,今天介紹幾個內置的常用的高階函數。
map
map 函數第一個參數為函數,它作用于列表中每個的元素。
如下,列表中的單詞未按照首字母大寫其他字符小寫的規則,使用map一一capitalize每個元素:
m?=?map(lambda?s:?s.capitalize(),?['python','Very','BEAUTIFUL']) print(list(m))結果:
['Python',?'Very',?'Beautiful']reduce
reduce 高階函數實現化簡列表,它實現的效果如下:
如下例子,函數f等于x+y,求得兩數之和,然后再與第三個數相加,依次下去,直到列表尾部,進而得到整個列表的和:
from?functools?import?reduce?def?f(x,y):return?x+yr?=?reduce(f,?[1,3,2,4]) print(r)?#?10以上reduce求解過程等于:
需要注意:reduce函數要求f必須帶2個參數,只有這樣才能完成歸約化簡。
10 嵌套函數
嵌套函數是指里面再嵌套函數的函數。
如下例子,將列表轉化為二叉樹。已知列表nums,
nums = [3,9,20,None,None,15,7],轉化為下面二叉樹:
二叉樹定義:
class?TreeNode:def?__init__(self,?x):self.val?=?xself.left?=?Noneself.right?=?None構建滿足以上結構的二叉樹,可以觀察到:樹的父節點和左右子節點的關系:
基于以上公式,再使用遞歸構建二叉樹。
遞歸基情況:
if?index?>=?len(nums)?or?nums[index]?is?None:return?None遞歸方程:
根據以上分析,得到如下代碼,list_to_binarytree函數是嵌套函數,它里面還有一個level子函數:
def?list_to_binarytree(nums):def?level(index):if?index?>=?len(nums)?or?nums[index]?is?None:return?Noneroot?=?TreeNode(nums[index])root.left?=?level(2?*?index?+?1)root.right?=?level(2?*?index?+?2)return?rootreturn?level(0)binary_tree?=?list_to_binarytree([3,9,20,None,None,15,7])通常使用嵌套函數的場景:實現一個功能只需要編寫2個函數,寫成一個class好像顯得有些不必要,寫成嵌套后更簡潔,并且某些參數能共享,親和性會更好。不妨體會上面的nums參數。
總結
函數專題主要總結了以下:
Python 函數專題
基礎部分
1 函數組成
2 引用傳參
3 默認參數與關鍵字參數
4 可變參數
5 內置函數
進階部分
6 偏函數
7 遞歸函數
8 匿名函數
9 高階函數
10 嵌套函數
總結
《end》
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群:總結
以上是生活随笔為你收集整理的【Python基础】Python 函数使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 影响程序员薪资的,从来不止是学历!
- 下一篇: 【NLP】利用jieba对网易云音乐的评