Python中的*args和**kwargs是什麼?該如何使用?

2021-01-10 讀芯術

全文共2911字,預計學習時長9分鐘

來源:Pexels

在編程中,函數就是生命!

作為使用Python的新手——無論是編程新手,還是熟悉另一語言的人——都需要學習函數定義中的參數數目是否和想要傳達的變元數目匹配。

這是基礎性知識——有助於了解這個世界。

然而,接觸到函數定義中的*args和**kwargs時,也會讓新手剛開始就遇到心理障礙。

在Python中的代碼中經常會見到這兩個詞 args 和 kwargs,前面通常還會加上一個或者兩個星號。

別被這些語句所絆倒。其實這些並不是什麼超級特殊的參數,也並不奇特,只是編程人員約定的變量名字,args 是 arguments 的縮寫,表示位置參數;kwargs 是 keyword arguments 的縮寫,表示關鍵字參數。

這其實就是 Python 中可變參數的兩種形式,並且 *args 必須放在 **kwargs 的前面,因為位置參數在關鍵字參數的前面。

接下來,我們就具體學學如何使用它們。

位置參數vs關鍵字參數

為了學習什麼是*args和**kwargs,我們需要區分兩個概念。

首先,分清楚位置參數和關鍵字參數的區別。在最基本的函數中,做一個匹配遊戲——參數1與參數1匹配,參數2與參數2匹配,諸如此類。

def printThese(a,b,c): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored inc")printThese(1,2,3)"""1 is stored in a2 is stored in b3 is stored in c"""

三項參數都是必需的,缺了其中一個就會致錯。

def printThese(a,b,c): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored inc")printThese(1,2)"""TypeError: printThese() missing 1 required positional argument: 'c'"""

為某函數定義中的參數給定默認值,該參數隨後就會變為可選參數。

def printThese(a,b,c=None): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored inc")printThese(1,2)"""1 is stored in a2 is stored in bNone is stored in c"""

另外,這些可選參數也會成為可供選擇的關鍵字,則此時可以規定函數調用參數名稱並相應進行映射。

將三個變量默認值設為None,然後看看如何在不考慮順序的情況下進行映射。

defprintThese(a=None,b=None,c=None): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored inc")printThese(c=3, a=1)"""def printThese(a=None,b=None,c=None): print(a, "is stored in a") print(b, "is stored in b") print(c, "is stored inc")printThese(c=3, a=1)"""1 is stored in aNone is stored in b3 is stored in c"""

Splat運算符

來源:Pexels

從開始說我愛該運算符的名稱開始——太……可視化了。*常常與乘法運算有關,但是在Python中,則是splat運算符的兩倍。

該運算符就像一個彩盒。筆者把延伸運算符——相當於splat的JavaScript——這個過程可以看做是打開一個多米諾骨牌,形成一個更大的序列,但是splat需要更有力的類比。

利用以下例子更容易解釋清楚。

a = [1,2,3]b = [*a,4,5,6]print(b) # [1,2,3,4,5,6]

在代碼實例中,將a的內容移入(解包)到新列表b中。

如何使用*args和**kwargs

我們知道splat運算符解包多個值,並且知道函數參數有兩種類型。若現在還未弄明白,那麼可以將*args理解為變元的縮寫,而**kwargs理解為關鍵字變元的縮寫。

各參數用於解壓其各自的變元類型,允許使用可變字長變元列表進行函數調用。例如,創建一個函數表示學生的考試分數。

def printScores(student,*scores): print(f"Student Name:{student}") for score in scores: print(score)printScores("Jonathan",100, 95, 88, 92, 99)"""Student Name: Jonathan10095889299"""

噢,等等,我並未稱呼其為*args?是的,「args」是一個標準化規範,但仍然只是一個名稱。事實上,在*args中,唯一的星號是真正的參與者,創建了列表,其內容則是來自函數調用的位置參數(在這些定義變元後)。

這些理清楚之後,**kwargs就很容易理解了。名稱並不重要,重要的是雙星號創建了字典,其內容是關鍵字參數,來自函數調用(在這些定義變元後)。

為了更好地演示,我們創建一個函數,輸出參加全國英語等級考試的人員名單。

def printPetNames(owner,**pets): print(f"Owner Name:{owner}") for pet,name in pets.items(): print(f"{pet}:{name}")printPetNames("Jonathan", dog="Brock",fish=["Larry", "Curly", "Moe"],turtle="Shelldon")"""Owner Name: Jonathandog: Brockfish: ['Larry', 'Curly', 'Moe']turtle: Shelldon"""

來源:Pexels

最後,再給大家提供一些額外的「知識福利」。

下面一些諫言可有助於大家規避常見的陷阱並擴展知識面。

· 利用*args和**kwargs作為標準化規範,把握好位置參數和關鍵字參數;

· 不能將**kwargs置於*args前,否則將產生錯誤;

· 清楚意識到關鍵字參數和**kwargs之間的衝突,該值本是傳達**kwarg的意思,但是卻不明就裡的成為關鍵字參數的名稱;

· 在函數調用時可以採用splat運算符。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • Python裝飾器以及高級用法
    你在本教程中看到的一些代碼將會有一些複雜。大多數人在學習Python時都跟裝飾器做過鬥爭,所以如果這對你來說很奇怪,不要感到沮喪,因為同樣的大多數人都可以克服這種苦難。在本教程中,我將逐步介紹了解裝飾器的過程。首先我假設你已經可以編寫基本函數和基本類。如果你不能做這些事,那麼我建議你在回到這裡之前先學習如何去做到編寫基本函數和基本類(除非你迷路了,在這種情況下你可以原諒)。
  • 作為程式設計師,起碼要知道的 Python 修飾器!
    修飾器的思想,就是把函數中除了正常行為之外的部分抽象出去。這樣有很多好處,如很容易進行代碼復用,並且能遵守科裡定律(即一次只做一件事)。學習怎樣編寫修飾器,可以大幅度增加代碼的可讀性。它能改變函數的行為,而無需實際去改變函數的代碼(如添加日誌行等)。而修飾器是Python中非常常用的工具,用過Flask、Click等框架的人,都應該很熟悉修飾器,但許多人只知道怎麼用,卻不知道該怎麼寫。
  • Python和R之間轉換的基本指南:有效學習另一種語言的簡單方法
    重複這個詞很多次,並在許多不同的場景中使用它,把這個詞深深地刻在我的腦海裡。利用上下文線索使我能夠更好地理解這個詞在同義詞上的用法和原因。當你第一次學習編碼時,重複和語境化是必不可少的。通過不斷的重複,你開始記住詞彙和語法。通過項目開發,你能夠理解如何以及為什麼使用不同的功能和技術,並開始看到在不同的上下文環境中如何使用的代碼。
  • 職場經驗之15個你必須知道的Python面試題
    問題2填寫遺漏的代碼:def print_directory_contents(sPath):"""這個函數接受一個目錄的名稱 並且列印該目錄中的路徑文件包含目錄以及目錄中的任何文件這個函數類似於os.walk。但是請不要使用這個模塊系統。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • Python代碼性能調試和優化
    雖然再性能上語言的差異確實存在著明顯差異,但是我認為一個非常流行的語言,運行的快慢不會成為阻擾人們使用的因素。如果是的話,可能是由於編寫的程序有問題,需要優化。本文蟲蟲就給大家介紹一下如何調試Python應用的性能,以及怎麼對其進行優化。Python性能調試要進行Python性能,前提條件是要找出程序中的性能瓶頸。找出程序中影響程序性能的代碼。
  • 搭上python號小火箭,程序運行越來越快!
    這一方面和語言有關,另一方面可能就是你代碼的問題。其實,無論使用哪種程式語言,特定程序的運行速度很大程度上都取決於該程序的開發人員及其編寫快而優的程序的技巧和能力。語言方面的問題我們解決不了,所以只能在編程技巧上來提高程序的運行效率。是時候證明給那些python黑粉,讓他們看看如何提升Python程序性能並使其像坐上火箭一樣運行飛快!
  • 如何在Python中創建交互式可視化?(建議收藏)
    如何在Python中創建交互式可視化。在探索添加更多交互控制項之前,我們將僅以不同格式繪製數據開始。如果您一直關注我一段時間,會注意到這是數據可視化系列文章中的第三篇。首先使用默認的python可視化庫matplotlib引入了數據可視化。然後,我們學習了如何使用相同的庫在時間序列上創建動畫可視化效果。
  • 這些方法,能夠讓你的Python程序快如閃電
    而事實上,無論使用什麼程式語言,特定程序的運行速度很大程度上取決於編寫程序的開發人員以及他們優化程序、加快程序運行速度的技能。那麼,讓我們證明那些人錯了!本文將介紹如何提升 Python 程序的效率,讓它們運行飛快!計時與性能分析在開始優化之前,我們首先需要找到代碼的哪一部分真正拖慢了整個程序。
  • 學會這一招,圖形界面編程不再複雜,Python工具PyCharm使用技巧
    上一篇內容我們使用PyQt5構造了一個GUI程序的通用框架(圖形界面編程技巧,用Python中PyQt5庫快速創建一個應用程式框架)。這樣的圖形用戶接口相對來說比較簡單。我們知道,日常使用的圖形界面都是比較複雜的。
  • Python面試題庫,據說網易騰訊谷歌都在用!
    _lChildren.append(*args,**kwargs)def print_all_1(self):print selffor oChild in self.8、為什麼python中的lambda表單沒有語句?(1分)python中的lambda表單沒有語句,因為它用於創建新的函數對象,然後在運行時返回它們。9、Python中的pass是什麼意思?(1分)pass意味著沒有任何操作的Python語句,換句話說,它是複合語句中的一個佔位符,如果一個地方沒有什麼必須寫在那裡,就需要用上pass了。
  • Python の在 VSCode 中使用 IPython Kernel 的方法
    在 "setting.json" 中添加如下代碼並保存:"python.terminal.launchArgs": ["-m", "IPython", "--no-autoindent"], "multiCommand.commands": [ { "command": "multiCommand.executeIPython", "sequence"
  • 加快Python算法的四個方法(三)數據並行化
    接下來,我們將研究大多數情況下你將在Python中使用的一些方法。然後再介紹一下Dask和torch.multiprocessing。2.池和進程Python庫的Pool和Process方法都來自於multiprocessing它為我們的任務啟動了一個新的過程,但是方式有所不同。
  • Python 爬蟲面試題 170 道:2019 版
    31.如何實現 "1,2,3" 變成 ["1","2","3"]32.給定兩個 list,A 和 B,找出相同元素和不同元素33.[[1,2],[3,4],[5,6]]一行代碼展開該列表,得出[1,2,3,4,5,6]34.合併列表[1,5,7,9]和[2,2,6,8]35
  • 打工人打工魂,打工的必會java調用python的幾種用法
    interpreter = new PythonInterpreter(); interpreter.execfile("D:\\javaPythonFile.py"); }}輸出結果如下:注意:以上兩個方法雖然都可以調用python程序,但是使用Jpython調用的python庫不是很多,如果你用以上兩個方法調用,而python的程序中使用到第三方庫
  • python高階函數:map、filter、reduce的替代品
    什麼是高階函數?高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的內置函數,它的可選參數key用於提供一個函數,它可以將函數應用到各個元素上進行排序。
  • t檢驗中t值的意義 - CSDN
    下文簡述各種差異性檢驗思想(兩組樣本差異),同時結合scipy.stats文檔中的描述進行python實踐。參數檢驗在下文中,我們給出了兩個樣本,它們可以來自相同或不同的分布,我們想檢驗這些樣本是否具有相同的統計特性:比較均值t檢驗t檢驗適用於:正態分布、方差具有齊性的兩組間小樣本比較;對於大樣本不滿足正態分布的數據而言t-檢驗還是相當精確有效的手段。
  • 使用Python super方法為您的類增強
    在本教程中,您將了解以下內容:Python中的繼承概念Python中的多重繼承super()功能如何工作super()單繼承中的函數如何工作super()多繼承中的函數如何工作免費獎勵: 關於Python掌握的5個想法,Python開發人員的免費課程,向您展示將Python技能提升到新水平所需的路線圖和思維模式。
  • 使用Pandas,Seaborn和Plotly繪製漂亮的圖表
    您只需要CSV文件,即可使用Python輕鬆創建。 試試看!我目前的工作流程最終,我決定使用Pandas原始繪圖進行快速檢查,並使用Seaborn生成要在報告和演示文稿中使用的圖表(視覺效果很重要)。分布的重要性在聖地牙哥學習期間,我教過統計學(Stats 119)。 統計119是統計的入門課程。
  • 使用Jenkins、Docker 構建部署 Serverless 應用
    近日,使用 Serverless 開發了一個應用。其中 CI/CD,是需要考慮的一個問題。這裡用到了 Jenkins 和 Docker。並且 Jenkins Pipeline 運行在容器中。 本文將介紹如何使用 Jenkins 和 Docker 構建並部署 Serverless 應用。