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