python中的*和**做參數(shù)的用法詳解
python的方法的參數(shù)除了可以使用標(biāo)識(shí)符,還可以使用*和**作為參數(shù),這些符號(hào)在Python中常用于處理可變數(shù)量的參數(shù)(也稱為“可變參數(shù)”或“星號(hào)參數(shù)”)。
注意:*通常與變量名結(jié)合使用,如*args(表示任意數(shù)量的位置參數(shù));**通常如**kwargs(表示任意數(shù)量的關(guān)鍵字參數(shù))。這些名字是慣例,不是必須的,可以用其他名字替換。
1.*的用法(可變位置參數(shù))
- 在函數(shù)定義中:
*用于收集任意數(shù)量的位置參數(shù)(positional arguments),這些參數(shù)會(huì)被打包成一個(gè)元組(tuple)。這允許函數(shù)接受不定數(shù)量的參數(shù),而無需預(yù)先指定。- 語(yǔ)法:
def func(固定參數(shù), *args): ... *args收集所有多余的位置參數(shù)。- 位置:
*args必須在固定位置參數(shù)之后,在**kwargs之前(如果有)。
- 語(yǔ)法:
- 在函數(shù)調(diào)用中:
*用于“展開”(unpack)一個(gè)可迭代對(duì)象(如列表、元組),將其元素作為位置參數(shù)傳入函數(shù)。- 語(yǔ)法:
func(*iterable) - 這相當(dāng)于將iterable的每個(gè)元素逐個(gè)作為位置參數(shù)傳遞。
- 語(yǔ)法:
示例(定義和調(diào)用結(jié)合)
# 函數(shù)定義中使用 *
def sum_numbers(*args):
total = 0
for num in args: # args是一個(gè)元組
total += num
return total
# 調(diào)用:直接傳入多個(gè)位置參數(shù)
print(sum_numbers(1, 2, 3)) # 輸出: 6 (args = (1, 2, 3))
# 函數(shù)調(diào)用中使用 * 展開
numbers = [4, 5, 6] # 列表
print(sum_numbers(*numbers)) # 輸出: 15 (相當(dāng)于 sum_numbers(4, 5, 6))2.**的用法(可變關(guān)鍵字參數(shù))
- 在函數(shù)定義中:
**用于收集任意數(shù)量的關(guān)鍵字參數(shù)(keyword arguments),這些參數(shù)會(huì)被打包成一個(gè)字典(dict)。鍵是參數(shù)名,值是參數(shù)值。- 語(yǔ)法:
def func(固定參數(shù), **kwargs): ... **kwargs收集所有多余的關(guān)鍵字參數(shù)。- 位置:
**kwargs必須在所有其他參數(shù)之后(包括*args)。
- 語(yǔ)法:
- 在函數(shù)調(diào)用中:
**用于“展開”一個(gè)字典,將其鍵值對(duì)作為關(guān)鍵字參數(shù)傳入函數(shù)。- 語(yǔ)法:
func(**dictionary) - 這相當(dāng)于將字典的每個(gè)鍵值對(duì)作為
key=value形式傳遞。
- 語(yǔ)法:
示例(定義和調(diào)用結(jié)合)
# 函數(shù)定義中使用 **
def print_info(**kwargs):
for key, value in kwargs.items(): # kwargs是一個(gè)字典
print(f"{key}: {value}")
# 調(diào)用:直接傳入多個(gè)關(guān)鍵字參數(shù)
print_info(name="Alice", age=30, city="New York")
# 輸出:
# name: Alice
# age: 30
# city: New York
# 函數(shù)調(diào)用中使用 ** 展開
info = {"name": "Bob", "age": 25, "city": "London"}
print_info(**info) # 相當(dāng)于 print_info(name="Bob", age=25, city="London")
# 輸出同上3. 同時(shí)使用*和**
- 在函數(shù)定義中:可以同時(shí)使用
*args和**kwargs,以處理不定數(shù)量的位置參數(shù)和關(guān)鍵字參數(shù)。- 順序必須是:固定位置參數(shù) →
*args→ 固定關(guān)鍵字參數(shù) →**kwargs。 - 這允許函數(shù)非常靈活,能接受各種參數(shù)組合。
- 順序必須是:固定位置參數(shù) →
- 在函數(shù)調(diào)用中:可以同時(shí)使用
*展開位置參數(shù)和**展開關(guān)鍵字參數(shù)。- 語(yǔ)法:
func(*iterable, **dictionary) - 注意:展開的位置參數(shù)必須在關(guān)鍵字參數(shù)之前(Python的調(diào)用規(guī)則)。
- 語(yǔ)法:
- 原理:在定義中,
*和**允許函數(shù)“捕獲”額外參數(shù);在調(diào)用中,它們?cè)试S“注入”參數(shù)。這常用于裝飾器、API函數(shù)或需要轉(zhuǎn)發(fā)參數(shù)的場(chǎng)景。
詳細(xì)代碼示例:同時(shí)使用*和**(定義和調(diào)用)
# 示例1: 函數(shù)定義中同時(shí)使用 * 和 **
def flexible_func(a, b, *args, **kwargs):
print(f"固定位置參數(shù): a={a}, b=")
print(f"可變位置參數(shù) (*args): {args}") # 元組
print(f"可變關(guān)鍵字參數(shù) (**kwargs): {kwargs}") # 字典
# 可以進(jìn)一步處理args和kwargs
total = a + b + sum(args)
for key, value in kwargs.items():
print(f"額外信息: {key} = {value}")
return total
# 調(diào)用方式1: 直接傳入?yún)?shù)
result = flexible_func(1, 2, 3, 4, name="Alice", age=30)
print(f"結(jié)果: {result}")
# 輸出:
# 固定位置參數(shù): a=1, b=2
# 可變位置參數(shù) (*args): (3, 4)
# 可變關(guān)鍵字參數(shù) (**kwargs): {'name': 'Alice', 'age': 30}
# 額外信息: name = Alice
# 額外信息: age = 30
# 結(jié)果: 10 (1+2+3+4)
# 調(diào)用方式2: 使用 * 和 ** 展開傳入
pos_args = [1, 2, 3, 4] # 列表作為位置參數(shù)
kw_args = {"name": "Bob", "age": 25} # 字典作為關(guān)鍵字參數(shù)
result = flexible_func(*pos_args, **kw_args) # 相當(dāng)于 flexible_func(1, 2, 3, 4, name="Bob", age=25)
print(f"結(jié)果: {result}")
# 輸出同上,但 kwargs={'name': 'Bob', 'age': 25},結(jié)果仍為10
# 示例2: 更復(fù)雜的場(chǎng)景(參數(shù)轉(zhuǎn)發(fā))
def wrapper_func(*args, **kwargs):
# 將所有參數(shù)轉(zhuǎn)發(fā)給另一個(gè)函數(shù)
return flexible_func(*args, **kwargs)
# 調(diào)用wrapper_func,它會(huì)轉(zhuǎn)發(fā)
result = wrapper_func(5, 6, 7, city="Tokyo", country="Japan")
print(f"結(jié)果: {result}")
# 輸出:
# 固定位置參數(shù): a=5, b=6
# 可變位置參數(shù) (*args): (7,)
# 可變關(guān)鍵字參數(shù) (**kwargs): {'city': 'Tokyo', 'country': 'Japan'}
# 額外信息: city = Tokyo
# 額外信息: country = Japan
# 結(jié)果: 18 (5+6+7)另一個(gè)綜合示例:混合固定參數(shù)和可變參數(shù)
def order_food(main_dish, *sides, **options):
print(f"主菜: {main_dish}")
print(f"配菜: {sides}")
print(f"選項(xiàng): {options}")
# 直接調(diào)用
order_food("Pizza", "Fries", "Salad", size="Large", drink="Coke")
# 輸出:
# 主菜: Pizza
# 配菜: ('Fries', 'Salad')
# 選項(xiàng): {'size': 'Large', 'drink': 'Coke'}
# 展開調(diào)用
sides_list = ["Fries", "Salad"]
options_dict = {"size": "Large", "drink": "Coke"}
order_food("Pizza", *sides_list, **options_dict) # 同上輸出注意事項(xiàng)
- 順序規(guī)則:
- 定義時(shí):位置參數(shù) →
*args→ 關(guān)鍵字參數(shù) →**kwargs。 - 調(diào)用時(shí):位置參數(shù)(包括
*展開)必須在關(guān)鍵字參數(shù)(包括**展開)之前。
- 定義時(shí):位置參數(shù) →
- Python版本差異:Python 3.5+ 支持更多靈活性,如僅位置參數(shù)(
/)和僅關(guān)鍵字參數(shù)(*),但基本用法不變。 - 常見錯(cuò)誤:
- 如果
*args接收到關(guān)鍵字參數(shù),會(huì)報(bào)錯(cuò)(TypeError)。 - 展開時(shí),確保iterable是可迭代的,dictionary的鍵必須是字符串。
- 不要在定義中重復(fù)使用
*或**(如兩個(gè)*args)。
- 如果
- 實(shí)際應(yīng)用:常用于庫(kù)函數(shù)(如
print(*objects, sep=' '))、裝飾器或需要處理未知參數(shù)的函數(shù)。
到此這篇關(guān)于python *和**做參數(shù)的用法的文章就介紹到這了,更多相關(guān)python *和**內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實(shí)現(xiàn)為PDF文檔設(shè)置背景色或背景圖
PDF作為一種跨平臺(tái)、高保真的文件格式被廣泛應(yīng)用,這篇文章主要為大家詳細(xì)介紹了如何使用Python代碼對(duì)PDF文檔進(jìn)行頁(yè)面背景色或背景圖片的設(shè)置,需要的可以參考下2024-04-04
Python+Pygame實(shí)現(xiàn)代碼雨動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了python中的一個(gè)小項(xiàng)目:利用pygame實(shí)現(xiàn)代碼雨動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-11-11
Pytorch?和?Tensorflow?v1?兼容的環(huán)境搭建方法
這篇文章主要介紹了搭建Pytorch?和?Tensorflow?v1?兼容的環(huán)境,本文是小編經(jīng)過多次實(shí)踐得到的環(huán)境配置教程,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
python+appium實(shí)現(xiàn)自動(dòng)化測(cè)試的示例代碼
appium是一個(gè)開源的測(cè)試自動(dòng)化框架,可以與原生的、混合的和移動(dòng)的web應(yīng)用程序使用,本文主要介紹了python+appium實(shí)現(xiàn)自動(dòng)化測(cè)試的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
使用python讀取.text文件特定行的數(shù)據(jù)方法
今天小編就為大家分享一篇使用python讀取.text文件特定行的數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python進(jìn)階學(xué)習(xí)之特殊方法實(shí)例詳析
一般說來,特殊的方法都被用來模仿某個(gè)行為。下面這篇文章主要給大家介紹了關(guān)于Python進(jìn)階學(xué)習(xí)之特殊方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起看看吧。2017-12-12
在VS Code上搭建Python開發(fā)環(huán)境的方法
這篇文章主要介紹了在VS Code上搭建Python開發(fā)環(huán)境的方法,需要的朋友可以參考下2018-04-04

