中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python函數參數詳解

發布時間:2020-07-30 11:03:38 來源:網絡 閱讀:331 作者:liangruifeng 欄目:開發技術

  Python函數定義時參數靈活,使用不同參數的組合不僅可以簡化調用者的代碼,還可以處理復雜的參數。
函數的參數除了有必選參數外,還可以使用默認參數,可變參數,關鍵字參數和命名關鍵字參數。

位置參數

定義一個計算x^2的函數,以及一個計算x^n的函數

def calc1(x):
    return x * x

def calc2(x, n):
    s = 1
    for i in range(n):
        s *= x
    return s

對于這兩個函數,其參數都是位置參數,同時也是必選參數,調用函數時實參需和形參一一對應,當參數不對應時會引起錯誤,例如:

>>>calc2(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: calc2() takes exactly 2 arguments (1 given)

>>>calc2(2, 2, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: calc2() takes exactly 2 arguments (3 given)

默認參數

對于函數calc2,如若函數調用過程中,計算x^2使用的較多,每次調用都要通過calc2(x, 2)來調用,這樣就略顯繁瑣,此時可以通過默認參數來簡化函數的調用,改寫函數為:

def calc3(x, n = 2):
    s = 1
    for i in range(n):
        s *= x
    return s

這樣,我們在調用calc3(2)時,就相當于調用calc3(2, 2),而對于其他次方仍需明確指出n。
默認參數在使用中應當的注意:位置(必選)參數在前,默認參數在后。

當有多個默認參數時,既可以按順序提供默認參數,也可以不按順序提供默認參數。

def saveInfo(name, gender, age = 23, city = 'HangZhou'):
    print(name, gender, age, city)

saveInfo('Alen', 'M', city='Beijing')

定義默認參數時需要特別注意的一點:默認參數必須指向不變對象!
看如下例子:

def addEnd(L=[]):
    L.append('END')
    return L

>>>addEnd()
['END']
>>>addEnd()
['END', 'END']
>>>addEnd()
['END', 'END', 'END']

出現這樣的結果是因為:默認參數L僅僅代表[]的一個引用,函數定義時[]就已確定,每次調用addEnd時,使用的都是函數定義時的[],通過print(id(L))可以看出,每次調用該函數時使用的是同一內存地址的[]。

def addEnd(L=[]):
    L.append('END')
    print(id(L))
    return L

addEnd()
#4518465224
#['END']
addEnd()
#4518465224
#['END', 'END']

為了避免這個問題,可以通過下面的方式,每次調用函數時,都會新建一個[]:

def addEnd(L=None):
    L = [] if L == None else L
    L.append('END')
    print(id(L))
    return L

addEnd()
#4518687688
#['END']
addEnd()
#4518688328
#['END']
可變參數

可變參數即傳入的參數個數是可變的,可以是0個,1個,或多個
先定義一下函數,給定一組數字a,b,c...,計算這組數字的平方和a^2 + b^2 + c^2 + ...

def calc(numbers):
    s = 0
    for num in numbers:
        s = s + num * num
    return s

該函數在調用時,需先組裝一個list或tuple

>>>calc([1, 2, 3])
14
>>>calc([1, 2, 3])
30

如果利用可變參數,函數的調用可以簡化

def calc(*numbers):
    s = 0
    for num in numbers:
        s = s + num * num
    return s

calc()
# 0
calc(1, 2, 3)     
# 14
calc(1, 2, 3, 4)
# 30

可變參數與list或tuple參數相比,僅僅在參數前面加了個*號,*的作用是將傳入的參數組裝成一個tuple
,如果已經有一個list或tuple,要調用可變參數怎么辦呢?

>>>nums = [1, 2, 3]
>>>calc(nums[0], nums[1], nums[2])
14

這種寫法就過于繁瑣,針對這種情況,python允許在list或tuple前加一個*號,將list或tuple的元素變成可變參數傳入

>>>nums = [1, 2, 3]
>>>calc(*nums)
14

關鍵字參數

關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
定義一個用戶注冊的函數

def user(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

user('Bob', 23)          
# ('name:', 'Bob', 'age:', 23, 'other:', {})
user('Alen', 20, gender='M', job='Engineer') 
# ('name:', 'Alen', 'age:', 20, 'other:', {'gender': 'M', 'job': 'Engineer'})

函數user除了接收必選參數name,age外還接收關鍵字參數kw,調用該函數時,可以只傳入必選參數,也可以傳入任意個數的關鍵字參數,**的作用是將含參數名的參數,組裝成一個dict傳入kw。關鍵字參數可以擴展函數的功能,調用者如果提供更多的信息,我們仍可以接收到。例如當用戶注冊時,姓名和年齡時必填項,其他是可選項,就可以通過關鍵字參數來實現。
和可變參數類似,當有現成dict時,可通過以下方式簡化調用:

>>>extra = {'city': 'Beijing', 'job': 'Engineer'}
user('Bob', 23, **extra)
name: Bob age: 23 other: {'city': 'Beijing', 'job': 'Engineer'}

**extra表示把extra這個dict的所有key-value用關鍵字參數傳入到函數的**kw參數,kw將獲得一個dict。注意kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函數外的extra。

命名關鍵字參數

對于關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數,如果要限制關鍵字參數的名字,就可以用命名關鍵字參數。命名關鍵字參數需要一個特殊分隔符*,*后面的參數被視為命名關鍵字參數,例如,只接收city和job作為關鍵字參數:

def user(name, age, *, city, job):
    print('name:', name, 'age:', age, 'city:', city, 'job:', job)

user('Alen', 20, city='Beijing', job='Engineer') 
# name: Alen age: 20 city: Beijing job: Engineer

不同于位置參數,命名關鍵字參數必須傳入參數名。如果沒有傳入參數名,調用將報錯:

>>>user('Alen', 20, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: user() takes 2 positional arguments but 4 were given

若函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了:

def user(name, age, *args, city, job):
    print(name, age, args, city, job)

命名關鍵字參數可以有缺省值,從而簡化調用:

def user(name, age, *, city='Beijing', job):
    print(name, age, city, job)

user('Bob', 22, job='Engineer')
# Bob 22 Beijing Engineer
參數組合

定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是應注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
定義一個函數,包含上述參數:

def user(name, age = 20, *args, city = 'Beijing', job, **kw):
    print(name, age, args, city, job, kw)

user('Bob', 20, 120, job = 'Engineer', gender = 'M')
# Bob 20 (120,) Beijing Engineer {'gender': 'M'}

對于任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。

>>>args = ('Bob', 20, 120)
>>>kw = {'job':'Engineer', 'gender':'M'}
>>>user(*args, **kw)
Bob 20 (120,) Beijing Engineer {'gender': 'M'}

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高碑店市| 兴化市| 南陵县| 吉水县| 合肥市| 崇礼县| 林周县| 四子王旗| 博野县| 县级市| 砀山县| 工布江达县| 盘锦市| 垫江县| 隆德县| 辽宁省| 崇仁县| 乐山市| 子长县| 金川县| 吉首市| 扶沟县| 邓州市| 长海县| 东丰县| 宣武区| 札达县| 莱州市| 哈密市| 安乡县| 肇源县| 南郑县| 白城市| 青海省| 郁南县| 梅河口市| 巧家县| 齐齐哈尔市| 新竹县| 洛阳市| 班玛县|