淺談Python 參數(shù)與變量
形參與實參以及位置參數(shù)
什么是形參和實參
- 形參:即形式參數(shù),函數(shù)定義時指定的可以接受的參數(shù)即為形參,比如定義函數(shù)時的max(a,b)函數(shù)中的a和b就是形參
- 實參:即實際參數(shù),調(diào)用函數(shù)時傳遞給函數(shù)參數(shù)的實際值即為實參,比如調(diào)用上面函數(shù)用 max(1, 9)函數(shù)中的1和9就是實參;
什么是位置參數(shù)
- 我們定義函數(shù)max(a,b)后,在調(diào)用時,我們無需指定參數(shù)名,只需max(1,9),這個時候?qū)崊⑷雲(yún)⒌牡奈恢眠M行匹配,也就是在函數(shù)中,a=1,b=9。
- 當(dāng)然,如果我們不想基于位置順序,也可以直接指定對應(yīng)的參數(shù)名,比如max(b=9,a=1),這個時候調(diào)用后,不會按入?yún)㈨樞蛸x值,而是直接按指定的參數(shù)名賦值。
默認參數(shù)
編寫一個計算x的n次冪的函數(shù),要求x、n可以作為參數(shù)傳入
def power(x, n): return x ** n print(power(2,2))
上面的函數(shù)雖然解決了問題,但是顯然不夠完美,假設(shè)在大部分的調(diào)用里,基本都只是求x的2次冪,但是這個時候我在調(diào)用的時候依舊每次都得傳n,這就顯得有點多余。有沒有什么方法可以讓我調(diào)用的時候少些一個入?yún)⒛兀?/p>
如果我們直接 print(power(2)),會發(fā)現(xiàn)這個時候行不通,有錯誤。
在函數(shù)入?yún)⑻?,使用等號賦值默認參數(shù),
def power(x, n=2): return x ** n print(power(2))
注意:必需要的參數(shù)在前,默認參數(shù)在后,否則會報錯
如果有多個默認參數(shù)呢?
def test(a=1, b=2, c=3): print("a=%d b=%d c=%d" % (a, b, c)) test(c=2)
當(dāng)有多個默認參數(shù)的時候,可以顯式指定傳入某個參數(shù)的值,在調(diào)用函數(shù)時,入?yún)⑹褂脜?shù)名=參數(shù)值的形式即可
如果默認參數(shù)是一個列表呢?
def test(L=[]): L.append("END") print(L) test([1, 1, 1]) test([2, 2, 2])
上面的程序運行起來似乎看不出啥問題,但是,我們來看一個奇怪的現(xiàn)象:在調(diào)用test函數(shù)的時候不傳入任何參數(shù),此時,輸出的結(jié)果變得有點詭異
def test(L=[]): L.append("END") print(L) test() test()
輸出結(jié)果:
['END']
['END', 'END']
函數(shù)在定義的時候,默認參數(shù)的值已確定,換句話說,L指向的地址是確定,之后如果還是對其內(nèi)容進行更改的話,默認參數(shù)的值也隨之改變了
注意:默認參數(shù)必須指向不可變對象
可變參數(shù)
什么是可變參數(shù)?
顧名思義就是調(diào)用函數(shù)時,傳遞參數(shù)的個數(shù)的可變的。
如果不使用可變參數(shù),目前有哪些方式可以實現(xiàn)傳入不確定個數(shù)的 list、dict、set等
def sum(numbers): total = 0 for i in numbers: total += i return total print(sum([1, 2, 3]))
上面這種寫法,雖然可以實現(xiàn)不確定個數(shù)的入?yún)?,但是調(diào)用方并不清楚入?yún)⒃撌悄姆N類型,此時調(diào)用方還得看函數(shù)的具體實現(xiàn)方知入?yún)⒁强傻愋停詫φ{(diào)用方不友好
可變參數(shù)的基本格式
在定義函數(shù)的時候,入?yún)⑶凹?號,表示可變參數(shù),如
def sum(*numbers): total = 0 for i in numbers: total += i return total print(sum(1, 2, 3))
可變參數(shù),其實是將入?yún)⒎庋b成元組
def my_fun(*numbers): print(type(numbers)) total = 0 for i in numbers: total += i return total print(my_fun(1, 2, 3)) 輸出結(jié)果: <class 'tuple'> 6
命名關(guān)鍵字參數(shù)
我們先來看看之前最普通的入?yún)⒎绞?-位置參數(shù)
def person(name, age): print(name,age) person("wiggin",29)
這種方式無需指定入?yún)⒌拿郑灰恢孟鄬?yīng),就可以。
與位置參數(shù)相對的另一種方式,是每次調(diào)用的時候,都必需指定參數(shù)的名字,也就是命名關(guān)鍵字
什么是命名關(guān)鍵字參數(shù)
- 限制調(diào)用者不能按位置傳遞,需要放在形參的后面,并在前面使用星號*(獨占一個參數(shù)位)與普通形參分隔
為什么要有命名關(guān)鍵字參數(shù)
- 為了限制后面幾個參數(shù)只能按關(guān)鍵字傳遞,這往往是因為后面幾個形參名具有十分明顯的含義,顯式寫出有利于可讀性;或者后面幾個形參隨著版本更迭很可能發(fā)生變化,強制關(guān)鍵字形式有利于保證跨版本兼容性
- 與位置參數(shù)相對的另一種方式,是每次調(diào)用的時候,都必需指定參數(shù)的名字,也就是命名關(guān)鍵字
命名關(guān)鍵字用法
def person(name, age, *, pet): print(name,age,pet) person("wiggin",29,pet="tomcat")
命名關(guān)鍵字使用*做分隔,*之前的參數(shù),基于位置參數(shù),*后面的參數(shù),在調(diào)用的時候必需指定其參數(shù)名
一旦使用命名關(guān)機字之后,如果調(diào)用時,沒指定參數(shù)名,會報相應(yīng)的錯誤
def person(name, age, *, pet): print(name,age,pet) person("wiggin",29,"tomcat")TypeError: person() takes 2 positional arguments but 3 were given
TypeError: person() takes 2 positional arguments but 3 were given
*后面的參數(shù),同樣也可以使用默認參數(shù)進行設(shè)置
def person(name, age, *, pet="cat"): print(name,age,pet) person("wiggin",29)
注意:如果函數(shù)定義中已經(jīng)有了一個可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個特殊分隔符
關(guān)鍵字參數(shù)
什么是關(guān)鍵字參數(shù)?
關(guān)鍵字參數(shù)允許你傳入0個或任意個含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動組裝為一個dict。
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) person("wiggin",29,city="廣州",pet="cat")
也可以使用下面的方式傳參
def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) other_info = {"pet": "cat"} person("wiggin",29,city="廣州",**other_info)
other_info表示把other_info這個dict的所有key-value用關(guān)鍵字參數(shù)傳入到函數(shù)的**kw參數(shù),kw將獲得一個dict,注意kw獲得的dict是other_info的一份拷貝,對kw的改動不會影響到函數(shù)外的other_info。
混合使用參數(shù)
本章之前所學(xué)習(xí)的各種類型的參數(shù),可以在定義函數(shù)時混合使用,但是,有一個核心注意的點:混合使用時,參數(shù)定義的順序必須是:必選參數(shù)、默認參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
以上就是淺談Python 參數(shù)與變量的詳細內(nèi)容,更多關(guān)于Python 參數(shù)與變量的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python中的數(shù)據(jù)對象持久化存儲模塊pickle的使用示例
這篇文章主要介紹了Python中的數(shù)據(jù)對象持久化存儲模塊pickle的使用示例,重點講解了pickle中模塊中對象持久化和文件讀取的相關(guān)方法,需要的朋友可以參考下2016-03-03django通過ajax發(fā)起請求返回JSON格式數(shù)據(jù)的方法
這篇文章主要介紹了django通過ajax發(fā)起請求返回JSON格式數(shù)據(jù)的方法,較為詳細的分析了django處理ajax請求的技巧,需要的朋友可以參考下2015-06-06使用Python實現(xiàn)下載網(wǎng)易云音樂的高清MV
本文給大家分享的是一則使用Python實現(xiàn)下載網(wǎng)易云音樂中高清MV的代碼,本人新手,沒有做特別的功能,僅僅是直接循環(huán)了MV的id,小伙伴們可以自己擴展下。2015-03-03PyTorch實現(xiàn)手寫數(shù)字的識別入門小白教程
這篇文章主要介紹了python實現(xiàn)手寫數(shù)字識別,非常適合小白入門學(xué)習(xí),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06Python?+?Selenium?實現(xiàn)模擬登錄jd實例分享
這篇文章主要介紹了Python?+?Selenium?實現(xiàn)模擬登錄jd實例分享的相關(guān)資料,需要的朋友可以參考下2023-06-06Python自動化測試pytest中fixtureAPI簡單說明
這篇文章主要為大家介紹了Python自動化測試pytest中fixtureAPI的簡單說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10Python實現(xiàn)接受任意個數(shù)參數(shù)的函數(shù)方法
下面小編就為大家分享一篇Python實現(xiàn)接受任意個數(shù)參數(shù)的函數(shù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04