你真的掌握了 Python 的七種參數了嗎?

不知道為什么網上總有人說 Python 的參數類型有 4 種啊,5 種啊,殊不知其實有 7 種。Python 的 7 種參數分別是?默認參數位置參數關鍵字參數可變長位置參數可變長關鍵字參數僅位置參數?和?僅關鍵字參數。小白可能沒見過“可變長參數”,但是大部分人可能都沒見過“僅參數”,“僅參數”一般只會在開發模塊時才會用到,那么我為什么會知道呢?您猜……下面就讓我為你細細道來。

先看段代碼,一般人可看不懂哦:

def function(a, /, b, c=1, *, d=2, **e) -> None: ...

上面的這段代碼是可以正常運行的,它幾乎體現了所有參數類型,幾乎哈,不是完全。因為有幾種參數類型互相之間無法共存。

一、默認參數(Default Parameter)

默認參數簡單,就是字面意思,當你不給它值的時候,它會有個默認值,因為某些時候不傳具體的值,是缺省的,因此它也叫缺省參數。

def function(default_parameter: int = 1) -> int:return default_parameter

上面的函數,若不傳值給它,它會默認返回 1,若是傳了值,那就返回你傳入的值。是不是很簡單?若是這樣想,那你就大錯特錯了,您猜下面的代碼輸出是什么?

def function(default_parameter=[1]) -> None:print(default_parameter)default_parameter.append(default_parameter[-1] + 1)function()
function()
function()

下面是輸出的結果:

[1]
[1, 2]
[1, 2, 3]

具體解釋見(鏈接文章的第七點):Python 易錯點大集合

這是默認參數中最常見的坑,一般人都會往里跳,曾經有個公司的業務代碼中就犯了這個致命錯誤,直接導致服務器崩潰,因為那個列表變得異常大……

二、位置參數(Positional Parameter)

位置參數就是我們天天用的了,喜聞樂見啊,大家都會用的那種。

def function(a: int, b: float, c: str) -> None:print(a + b, c)

所謂“位置”,意思就是參數是按位置來傳遞的,位置參數的位置不是嚴格要求的,你可以像關鍵字參數那樣傳參,舉個栗子:

def function(a: int, b: int) -> None:print(a, b)function(1, 2)
function(b=2, a=1)

?上面的兩種調用方式輸出結果相同,都是 1,2。實際上,位置參數的本質是用元組進行傳參,后面會細講。

三、關鍵字參數(Keyword Parameter)

關鍵字參數,也是從字面意思上就可以理解,它很“關鍵”,必須要指明它的名字來進行傳參,就這么簡單。

上面講位置參數的時候也講了一點關鍵字參數的內容,關鍵字參數不關心參數的位置,只要指明了參數名即可。關鍵字參數和位置參數類似,實際是用字典進行傳參,字典的鍵是參數名,字符串形式,值是對應參數的值。

四、可變長位置參數(Variable-length Positional Parameter)

?可變長位置參數,也叫變長位置參數或者不定長位置參數,一般寫作 *args,args 是英文單詞 argument 的復數形式的縮寫,“變長”是指參數的個數是不確定的意思,也就是說,它沒有參數數量的限制。

def function(*args: int) -> tuple[int]:for arg in args:print(arg)return argsfunction(1)
function(1, 2)
function(1, 2, 3)

上面的函數返回一個元組,也就是說,args 實際就是一個元組,這和位置參數是元組傳遞構成了某種聯系……

其實上面的代碼還可以這樣寫:

def function(*args: int) -> tuple[int]:print(*args)return args

有人在想,*args 是什么意思呢?這涉及到 Python 的序列解包知識(是不是又沒聽過這個呀?)具體內容見:Python 星號的妙用 —— 靈活的序列解包

print 函數就是 Python 中最典型的使用了可變長參數的函數,它的函數原型是這樣的(兩個重載):

def print(*values: object,sep: str | None = " ",end: str | None = "\n",file: SupportsWrite[str] | None = None,flush: Literal[False] = False,
) -> None: ...def print(*values: object,sep: str | None = " ",end: str | None = "\n",file: _SupportsWriteAndFlush[str] | None = None,flush: bool
) -> None: ...

?那個 *values 就是可變長參數了。實際上,位置參數就是可變長位置參數序列解包后再進行參數傳遞的,而可變長位置參數是直接整個元組進行傳值的。

那么我們擴展延伸一下,大家是不是總在網上看到說 Python 的函數可以有多個返回值?這是真的嗎?這是錯誤的認知!實際上,Python 的函數返回值仍然只有一個,當寫出多個值的時候,Python 自動給你弄成元組了,下面的代碼可以驗證:

def function():a = 1b = 2return a, bc = 1, 2print(type(c))
print(type(function()))

輸出結果都是 tuple。?

五、可變長關鍵字參數(Variable-length Keyword Parameter)

可變長關鍵字參數呢,可以類比可變長位置參數,將元組換成字典就行,其他的都一樣,這里就不再贅述了。

六、僅位置參數(Position-only Parameter)

好,終于到重點了,看僅位置參數之前先給大家介紹一位兄弟,就是一個斜杠(/),它在 Python 里面不僅僅是除法的含義,還有一個含義,而且有專門的名字,叫 僅位置參數分隔符(Position-only argument separator),不知有多少人認識這位兄弟呀?

在參數列表中就直接寫一個斜杠就行,它強制其前面的參數是位置參數,無法用關鍵字參數進行傳遞!

在 Python 的內置函數 isinstance 中就有出現:

def isinstance(__obj: object,__class_or_tuple: _ClassInfo,/  # 這里!這里!這兒出現了僅位置參數分隔符!
) -> bool

在 int 中也有:

class int(__x: str | ReadableBuffer | SupportsInt | SupportsIndex | SupportsTrunc = ...,/  # 這里!這里!這兒有僅位置參數分隔符!
)

我對這個東西給的理解是(非官方理解),這個東西的作用一般是為了防止一些一般人看不懂代碼,有些東西是約定俗成的,不需要刻意地寫出來,比如參數名,畢竟你見過誰用 int 的時候像下面這樣寫了???

int(__x=1)

上面是錯誤的代碼!盡管這個參數名確實是 __x,但是僅位置參數分隔符強制了它為位置參數,不允許將 __x 寫出來(寫出來就是關鍵字參數了)!?且寫出來只會讓人誤解且讀起來費勁!

七、僅關鍵字參數(Keyword-only Parameter)

同樣的,看僅關鍵字參數之前先給大家介紹一位兄弟,就是一個星號(*),它在 Python 里面不僅僅是乘法的含義,以及序列解包的含義,還有一個含義,而且也有專門的名字,叫 僅關鍵字參數分隔符(Keyword-only argument separator),不知又有多少人認識這位兄弟呀?

在參數列表中就直接寫一個星號就行,它強制其后面的參數是關鍵字參數,無法用位置參數的方式進行參數傳遞!

我對這個理解(非官方理解)是,它非常方便于修改模塊和項目,對不同版本的兼容性很好,不像位置參數,一旦中間少了或者多了一個參數,后面的參數全部錯位,導致出現不可預計的問題。而這個僅關鍵字參數分隔符寫了之后可以強制別人用你的函數時必須按照關鍵字參數的方式進行傳遞,防止出現參數錯位的情況。這個一般在參數比較多的情況下會使用,比如 Python 內置模塊 tkinter 某些控件類初始化的參數,多到離譜:

def __init__(self: Canvas,master: Misc | None = None,cnf: dict[str, Any] | None = {},*,  # 這里!這里!這兒有個僅關鍵字參數分隔符!background: str = ...,bd: _ScreenUnits = ...,bg: str = ...,border: _ScreenUnits = ...,borderwidth: _ScreenUnits = ...,closeenough: float = ...,confine: bool = ...,cursor: _Cursor = ...,height: _ScreenUnits = ...,highlightbackground: str = ...,highlightcolor: str = ...,highlightthickness: _ScreenUnits = ...,insertbackground: str = ...,insertborderwidth: _ScreenUnits = ...,insertofftime: int = ...,insertontime: int = ...,insertwidth: _ScreenUnits = ...,name: str = ...,offset: ... = ...,relief: _Relief = ...,scrollregion: tuple[_ScreenUnits, _ScreenUnits, _ScreenUnits, _ScreenUnits] | tuple[()] = ...,selectbackground: str = ...,selectborderwidth: _ScreenUnits = ...,selectforeground: str = ...,state: Literal['normal', 'disabled'] = ...,takefocus: _TakeFocusValue = ...,width: _ScreenUnits = ...,xscrollcommand: _XYScrollCommand = ...,xscrollincrement: _ScreenUnits = ...,yscrollcommand: _XYScrollCommand = ...,yscrollincrement: _ScreenUnits = ...
) -> None

講完了,現在有個問題,看完這些知識的你,回過頭再看開篇的那段代碼,你能說出哪些參數類型互相之間是沖突和矛盾,導致無法并存的嗎?評論區里留下你的答案(我不會寫出答案的【doge】)?


我本人平時就在自己寫一些模塊的代碼,所以呢,對這些比較了解,它們都是 Python 的編程利器!建議大家也掌握這些知識,雖然可能沒什么用,但是技多不壓身啊!

看到這里,不知您是否漲知識了呢?喜歡的話不妨?點贊收藏?加?轉發??如果可以 關注 的話,那更好了!!!

該文章已被收入到專欄中,專欄在文章頂部可以看到,里面有更多讓你匪夷所思的 Python 知識!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41439.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

lvs-dr模式

一,數據包流向: 1,cilent向目標vip發出請求,dir接收,此時ip報頭數據幀頭信息。 2,dir根據負載均衡算法給rs(rip),將rip所在網卡的mac地址作為目標的mac地址,發…

深入解析Spring基本概念和核心思想

文章目錄 基本概念IoCIoc容器IoC理解IoC的步驟Spring中使用ioc的步驟 AopAop的理解Aop的步驟 控制反轉誰控制誰? 控制什么?為何叫反轉(對應于正向)?哪些方面反轉了?為何需要反轉? 依賴什么是依賴(按名稱理解、按動詞理解)? 誰依賴于誰? 為什么需要依賴? 依賴什么東西?…

vscode如何漢化

首先我們到vscode官網下載 鏈接如下: Visual Studio Code - Code Editing. Redefined 根據自己需要的版本下載就好 下載并且安裝完畢之后 運行vscode 然后按快捷鍵 CTRLSHIFTX 打開安裝擴展界面 搜索簡體中文 安裝就可以了 謝謝大家觀看

npm ERR!Cannot read properties of null(reading ‘pickAlgorithm’)報錯問題解決

當在使用npm包管理器或執行npm命令時,有時候會遇到“npm ERR!Cannot read properties of null(reading ‘pickAlgorithm’)”這個錯誤提示,這是一個常見的npm錯誤。 這個錯誤提示通常說明在使用npm包管理器時,執行了某個npm命令,…

學習筆記整理-正則表達式-01-認識正則

一、基本認識 1. 什么是正則表達式 正則表達式(regular expression)描述了字符串"構成模式",經常被用于檢查字符串是否符合預定的格式要求。 用一個例子快速演示正則表達式基本使用方法:檢查某個字符串是否是6位數字 // 要檢查的字符串va…

第五課:聯合體或共用體 Union

功能描述:聯合體或共用體 Union 的介紹及使用方法 一、Union 簡介 共同體(union)也稱為聯合體,它能在同一個內存空間中存儲不同的數據類型(不是同時存儲),其典型的用法是,設計一種表…

Vue3 —— watchEffect 高級偵聽器

該文章是在學習 小滿vue3 課程的隨堂記錄示例均采用 <script setup>&#xff0c;且包含 typescript 的基礎用法 前言 Vue3 中新增了一種特殊的監聽器 watchEffect&#xff0c;它的類型是&#xff1a; function watchEffect(effect: (onCleanup: OnCleanup) > void,o…

整理mongodb文檔:find方法查詢數據

個人博客 整理mongodb文檔:find方法查詢數據 求關注&#xff0c;求批評&#xff0c;求指出&#xff0c;如果哪兒不清晰&#xff0c;請指出來&#xff0c;謝謝 文章概敘 如題&#xff0c;本文講的是如何用find查詢數據&#xff0c;如何在數組、字段、對象中查詢&#xff0c;以…

自然語言處理技術:NLP句法解析樹與可視化方法

自然語言處理(Natural Language Processing,NLP)句法解析樹是一種表示自然語言句子結構的圖形化方式。它幫助將句子中的每個詞匯和短語按照語法規則連接起來,形成一個樹狀結構,以便更好地理解句子的語法結構和含義。句法解析樹對于理解句子的句法關系、依存關系以及語義角…

Python實現輕量級WEB服務器接收HTTP提交的RFID刷卡信息并回應驅動讀卡器顯示播報語音

本示例使用的設備&#xff1a;RFID網絡WIFI無線TCP/UDP/HTTP可編程二次開發讀卡器POE供電語音-淘寶網 (taobao.com) # -*- coding: utf-8 -*- import time import datetime import socket import threading#將中文信息轉換編碼&#xff0c;顯示文字、TTS語音都需要轉換-------…

從入門到精通Python隧道代理的使用與優化

哈嘍&#xff0c;Python爬蟲小伙伴們&#xff01;今天我們來聊聊如何從入門到精通地使用和優化Python隧道代理&#xff0c;讓我們的爬蟲程序更加穩定、高效&#xff01;今天我們將對使用和優化進行一個簡單的梳理&#xff0c;并且會提供相應的代碼示例。 1. 什么是隧道代理&…

SpringCloud Gateway:status: 503 error: Service Unavailable

使用SpringCloud Gateway路由請求時&#xff0c;出現如下錯誤 yml配置如下&#xff1a; 可能的一種原因是&#xff1a;yml配置了gateway.discovery.locator.enabledtrue&#xff0c;此時gateway會使用負載均衡模式路由請求&#xff0c;但是SpringCloud Alibaba刪除了Ribbon的…

無涯教程-Perl - setpwent函數

描述 此功能將枚舉設置(或重置)到密碼條目集的開頭。應該在第一次調用getpwent之前調用此函數。 語法 以下是此函數的簡單語法- setpwent返回值 此函數不返回任何值。 例 以下是顯示其基本用法的示例代碼- #!/usr/bin/perlwhile(($name, $passwd, $uid, $gid, $quota, …

C++寫文件,直接寫入結構體

C寫文件&#xff0c;直接寫入結構體 以前寫文件都是寫入字符串或者二進制再或者就是一些配置文件&#xff0c;今天介紹一下直接寫入結構體&#xff0c;可以在軟件參數較多的時候直接進行讀寫&#xff0c;直接將整個結構體寫入和讀取&#xff0c;看代碼&#xff1a; #include&…

tomcat中的BIO與NIO發展

tomcat中的NIO發展 前言 Tomcat目前支持BIO&#xff08;阻塞 I/O&#xff09;、NIO&#xff08;非阻塞 I/O&#xff09;、AIO&#xff08;異步非阻塞式IO&#xff0c;NIO的升級版&#xff09;、APR&#xff08;Apache可移植運行庫&#xff09;模型&#xff0c;本文主要介紹NI…

iceberg系列之 hadoop catalog 小文件合并實戰

背景 flink1.15 hadoop3.0pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…

UBuntu18.04 Qt之雙HDMI屏切換

UBuntu18.04 Qt之雙HDMI接2個4K屏并分別設置分辨率、主屏、副屏 一、設置HDMI-2為主屏 在main函數里面添加&#xff1a; #include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);{long nTotal 0;c…

spring cloud gateway中配置uri

gateway中配置uri配置有三種方式: websocket方式&#xff1a;uri: ws://localhost:9000http方式: uri: http://localhost:8130/lb注冊中心配置方式&#xff08;注冊的服務名稱&#xff09;: uri: lb://monitor-ms gateway的lb方式識別的服務名稱命名規則&#xff1a; "[…

設計模式——適配器模式

引入實例 說起適配器其實在我們的生活中是非常常見的&#xff0c;比如&#xff1a;學校的宿舍的電壓都比較低&#xff0c;而有的學生想使用大功率電器&#xff0c;宿舍的就會跳閘&#xff0c;然而如果你使用一個適配器&#xff08;變壓器&#xff09;就可以使用了&#xff08;…

Jtti:windows虛擬內存最小值太低如何解決

當Windows虛擬內存的最小值設置過低時&#xff0c;可能會導致系統性能下降、應用程序崩潰甚至系統不穩定。解決方法包括&#xff1a; 調整虛擬內存設置&#xff1a; 可以通過以下步驟調整虛擬內存的設置&#xff1a; 右鍵點擊“此電腦”或“計算機”&#xff0c;選擇“屬性”。…