文章目錄
一、函數簡介
函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。
函數能提高應用的模塊性,和代碼的重復利用率。
Python提供了許多內建函數,比如print()。我們也可以創建函數,即用戶自定義函數。
函數的使用必須遵循“先定義,后調用”的原則。
函數的定義就相當於事先將內存地址賦值給定義的函數名,函數名就是對這段代碼的引用,這類似於變量的定義。
1.定義函數
def 函數名(參數1,參數2,...):
"""文檔描述"""
函數體
return 值
-
def: 定義函數的關鍵字;
-
函數名:函數名指向函數內存地址,是對函數體代碼的引用及功能的概述;
-
括號:括號內定義可有可無且無需指定類型的參數;
-
冒號:括號后加冒號,以便在下一行開始縮進編寫函數體的代碼;
-
文檔描述:描述函數功能,參數介紹等信息的文檔,非必要;
-
函數體:由語句和表達式組成;
-
return 值:結束函數,選擇性地返回一個值給調用方,不帶值的return相當於返回None。
2.調用函數
函數的使用分為定義階段與調用階段,定義函數時只檢測語法,不執行函數體代碼。
函數名加括號即函數調用,只有調用函數時才會執行函數體代碼。
函數的調用形式分為:語句形式、表達式形式、作為參數形式。
3.函數返回值
若需要將函數體代碼執行的結果返回給調用者,則需要用到return。
return是一個函數結束的標志,函數內可以有多個return,但只執行一次函數就結束了,並把return后定義的值作為本次調用的結果返回。
二、函數的參數
函數的參數分為形式參數和實際參數,簡稱形參和實參。
形參即在定義函數時,括號內聲明的參數。形參本質就是一個變量名,用來接收外部傳來的值。
實參即在調用函數時,括號內傳入的值,值可以是常量、變量、表達式或三者的組合。
在Python中,變量名與值只是單純的綁定關系,而對於函數來說,這種綁定關系只在函數調用時生效,在調用結束后解除。
1.位置參數
位置參數也稱必須參數,位置參數須以從左到右的順序傳入函數。調用時的數量必須和聲明時的一樣。
2.關鍵字參數
在調用函數時,實參可以是key=value的形式,稱為關鍵字參數。
凡是按照這種形式定義的實參,可以不按照從左到右的順序定義,但仍能為指定的形參賦值。
因為 Python 解釋器能夠用參數名匹配參數值。
注意:在調用函數時,實參也可以是按位置或按關鍵字的混合使用,但必須保證
-
關鍵字參數在位置參數后面,因為python函數在解析參數時,是按照順序來的,位置參數是必須先滿足,才考慮其他可變參數。
-
不可以對一個形參重復賦值。
def register(name,age):
register(name='Tom',18) #SyntaxError:關鍵字參數name=‘Tom’在位置參數18之前
register()
結果報錯:SyntaxError: positional argument follows keyword argument
positional argument:位置參數,即通過在參數列表中的相對位置確定傳遞給哪個形參,
keyword argument:關鍵字參數,通過name=value這樣的形式,根據name確定傳遞給哪個形參。
argument(actual parameter)指的是函數調用時的實際參數。
3.默認參數
在定義函數時,就已經為形參賦值,這類形參稱之為默認參數。
當函數有多個參數時,需要將值經常改變的參數定義成位置參數,
而將值改變較少的參數定義成默認參數,從而降低函數調用的復雜度。
注意:
-
默認參數必須在位置參數之后。
-
默認參數的值僅在函數定義階段被賦值一次。
-
默認參數的值通常應設為不可變類型。
-
每次調用是在上一次的基礎上向同一列表增加值。
4.不定長參數
當需要一個函數能處理比當初聲明時更多的參數,則這些參數叫做不定長參數。
不定長的位置參數:
如果在最后一個形參名前加*號,那么在調用函數時,溢出的位置實參,都會被以元組的形式保存下來賦值給該形參。
def text(x=8, y=9, z=10, *args): # 在最后一個形參名args前加*號
print(x)
print(y)
print(z)
print(args)
text(1, 2, 3, 4, 5, 6, 7)
# 實參1、2、3按位置為形參x、y、z賦值
# 多余的位置實參4、5、6、7都被*接收,以元組的形式保存下來,賦值給args,即args=(4,5,6,7)
運行結果:
1
2
3
(4, 5, 6, 7)
注意:這里x、y、z以用戶傳的參數為准,不用默認的8、9、10。
例如:求多個值的和
def add(*args):
res = 0
for i in args:
res += i
return res
print(add(1, 2, 3, 4, 5))
結果:15
不定長的關鍵字參數
在最后一個形參名前加**號,調用時溢出的關鍵字參數被以字典的形式賦值給該形參。
def func(x,**kwargs): #在最后一個參數kwargs前加**
print(x)
print(kwargs)
fun(y=2,x=1,z=3) #溢出的關鍵字實參y=2,z=3都被**接收,以字典的形式保存下來,賦值給kwargs
結果:
1
{‘y’: 2, ‘z’: 3}
使用**kwargs可以為日后的擴展供良好的環境,同時保持了函數的簡潔性。
以下是Python 3.8引入的:
5.限定位置形參(也叫強制位置參數)
從Python 3.8開始,positional-only形參將可正式用於自定義函數中。
它們必須放在形參表的最前面,並在后面使用斜杠/(獨占一個參數位)與普通形參分隔,比如下面這樣
# a, b, c成為限定位置形參
def func(a, b, c, /, d):
pass
這時fun的形參a, b, c將只能按位置接收實際參數,d仍是普通形參,可以兼容兩種形式。
6.限定關鍵字形參(常叫命名關鍵字參數)
限定關鍵字形參,當然就是為了限制后面幾個參數只能按關鍵字傳遞,
這往往是因為后面幾個形參名具有十分明顯的含義,顯式寫出有利於可讀性;
或者后面幾個形參隨着版本更迭很可能發生變化,強制關鍵字形式有利於保證跨版本兼容性。
限定關鍵字形參(keyword-only)
限制調用者不能按位置傳遞,需要放在形參表的后面,並在前面使用星號*(獨占一個參數位)與普通形參分隔,即類似這樣
def func(其他形參, *, kw1, kw2):
pass
這時參數kw1, kw2在函數調用時必須顯式寫出,即類似fun(其他實參, kw1=var1, kw2=var2)的形式。
下面舉一個三種混合形參的例子
def func(a, b, c, /, m, n, *, kw1, kw2):
pass
其中的m, n是兼容兩種形式的普通形參。
7.參數小結
如果形參中已經有一個args了,命名關鍵字參數就不再需要一個單獨的*作為分隔符號了。
可變參數args與關鍵字參數kwargs通常是組合在一起使用**的,如果一個函數的形參為args與**kwargs,那么代表該函數可以接收任何形式、任意長度的參數。
提示: *args、**kwargs中的args和kwargs被替換成其他名字並無語法錯誤,但使用args、kwargs是約定俗成的。
綜上所述,所有參數可任意組合使用,但定義順序必須是:
位置參數、默認參數、*args、命名關鍵字參數、**kwargs
8.經驗建議
建議使用不可變對象,如整數、浮點數、字符串、True、False、None或以上類型組成的元組等設定默認值。
因為默認值只會在函數定義時被設定一次,如果是可變對象,一旦在函數內部被原地修改,效果會保留至以后每次的函數調用,不會被重新初始化。
如果非要使用某個可變對象作為默認值,比如列表,或者要設定依賴於其他參數的默認值,建議設成None,然后寫成類似這樣的代碼
def func(x, default=None):
if default is None:
# 這里可以書寫更復雜的初始化行為
default = []
# 剩余的函數體
結語
以上這些,就是Python函數基礎知識,希望對大家有所幫助。 如果大家有任何疑問請給我留言,我會盡快回復大家。在此也非常感謝大家對CSDN的支持!

