10個Python 示例,輕鬆學會 *args 和 **kwargs

2021-03-02 Python數據分析實例

我們知道函數是 Python 代碼編程的基礎。它可以接受零個或多個參數並返回值。函數參數傳遞非常靈活。*args 和 **kwargs 可以處理參數變得更容易、更簡潔。

*args 和 **kwargs 雖然功能強大,但能真正掌握的同學其實並不多。在這篇文章中,我將分享十個示例,讓你輕鬆掌握!

示例1

如下函數是計算兩個數字的和

def addition(a, b):
   return a + b
print(addition(3,4))

此函數只需要輸入兩個數字。如果我們想要一個計算三個或四個數字的函數呢?我們甚至可能不希望對傳遞到函數的參數數設置約束。

在這種情況下,我們可以使用 *args 作為參數。

def addition(*args):
   result = 0
   for i in args:
      result += i
   return result

傳遞給加法函數的參數存儲在元組中。我們可以在 args 變量上迭代。

示例2

在第二個示例之前,先解釋「位置參數」「關鍵詞參數」的區別。

調用函數時,必須給出「位置參數」的值。否則,我們將得到一個錯誤。如果我們不指定「關鍵字參數」的值,則它採用默認值。

def addition(a, b=2): #a is positional, b is keyword argument
   return a + b
print(addition(1))
3
def addition(a, b): #a and b are positional arguments
   return a + b
print(addition(1))
TypeError: addition() missing 1 required positional argument: 'b'

我們現在可以做第二個例子了。

def arg_printer(a, b, *args):
   print(f'a is {a}')
   print(f'b is {b}')
   print(f'args are {args}')
arg_printer(3, 4, 5, 8, 3)
a is 3
b is 4
args are (5, 8, 3)

前兩個值被賦予 a 和 b。其餘值存儲在 args 元組中。

示例3

如果我們在「位置參數」之後放置關鍵字參數。在調用函數時,我們看以下示例:

arg_printer(a=4, 2, 4, 5)
SyntaxError: positional argument follows keyword argument

將值分配給通常為位置參數的 ,則它將成為關鍵字參數。由於後跟位置參數,因此我們得到一個「語法錯誤」

示例4

在下面的函數中,option 是關鍵字參數(它有一個默認值)

def addition(a, b, *args, option=True):
   result = 0
   if option:
      for i in args:
      result += i
      return a + b + result
   else:
      return result

由於option 默認值為 True,因此函數返回參數的總和,除非選項參數聲明為 False。

print(addition(1,4,5,6,7))
23
print(addition(1,4,5,6,7, option=False))
0

示例5

**kwargs 收集未顯式定義的所有關鍵字參數。因此,它執行與 *args 相同的操作,但用於關鍵字參數。

默認情況下,**kwargs 是一個空字典。每個未定義的關鍵字參數都存儲為 **kwargs 字典中的鍵值對。

def arg_printer(a, b, option=True, **kwargs):
   print(a, b)
   print(option)
   print(kwargs)
arg_printer(3, 4, param1=5, param2=6)
3 4
True
{'param1': 5, 'param2': 6}

示例6

我們在函數中可以同時使用 *args 和 **kwargs,但 *args 必須放在 **kwargs 之前。

def arg_printer(a, b, *args, option=True, **kwargs):
   print(a, b)
   print(args)
   print(option)
   print(kwargs)
arg_printer(1, 4, 6, 5, param1=5, param2=6)
1 4
(6, 5)
True
{'param1': 5, 'param2': 6}

示例7

我們可以使用 *args 和 **kwargs 打包和解包變量。

def arg_printer(*args):
   print(args)

如果我們將列表傳遞給上面的函數,它將作為單個元素存儲在 args 元組中。

lst = [1,4,5]
arg_printer(lst)
([1, 4, 5],)

如果我們在 lst 之前放一個星號,列表中的值將解壓縮並單獨存儲在 args 元組中。

lst = [1,4,5]
arg_printer(*lst)
(1, 4, 5)

示例8

我們可以通過多個可操作項與單個元素一起解包。所有值都將存儲在 args 元組中,這一招有時非常有用的。

lst = [1,4,5]
tpl = ('a','b',4)
arg_printer(*lst, *tpl, 5, 6)
(1, 4, 5, 'a', 'b', 4, 5, 6)

示例9

我們也可以使用關鍵字參數進行打包和解包。

def arg_printer(**kwargs):
   print(kwargs)

但作為關鍵字參數傳遞的可執行參數必須是映射(如字典)

dct = {'param1':5, 'param2':8}
arg_printer(**dct)
{'param1': 5, 'param2': 8}

示例10

如果我們還將其他關鍵字參數與字典一起傳遞,將它們組合併存儲在 kwargs 字典中。

dct = {'param1':5, 'param2':8}
arg_printer(param3=9, **dct)
{'param3': 9, 'param1': 5, 'param2': 8}

總結

通過上述 10 個示例的講解,相信大家對*args 和 **kwargs 有了一定程度的理解。喜歡歡迎收藏、分享。

推薦一本對 Python 感興趣的書籍《Python進階》,是《Intermediate Python》的中文譯本,這本書具有如下幾個優點:簡單、易讀、易譯。這些都不是重點,重點是:它是一本開腦洞的書。無論你是Python初學者,還是Python高手,它顯現給你的永遠是Python裡最美好的事物。

領取方式:

長按掃碼,發消息 [Python進階]

Python數據分析實例   

相關焦點

  • 10個Python 示例,輕鬆學會 *args 和 **kwargs
    它可以接受零個或多個參數並返回值。函數參數傳遞非常靈活。*args 和 **kwargs 可以處理參數變得更容易、更簡潔。*args 和 **kwargs 雖然功能強大,但能真正掌握的同學其實並不多。在這篇文章中,我將分享十個示例,讓你輕鬆掌握!
  • 解密Python中的args和kwargs
    解密Python中的args和kwargs本文來源:https://realpython.com/python-kwargs-and-args/翻譯:老齊與本文內容配套的圖書:《跟老齊學Python:輕鬆入門》、《Python大學實用教程》。各大電商平臺有售。
  • *args和**kwargs在Python中的作用
    我發現Python新手們在理解*args和**kwargs這兩個魔法變量時都有些困難。他們到底是什麼?首先,我先告訴大家一個事實,完整地寫*args和**kwargs是不必要的,我們可以只寫*和**。你也可以寫*var和**vars。寫*args和**kwargs只是一個大家都遵守的習慣。那現在讓我們從*args講起。
  • Python中 *args 和 **kwargs 的含義?
    如果參考答案不夠好,或者有錯誤的話,麻煩大家可以在留言區給出自己的意見和討論,大家是要一起學習的 。廢話不多說,開始今天的題目:問:Python中 *args 和 **kwargs 的含義?答:在python中,*args和**kwargs通常使用在函數定義裡。
  • Python 中的 *args 和 **kwargs
    , **kwargs):很多同學可能會對此感到困惑,這個*args 和 **kwargs 是什麼東西, 為啥會在源碼中應用這麼廣泛呢?元組參數,即 *args,參數格式化存儲在一個元組中,長度沒有限制,必須位於普通參數和默認參數之後。字典參數,即 **kwargs,參數格式化存儲在一個字典中,必須位於參數列表的最後面。
  • Python中的*args和**kwargs是什麼?該如何使用?
    然而,接觸到函數定義中的*args和**kwargs時,也會讓新手剛開始就遇到心理障礙。在Python中的代碼中經常會見到這兩個詞 args 和 kwargs,前面通常還會加上一個或者兩個星號。別被這些語句所絆倒。
  • Python基礎知識儲備,函數的參數和返回值的用法,實操演示
    ,生成20個10-50之間的隨機數2)通過手工指定參數名稱,生成10個10-99之間的隨機數3)按照形參默認值,生成隨機數操作代碼:代碼縮進請參考演示圖import randomprint(build_array(10,50,20))# 調用的方法02:調用的時候指明參數的名稱方式,這種情況下,調用的順序可以和函數的順序不一致!
  • Python每天一分鐘:如何把元組/字典作為參數傳遞給函數(附代碼)
    學習程式語言的讀者對於函數參數的傳遞應該都不陌生,目前業內已經有多種高級語言允許定義個數可變的參數,這樣的好處是可以在調用函數時傳入任意多個參數。我們今天就以元組和字典為例給大家詳細介紹如何給函數傳遞可變參數python函數的可變參數我們首先來了解下python中函數的形參與實參定義:
  • Python中的函數定義與參數使用
    出於這個目的,設置默認參數基本原則:函數有多個參數,變化大的參數放置在前,變化小的參數放置在後面位置,同時為變化小的參數設置默認值代碼示例、def power(x,n=2):    return  x**nprint( power(10) )print
  • Python Decorator 基礎
    return func(*args, **kwargs)        finally:            print 'func %s cost %s' % (func.另外staticmethod和classmethod是兩個我們經常在代碼中用到的裝飾器,如果對pyc反編譯,得到的代碼一般也都是 func = staticmthod(func)這種模式。當然,@符號的形式更受歡迎些,至少可以少拼寫一次函數名。
  • Python高級編程
    好處:    1、代碼服用,提高編程效率,使程序易於理解    2、自己學會定義函數,有助於理解看懂別人函數的幫助定義函數你可以定義一個自定義功能的函數,以下是簡單的規則:    1、函數代碼塊以def關鍵詞開頭,後接函數標識符名稱和圓括號()。
  • 用 Python 創建你自己的 Shell
    我們可以輕鬆地執行ls('-l','--sort = size')。我們可以做得更好嗎? class PipePy:-    def __init__(self, *args):+    def __init__(self, *args, **kwargs):         self.
  • Python面試必刷題系列(5)
    通過收集、整理Python真實面試題,給大家講解面試中的python高頻考察點,希望能夠引起讀者的足夠重視。往期回顧:Python中 is 和 == 有什麼區別?(1)==是比較運算符,用來比較兩個對象的value(值)是否相等。(2)is也叫做同一性運算符,用來比較對象間的唯一身份標識(id)是否一致。
  • python 函數定義以及函數的調用
    >*args, **kwargs ,星號是關鍵字, args,kwargs是變量名,規範。注意:關鍵字參數和位置參數一起使用時,關鍵字參數必須要寫在位置參數的後面,這是語法要求。def f3(p, *args, **kwargs):print(p, type(p))print(args, type(args))print(kwargs, type(kwargs))f3
  • Python編程入門練習題題目匯總-開課吧Python習題
    Python題目一:談下python的GILpython的GIL是python的全局解釋器鎖,同一個進程中如果有多個線程運行,一個線程運行的時候會霸佔解釋器,上了個鎖即GIL,進程內其他線程無法運行。二:fun(*args,**kwargs)中的*args,**kwargs什麼意思?用於函數的接收參數。可以接收補丁數量的參數。*args是用來接收一個非鍵值對的可變數量的參數列表**kwargs允許接收不定長度的鍵值對。
  • Python語言之Python探針實現原理
    我們就可以實現 import hook 的功能:當 import 預定的 module 時,對這個 module 裡的對象來個狸貓換太子, 從而實現獲取函數或方法的執行時間等探測信息。對於函數對象,我們可以使用裝飾器的方式來替換函數對象(代碼可以從 github 上下載 part2) :import functoolsimport timedef func_wrapper(func):    @functools.wraps(func)    def wrapper(*args, **kwargs):        print('start func
  • python argparse 源碼閱讀
    :關鍵字參數有長短選項的寫法,-b和--bind都可以帶著這幾個疑問,我們去python源碼中查找答案。getopt 解析我在上個例子中使用了 d@3 , 這是搞笑的。命令行參數有約定的慣例和規範,在unix-shell中由getopt函數實現,具體可以看參考連結中的wiki部分。python中也提供了 getopt 實現。
  • 從Python到空間分析Arcpy || 1.3.5 function first 函數優先
    和函數有關的核心內容:關鍵字和函數名參數定義和函數體函數調用、傳參和返回值關鍵字和函數名先說關鍵字和函數名,python 中如果想定義一個函數必須要先使用 def 關鍵字,然後是函數的名字,別看這小小的名字,如何規範的取名字是大有學問的,總的來說函數取名要考慮
  • 從踩坑學Python內部原理(8):is not 與逗號
    GitHub 有個倉庫收集 Python 中那些難以理解和鮮為人知的功能特性,並嘗試討論這些現象背後真正的原理!雖然有些例子並不一定會讓你覺得「臥槽」(WTF),但它們依然有可能會告訴你一些你所不知道的 Python 有趣特性。
  • Python代碼結構:函數
    wax')當使用*時,不一定要把元祖參數命名為args,但這是python中的一個常見做法。arguments:{'wine':'merlot','entree':'mutton','dessert':'macaroon'}如果把帶有*args和**kwargs的位置參數混合起來,他們必須按照順序出現。