python中(*args, **kw)這兩類參數(shù) 的正確打開方式

一、(*args, **kw)是在python函數(shù)定義中使用的

  • 在分析(*args, **kw)兩個參數(shù)之前,先講講在python中函數(shù)的定義:
    ??在Python中定義函數(shù),分為:1、必選參數(shù)、2、默認(rèn)參數(shù)、3、可變參數(shù)、4、關(guān)鍵字參數(shù)和5、命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。
    ??但參數(shù)定義的順序必須是:
    必選參數(shù)默認(rèn)參數(shù)、可變參數(shù)(*args)命名關(guān)鍵字參數(shù)、關(guān)鍵字參數(shù)(kw)

二、 主要參數(shù)描述

1、必選參數(shù)、默認(rèn)參數(shù)
# 必選參數(shù)  x:必須得要輸入的參數(shù)
# 默認(rèn)參數(shù)  y:非必填項,在定義函數(shù)的時候,就給了一個默認(rèn)的值,你不輸入的話,就默認(rèn)為這個數(shù)值
 
def sum(x, y=2):
    s= x+y
    return s
 
# 僅輸入必選參數(shù)
print('僅輸入必選參數(shù)')
print(sum(3))
# 輸出結(jié)果
5
 
# 輸入必選參數(shù)與默認(rèn)參數(shù)
print('輸入必選參數(shù)與默認(rèn)參數(shù)')
print(sum(3, 4))
 
# 輸出結(jié)果
7
2、可變參數(shù)(*args)
# 可變參數(shù) *args :可變參數(shù)就是傳入的參數(shù)個數(shù)是可變的,可以是1個、2個到任意個,還可以是0個。
# 可變參數(shù)允許你傳入0個或任意個參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時自動組裝為一個tuple
 
'''
給出一組數(shù)字a,b,c……,請計算a**2 + b**2 + c**2 + ……。首先,a,b,c均是變量,數(shù)值可變化
解決方案1:將a,b,c...定義為列表或者元組進(jìn)行計算;
解決方案2:將a,b,c...定義為可變參數(shù)進(jìn)行計算;
'''
--------------------------------------------------------------
 
# 方案1 代碼: 
def calc(numbers):
    sum = 0
    for nums in numbers:
        sum = sum + nums ** 2
    print(sum)
 
 
# 結(jié)果驗證
print('輸入為列表')
numbers1 = [3, 4, 6]
calc(numbers1)
 
print('輸入為元組')
numbers2 = (3, 4, 6)
calc(numbers2)
 
# 輸出結(jié)果
輸入為列表
50
輸入為元組
50
 
---------------------------------------------------------------
# 方案2 代碼;
def calc(*numbers):
    sum = 0
    for nums in numbers:
        sum = sum + nums ** 2
    print(sum)
 
# 結(jié)果驗證,直接在函數(shù)中輸入動態(tài)個數(shù)的參數(shù)值
 
print('直接輸入?yún)?shù)值')
calc(3, 4, 5)
 
# 輸出結(jié)果
直接輸入?yún)?shù)值
50
 
# 若已經(jīng)定義了列表或者元組,可以將元組元素提取出來單獨輸入/
# 或者,直接在元組或者列表前加 “*”號,將元組列表轉(zhuǎn)變?yōu)榭勺儏?shù) *args
 
 
print('單獨提元組或列表內(nèi)容')
numbers2 = (3, 4, 6)
calc(numbers2[0],numbers2[1],numbers2[2])
 
print('將列表或元組轉(zhuǎn)換為可變參數(shù)')
numbers2 = (3, 4, 6)
calc(*numbers2)
 
#輸出結(jié)果 
單獨提元組或列表內(nèi)容
61
將列表或元組轉(zhuǎn)換為可變參數(shù)
61
3、關(guān)鍵字參數(shù)( **kw)
#關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict
#關(guān)鍵字參數(shù)有什么用?它可以擴(kuò)展函數(shù)的功能。

'''
例:當(dāng)我們需要獲取到一些個人基本信息時,當(dāng)然是越多對個人的描述越詳細(xì)
 def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
'''
 
#實例展示:
print('**kw中 加入性別、職位')
person('Jack', 24, gender='man', major='Engineer')
 
#輸出結(jié)果、**kw蔬菜為字典形式:
**kw中 加入性別、職位
name: Jack age: 24 other: {'gender': 'man', 'major': 'Engineer'}
 
4、命名關(guān)鍵字參數(shù)(*,kw,kw, ... ,)
'''
1、如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù),例如,只接收city和job作為關(guān)鍵字參數(shù)。
這種方式定義的函數(shù)如下:
2、和關(guān)鍵字參數(shù)**kw不同,命名關(guān)鍵字參數(shù)需要一個特殊分隔符*,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
3、使用命名關(guān)鍵字參數(shù)時,要特別注意,如果沒有可變參數(shù),就必須加一個*作為特殊分隔符。如果缺
少*,Python解釋器將無法識別位置參數(shù)和命名關(guān)鍵字參數(shù):
'''
 
 
'''
例:首先默認(rèn)參數(shù)為name、age、除此之外,我們還想要加入一些固定的命名關(guān)鍵字參數(shù)city, job
def person(name, age, *, city, job):
    print(name, age, city, job)
'''
 
# 實例展示1:正常輸入
print('直接傳入city、job參數(shù)')
person('Jack', 24, city='Beijing', job='Engineer')
 
# 輸出結(jié)果
直接傳入city、job參數(shù)
Jack 24 Beijing Engineer
 
 
# 實例展示2:異常輸入,會出現(xiàn)TypeError
print('傳入city、job其他參數(shù)、gender')
person('Jack', 24, city='Beijing', job='Engineer',gender='man')
 
# 輸出結(jié)果
傳入city、job其他參數(shù)、gender
....
TypeError: person() got an unexpected keyword argument 'gender'
 
 
# 實例展示3:如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔
#符*了:,但是命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒有傳入?yún)?shù)名,調(diào)用將報錯:
#(因為可變參數(shù)處不能理解輸入的內(nèi)容屬于可變部分還是命名關(guān)鍵字部分)
 
def person(name, age, *args, city, job):
    print(name, age, args, city, job)
 
# 驗證代碼
print('傳入?yún)?shù)名')
person('Jack', 24, city='Beijing', job='Engineer')
print('不傳入?yún)?shù)名')
person('Jack', 24, 'Beijing', 'Engineer')
 
 
#輸出結(jié)果
 
傳入?yún)?shù)名
Jack 24 () Beijing Engineer
不傳入?yún)?shù)名
...
TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job'

原文鏈接==https://blog.csdn.net/u010801439/article/details/103719415

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容