Python 函数参数传递
前言
Python 的函數參數傳遞相對于 C++來說更加靈活,并且使用也很方便,這里做下簡單的總結。
正文
實參和形參
實參:在調用函數時提供的函數參數稱為實參。
形參:定義函數時,函數中的變量成為形參。
傳遞實參
位置實參
這個沒什么好說,和其他編程語言用法一樣,直接按照位置順序傳遞即可。示例如下:實參和形參的位置一一對應,所以參數的順序很重要。
def fun(name,age):print("name = ",name,"age = ",age)fun("Jack",28)關鍵字實參
這種用法就和其他編程語言有點區別了,所謂的關鍵實參是傳遞給函數的名字-值對。直接在實參中將名稱和值對應起來,因此在向函數傳遞實參時不會混淆,這種用法無需考慮順序,還清楚的指出了函數調用中各個值的用途,示例如下:
def fun(name,age):print("name = ",name,"age = ",age)fun(name="Jack",age=28)也可以寫成
fun(age=28,name="Jack")其結果都是一樣的。
默認參數
這種用法也似曾相識,編寫函數時,可給每個形參指定默認值。而在調用函數時 如果如果沒有傳入實參,那么函數就會默認使用形參值。使用默認值可簡化函數調用,還清楚地指出函數的典型用法。
示例如下:
這里的函數調用也可以寫成:
fun("Jack",28)當然,還可以按照關鍵字實參的方式來調用:
fun(name="Jack")需要注意的是:使用默認參數時,在形參列表中必須先列出沒有默認值的參數,再列出有默認值的形參,這讓 Python 依然能夠正確地解讀位置實參。
打個比方, 上面的函數定義不能寫成如下形式:
寫成這樣會報錯:
SyntaxError: non-default argument follows default argument這和 C++的函數默認參數用法也是一樣的。
傳遞列表
可以直接向函數傳遞列表,這種列表包含的可能是名字,數字或更復雜的對象(如字典),將列表傳遞給函數后,函數就能直接訪問其內容。
def fun(names):for name in names:print("name = ",name)names=["Jack","Eric","John"] fun(names)輸出:
name = Jack name = Eric name = John函數中修改列表
當向函數中傳遞列表時,可以直接在函數中對列表進行修改,示例如下:
def fun(names):for name in names:print("name = ",name)names[0]="Sanny"names=["Jack","Eric","John"] print("before names = ",names) fun(names) print("after names = ",names)輸出:
before names = ['Jack', 'Eric', 'John'] name = Jack name = Eric name = John after names = ['Sanny', 'Eric', 'John']可以看到,這里的列表已經發生了變化。
禁止函數修改列表
如果要不想要函數中修改列表內容怎么辦呢?可以在傳遞的時候將列表的副本傳遞給函數,其實相當于另外開辟了空間,將列表值賦值給新地址后再傳遞。示例如下:
def fun(names):for name in names:print("name = ",name)names[0]="Sanny"names=["Jack","Eric","John"] print("before names = ",names) fun(names[:]) print("after names = ",names)這里只是將函數調用方式寫成:fun(names[:])
輸出如下:
可以看到列表內容并沒有發生變化。
注意:雖然想函數傳遞列表的副本可保留原始列表的內容,但除非有充分的理由需要傳遞副本,否則還是應該講原始列表傳遞給函數,因為讓函數使用現成列表可避免花時間和內存創建副本,從而提高效率在處理大型列表時尤其如此。
傳遞任意參數的實參
有時候,你預先不知道函數需要接受多少個實參,好在Python 允許函數從調用語句中手機任意數量的實參。
示例如下:
輸出如下:
names = ('Jack',) names = ('Jack', 'Eric', 'John')可以看到這里函數可以傳遞任意多的實參。
形參名*names 中的星號讓 Python 創建一個名為 names 的空元組,并將收到的所有值都封裝到這個元組中,即便函數只傳遞了一個值也是如此。
然而,還可以給函數傳遞任意多的列表參數,并且可以直接在函數中對列表參數進行修改。示例如下:
def fun(*names):print("names = ",names)names[0][0] = "aaa"names=["Jack","Eric","John"] names_2=["mark","kiko"]fun(names,names_2) print(" after names = ",names)輸出如下:
names = (['Jack', 'Eric', 'John'], ['mark', 'kiko']) after names = ['aaa', 'Eric', 'John']這里的第一個列表數據已經在函數中被修改了。
結合使用位置實參和任意數量實參
如果要讓函數接收不同類型的實參,那么必須在函數定義中將接納任意數量實參的形參放在最后。Python 先匹配位置實參和關鍵字實參,再將剩下的實參都收集到最后一個形參中。
示例如下:
輸出:
num = 5 names = (['Jack', 'Eric', 'John'], ['mark', 'kiko'])使用任意數量的關鍵字實參
除了位置實參和任意數實參結合使用,關鍵字實參也可以和任意數實參集合使用。
有時候,需要接受任意數量的實參,但預先不知道傳遞給函數的會是什么樣的信息,這種情況下,可將函數編寫成能夠接受任意數量的鍵值對—調用語句提供了多少就接受多少。
輸出:
profile = {'first': 'aaa', 'last': 'bbb', 'name': 'hello', 'field': 'world'}這里的形參**user_info中的兩個星號讓 Python 創建一個名為user_info的空字典,并將收到的所有鍵值對都封裝到這個字典中。在這個字典中,可以像訪問其它字典那樣訪問user_info中的鍵值對。
最后
可以看到,Python 的這種函數調用非常靈活,嘗試不同的調用會發現可以擴展很多其他的用法,對實際項目中有很大的幫助。
總結
以上是生活随笔為你收集整理的Python 函数参数传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 列表拷贝
- 下一篇: Python Json存储与读取