1. 程式人生 > 其它 >函式進階5.1函式引數高階用法

函式進階5.1函式引數高階用法

一、預設引數

1. 是什麼

預設引數也叫做預設引數,是指定義函式時形參變數有預設值,如果呼叫函式時沒有傳遞引數,那麼函式就用預設值,如果傳遞了引數就用傳遞的那個資料

示例

2. 做什麼

當呼叫函式時,有些引數不必傳遞,而是用預設值,這樣的場景往往都用預設引數

例如,一個學校現在開始檢查每個學生的資訊,學生說:報告老師我是xxx學校xxx系xxx年級xxx班學生,名字叫xxxx,大家想只要是這學校的學生那麼“xxx學校”就可以省略不用說了,因為大家都知道。所以就可以認為預設的學校就是xxx,而當其他學校的學生介紹時yyy學校名字案例說就一定要說清楚,否則讓人弄混了

來個demo試試看

def print_info(name, class_name, grade, department_name, school_name="通俗易懂"):
    print("老師好:我是來自 %s學校 %s系 %s年級 %s班級 的學生,我叫%s" % (
        school_name,
        department_name,
        grade,
        class_name,
        name
    ))


print_info("dong", "超牛", "二", "軟體工程")
print_info("dong", "超牛", "二", "軟體工程", "codetutor.top")

  

執行結果

老師好:我是來自 通俗易懂學校 軟體工程系 二年級 超牛班級 的學生,我叫dong
老師好:我是來自 codetutor.top學校 軟體工程系 二年級 超牛班級 的學生,我叫dong

  

3. 注意點

  • 預設引數只能在形參的最後(即最後側)

  • 預設引數全挨在一起(在右側),不是預設引數挨在一起(在左側)

>>> def printinfo(name, age=35, sex):
...     print name
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument

  

二、命名引數

1. 是什麼

命名引數是指:在呼叫函式時,傳遞的實參帶有名字,這樣的引數叫做命名引數

示例

2. 做什麼

命名引數能夠在呼叫函式的時候,不受位置的影響,可以給需要的引數指定傳遞資料

3. 注意點

  • 命名引數的名字要與形參中的名字相同,不能出現命名引數名字叫做num,而形參中沒有變數num

  • 如果形參左側有普通的形參,呼叫函式時傳遞的引數一定要先滿足這些形參,然後再根據需要編寫命名引數

def test(a, b, c=100, d=200):
    print("a=%d, b=%d, c=%d, d=%d" % (a, b, c, d))


# 下面的方式都成功
test(11, 22)
test(11, 22, 33)
test(11, 22, 33, 44)
test(11, 22, d=33, c=44)

# 下面的方式都失敗
test(c=1, d=2)  # 缺少a、b的值
test(c=1, d=2, 11, 22)  # 11, 22應該在左側

  

三、不定長引數

1. 是什麼

不定長引數:定義函式的時候形參可以不確定到底多少個,這樣的引數就叫做不定長引數

不定長引數有2種方式表示

  • *args:表示呼叫函式時多餘的未命名引數都會以元組的方式儲存到args
  • **kwargs:表示呼叫函式時多餘的命名引數都會以鍵值對的方式儲存到kwargs

注意:

  • ***是必須要寫的,否則就變成了普通的形參了
  • 當我們說不定長引數的時候,就是指*args**kwargs

示例

2. 做什麼

通過不定長引數,能夠實現呼叫函式時傳遞實參個數可以隨意變換的需求

例如

def test(a, b, *args, **kwargs):
    print("-------------------------------")
    print(a, type(a))
    print(b, type(b))
    print(args, type(args))
    print(kwargs, type(args))


test(11, 22)
test(11, 22, 33, 44, 55, 66)
test(11, 22, 33, 44, 55, 66, name="wanglaoshi", web_site="http://www.codetutor.top")

  

執行結果:

-------------------------------
11 <class 'int'>
22 <class 'int'>
() <class 'tuple'>
{} <class 'tuple'>
-------------------------------
11 <class 'int'>
22 <class 'int'>
(33, 44, 55, 66) <class 'tuple'>
{} <class 'tuple'>
-------------------------------
11 <class 'int'>
22 <class 'int'>
(33, 44, 55, 66) <class 'tuple'>
{'name': 'wanglaoshi', 'web_site': 'http://www.codetutor.top'} <class 'tuple'>

  

說明:

3. 注意點

  • 加了星號*的變數args會存放所有未命名的變數引數,args為元組
  • 而加**的變數kwargs會存放命名引數,即形如key=value的引數,kwargs為字典
  • 一般情況下*args**kwargs會在形參的最右側
  • argskwargs的名字可以變,例如叫*aa**bb都是可以,但一般為了能夠讓其他的開發者快速讀懂我們的程式碼最好還是不改

4. 特殊情況

預設引數在*args後面

def sum_nums_3(a, *args, b=22, c=33, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)


sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)

  

說明:

  • *args後可以有預設引數,想要給這些預設引數在呼叫時傳遞引數,需要用命名引數傳遞,否則多餘的未命名引數都會給args
  • 如果有**kwargs的話,**kwargs必須是最後的