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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...