Python函數及參數詳解(位置、關鍵字、限定位置參數等)


一、函數簡介

函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。

函數能提高應用的模塊性,和代碼的重復利用率

Python提供了許多內建函數,比如print()。我們也可以創建函數,即用戶自定義函數

函數的使用必須遵循“先定義,后調用”的原則。

函數的定義就相當於事先將內存地址賦值給定義的函數名,函數名就是對這段代碼的引用,這類似於變量的定義。

1.定義函數

def 函數名(參數1,參數2,...):
    """文檔描述"""
    函數體
    return
  1. def: 定義函數的關鍵字

  2. 函數名:函數名指向函數內存地址,是對函數體代碼的引用及功能的概述

  3. 括號:括號內定義可有可無且無需指定類型的參數

  4. 冒號:括號后加冒號,以便在下一行開始縮進編寫函數體的代碼;

  5. 文檔描述:描述函數功能,參數介紹等信息的文檔,非必要;

  6. 函數體:由語句和表達式組成;

  7. return 值:結束函數,選擇性地返回一個給調用方,不帶值的return相當於返回None。

2.調用函數

函數的使用分為定義階段調用階段,定義函數時只檢測語法,不執行函數體代碼。

函數名加括號即函數調用,只有調用函數時才會執行函數體代碼。

函數的調用形式分為:語句形式、表達式形式、作為參數形式。

3.函數返回值

若需要將函數體代碼執行的結果返回給調用者,則需要用到return。

return是一個函數結束的標志,函數內可以有多個return,但只執行一次函數就結束了,並把return后定義的值作為本次調用的結果返回。

二、函數的參數

函數的參數分為形式參數和實際參數,簡稱形參和實參。

形參即在定義函數時,括號內聲明的參數。形參本質就是一個變量名,用來接收外部傳來的值。

實參即在調用函數時,括號內傳入的值,值可以是常量、變量、表達式或三者的組合。

在Python中,變量名與值只是單純的綁定關系,而對於函數來說,這種綁定關系只在函數調用時生效,在調用結束后解除。

1.位置參數

位置參數也稱必須參數,位置參數須以從左到右的順序傳入函數。調用時的數量必須和聲明時的一樣。

2.關鍵字參數

在調用函數時,實參可以是key=value的形式,稱為關鍵字參數。

凡是按照這種形式定義的實參,可以不按照從左到右的順序定義,但仍能為指定的形參賦值。

因為 Python 解釋器能夠用參數名匹配參數值。

注意:在調用函數時,實參也可以是按位置或按關鍵字的混合使用,但必須保證

  1. 關鍵字參數在位置參數后面,因為python函數在解析參數時,是按照順序來的,位置參數是必須先滿足,才考慮其他可變參數。

  2. 不可以對一個形參重復賦值

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.默認參數

在定義函數時,就已經為形參賦值,這類形參稱之為默認參數。

當函數有多個參數時,需要將值經常改變的參數定義成位置參數,

而將值改變較少的參數定義成默認參數,從而降低函數調用的復雜度。

注意:

  1. 默認參數必須在位置參數之后

  2. 默認參數的值僅在函數定義階段被賦值一次。

  3. 默認參數的值通常應設為不可變類型。

  4. 每次調用是在上一次的基礎上向同一列表增加值。

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的支持!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM