Python深入理解*和**含義和應用

来源:https://www.cnblogs.com/obullxl/p/18170925/NTopic2024050201
-Advertisement-
Play Games

本文源代碼:https://gitee.com/obullxl/PythonCS/tree/master/CS-CY2405 Python中*和**很常見 禪師在閱讀Python代碼過程中,經常看到一個函數或方法的入參是*args和**kwargs(如:def func(*args, **kwarg ...


本文源代碼:https://gitee.com/obullxl/PythonCS/tree/master/CS-CY2405

Python中*和**很常見

禪師在閱讀Python代碼過程中,經常看到一個函數或方法的入參是*args**kwargs(如:def func(*args, **kwargs)等)形式,或者在調用函數或方法時,在入參的元組和列表前面增加1個*號(如:func(*(1, 2, 3))等),或者在字典類型入參前面增加2個*號(如:func(**{'x':1, 'y':2, 'z':3})等)。

剛開始看到參數前面*號,禪師一度以為是C/C++中的指針,但在萬物皆對象的Python種,指針是不會存在的。本文我們一起來看看1個*號和2個**號的含義和用法,也讓我們來感受一下Python靈活性有多強大。

位置參數和命名參數

在瞭解函數入參*args**kwargs之前,我們首先要瞭解一下函數或方法的位置參數和命名參數,以函數定義def func(a, b, c, x=None, y=None, z=None)為例:

  • 位置參數通俗的講就是參數的位置的固定的,與函數或方法的參數名無關,比如函數或方法的第1個參數、第2個參數等。樣例函數的a/b/c入參就是位置參數,他們分別在函數的第1到第3個參數。Python語法規定,位置參數只能在函數或方法前面的參數(即中間不能有位置參數)。

  • 命名參數通俗的講就是參數是有名字,在調用函數或方法時,需要指定參數的名稱,命名參數可以有預設值。樣例函數的x/y/z入參就是命名參數,x/y/z就是參數的名稱,且他們均有None預設值。Python語法規定,位置參數只能在函數或方法後面的參數(即中間不能有位置參數)。

1個*和2個**的作用

其實從函數入參能看出來,1個*是位置參數,2個**是命名參數,那麼它們到底有什麼作用呢:

  • 函數或方法的定義,如def func(*args, **kwargs)1個*的作用是收集調用本函數的所有的位置參數,收集後的類型是元組;2個**的作用也是參數收集,只是收集的是命名參數,收集後的結果是字典(在Java中稱為Map)。

  • 函數或方法的調用,如func(*(1, 2, 3), **{x=4, y=5, z=6}):*的作用是拆解,與收集相反;其中,1個*為把元組或列表按照順序拆開,作為位置入參,2個**則把字典按照命名參數拆開。

例:定義函數或方法(參數收集)

def mfunc(*args, **kwargs):
    '''
    函數定義:收集參數,*把所有的位置參數收集到一個元組中,**則把最後的命名參數組裝成Map字典。
    '''
    print(f'{type(args)} args = {args}')
    print(f'{type(kwargs)}  kwargs = {kwargs}')


mfunc()
mfunc(1, 2, 3, x='a', y='b')
mfunc(1, 2, ('t1', 't2'), ['t1', 't2'], {'k1': 'v1', 'k2': 'v2'}, x='a', y='b')

'''
入參拆解參數,定義收集參數,相互抵消,無實際意義。
'''
mfunc(*(1, 2, 3), **{'k1': 'v1', 'k2': 'v2'})

例:調用函數或方法(拆解或映射)

def mprint(x, y):
    '''
    函數調用:拆解參數,*把元組或列表按照順序拆開,作為入參,**則把Map字典按照命名參數拆開。
    '''
    print(f'{type(x)} x = {x}')
    print(f'{type(y)} y = {y}')


mprint(*(1, 2))
mprint(*((1, 2), 3))
mprint(**{'x': 'x1', 'y': 'y1'})

特別註意:拆解位置參數數量需要與函數或方式定義一致,或者拆解命名參數的參數名需要與定義一致!

禪定:Python為什麼需要*和**?

從前面的分析可以看出***的作用和用法,Python中它們是必須的嗎?禪師答案:

  • 函數和方法定義中是必須的:舉個反射的簡單場景,函數入參的個數、類型是動態的,因此需要收集(如:Java中為Object[]數組)

函數和方法調用是可選的,目的是為了簡化編程(Python之禪:Beautifulis better than ugly.),不需要手工逐個參數設置,如調用函數入參func(*my_lsit, **my_dict)就明顯比func(my_list[0], my_list[1], my_list[2], my_dict['x'], my_dict['y'], my_dict['z'])優雅太多了。


我的本博客原地址:https://ntopic.cn/p/2024050201


微信公眾號:Python禪師

本文作者:奔跑的蝸牛,轉載請註明原文鏈接:https://ntopic.cn


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是雙向綁定 我們先從單向綁定切入單向綁定非常簡單,就是把Model綁定到View,當我們用JavaScript代碼更新Model時,View就會自動更新雙向綁定就很容易聯想到了,在單向綁定的基礎上,用戶更新了View,Model的數據也自動被更新了,這種情況就是雙向綁定舉個慄子 當用戶填寫表 ...
  • 透明傳輸,顧名思義,是指在傳輸過程中對外界完全透明,不需要關註傳輸過程以及傳輸協議,最終目的是要把傳輸的內容原封不動地傳遞給接收端,發送和接收的內容完全一致。在無線模塊中,透明傳輸通常是通過特定的技術和機制來實現的。 無線模塊透明傳輸的原理主要基於串口數據的透明傳輸。這種傳輸方式下,無線模塊被配置為 ...
  • 理論(後半部分有實操詳解) 哲學思考 易經思維:向各國人講述一種動物叫烏龜,要學很久的各國語言,但是隨手畫一個烏龜,全世界的人都能看得懂。 道家思維:努力沒有用(指勞神費心的機械性重覆、肢体受累、刻意行為),要用心(深度思考、去感悟、透過現象看本質)才有用。 舉例:類似中學做不出來的幾何題的底層原理 ...
  • 前言 在.NET生態中,Serilog憑藉其強大的結構化日誌記錄功能和與Seq的無縫集成,已經成為許多開發者的首選日誌記錄工具。Seq作為一個日誌檢索和儀錶板工具,能夠將日誌中的插值轉換為結構化數據,極大地方便了開發者快速檢索日誌、定位問題併進行簡單的統計分析。這種便捷性讓人難以割捨。 背景 最近需 ...
  • PV 與 PVC PVC (PersistentVolumeClaim),命名空間(namespace)級別的資源,由 用戶 or StatefulSet 控制器(根據VolumeClaimTemplate) 創建。PVC 類似於 Pod,Pod 消耗 Node 資源,PVC 消耗 PV 資源。Po ...
  • C-08.索引的創建和設計原則 1.索引的聲明和使用 1.1 索引的分類 MySQL的索引包括普通索引、唯一性索引、全文索引、單列索引、多列索引和空間索引等。 從功能邏輯上分類,索引主要有4種,分別是普通索引,唯一索引,主鍵索引,全文索引。 按照物理實現方式,索引可以分為2種,聚簇索引和非聚簇索引。 ...
  • title: 深入 Django 模型層:資料庫設計與 ORM 實踐指南 date: 2024/5/3 18:25:33 updated: 2024/5/3 18:25:33 categories: 後端開發 tags: Django ORM 模型設計 資料庫關係 性能優化 數據安全 查詢操作 模型 ...
  • orion-ops-pro —— 一款現代化、高顏值的一站式智能運維管理平臺,集資產管理、資產授權、批量執行、計劃任務、WebShell、WebSftp、角色管理、系統管理等功能於一體,致力於簡化運維團隊的治理工作。 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...