1. 程式人生 > 程式設計 >淺談Python 引數與變數

淺談Python 引數與變數

形參與實參以及位置引數

什麼是形參和實參

  • 形參:即形式引數,函式定義時指定的可以接受的引數即為形參,比如定義函式時的max(a,b)函式中的a和b就是形參
  • 實參:即實際引數,呼叫函式時傳遞給函式引數的實際值即為實參,比如呼叫上面函式用 max(1,9)函式中的1和9就是實參;

什麼是位置引數

  • 我們定義函式max(a,b)後,在呼叫時,我們無需指定引數名,只需max(1,9),這個時候實參入參的的位置進行匹配,也就是在函式中,a=1,b=9。
  • 當然,如果我們不想基於位置順序,也可以直接指定對應的引數名,比如max(b=9,a=1),這個時候呼叫後,不會按入參順序賦值,而是直接按指定的引數名賦值。

預設引數

編寫一個計算x的n次冪的函式,要求x、n可以作為引數傳入

def power(x,n):
 return x ** n

print(power(2,2))

上面的函式雖然解決了問題,但是顯然不夠完美,假設在大部分的呼叫裡,基本都只是求x的2次冪,但是這個時候我在呼叫的時候依舊每次都得傳n,這就顯得有點多餘。有沒有什麼方法可以讓我呼叫的時候少些一個入參呢?

如果我們直接 print(power(2)),會發現這個時候行不通,有錯誤。

在函式入參處,使用等號賦值預設引數,

def power(x,n=2):
 return x ** n

print(power(2))

注意:必需要的引數在前,預設引數在後,否則會報錯

如果有多個預設引數呢?

def test(a=1,b=2,c=3):
 print("a=%d b=%d c=%d" % (a,b,c))

test(c=2)

當有多個預設引數的時候,可以顯式指定傳入某個引數的值,在呼叫函式時,入參使用引數名=引數值的形式即可

如果預設引數是一個列表呢?

def test(L=[]):
 L.append("END")
 print(L)

test([1,1,1])
test([2,2,2])

上面的程式執行起來似乎看不出啥問題,但是,我們來看一個奇怪的現象:在呼叫test函式的時候不傳入任何引數,此時,輸出的結果變得有點詭異

def test(L=[]):
 L.append("END")
 print(L)

test()
test()

輸出結果:

['END']
['END','END']

函式在定義的時候,預設引數的值已確定,換句話說,L指向的地址是確定,之後如果還是對其內容進行更改的話,預設引數的值也隨之改變了

注意:預設引數必須指向不可變物件

可變引數

什麼是可變引數?

顧名思義就是呼叫函式時,傳遞引數的個數的可變的。

如果不使用可變引數,目前有哪些方式可以實現傳入不確定個數的 list、dict、set等

def sum(numbers):
 total = 0
 for i in numbers:
  total += i
 return total

print(sum([1,3]))

上面這種寫法,雖然可以實現不確定個數的入參,但是呼叫方並不清楚入參該是哪種型別,此時呼叫方還得看函式的具體實現方知入參要是可迭代型別,所以對呼叫方不友好

可變引數的基本格式

在定義函式的時候,入參前加*號,表示可變引數,如

def sum(*numbers):
 total = 0
 for i in numbers:
  total += i
 return total

print(sum(1,3))

可變引數,其實是將入參封裝成元組

def my_fun(*numbers):
 print(type(numbers))
 total = 0
 for i in numbers:
  total += i
 return total
 
print(my_fun(1,3))

輸出結果:
<class 'tuple'>
6

命名關鍵字引數

我們先來看看之前最普通的入參方式--位置引數

def person(name,age):
 print(name,age)

person("wiggin",29)

這種方式無需指定入參的名字,只要位置相對應,就可以。

與位置引數相對的另一種方式,是每次呼叫的時候,都必需指定引數的名字,也就是命名關鍵字

什麼是命名關鍵字引數

  • 限制呼叫者不能按位置傳遞,需要放在形參的後面,並在前面使用星號*(獨佔一個引數位)與普通形參分隔

為什麼要有命名關鍵字引數

  • 為了限制後面幾個引數只能按關鍵字傳遞,這往往是因為後面幾個形參名具有十分明顯的含義,顯式寫出有利於可讀性;或者後面幾個形參隨著版本更迭很可能發生變化,強制關鍵字形式有利於保證跨版本相容性
  • 與位置引數相對的另一種方式,是每次呼叫的時候,都必需指定引數的名字,也就是命名關鍵字

命名關鍵字用法

def person(name,age,*,pet):
 print(name,pet)

person("wiggin",29,pet="tomcat")

命名關鍵字使用*做分隔,*之前的引數,基於位置引數,*後面的引數,在呼叫的時候必需指定其引數名

一旦使用命名關機字之後,如果呼叫時,沒指定引數名,會報相應的錯誤

def person(name,"tomcat")TypeError:person()takes2positional arguments but3were given

TypeError: person() takes 2 positional arguments but 3 were given

*後面的引數,同樣也可以使用預設引數進行設定

def person(name,pet="cat"):
 print(name,29)

注意:如果函式定義中已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符

關鍵字引數

什麼是關鍵字引數?

關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為一個dict。

def person(name,**kw):
 print('name:',name,'age:','other:',kw)

person("wiggin",city="廣州",pet="cat")

也可以使用下面的方式傳參

def person(name,kw)

other_info = {"pet": "cat"}
person("wiggin",**other_info)

other_info表示把other_info這個dict的所有key-value用關鍵字引數傳入到函式的**kw引數,kw將獲得一個dict,注意kw獲得的dict是other_info的一份拷貝,對kw的改動不會影響到函式外的other_info。

混合使用引數

本章之前所學習的各種型別的引數,可以在定義函式時混合使用,但是,有一個核心注意的點:混合使用時,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

以上就是淺談Python 引數與變數的詳細內容,更多關於Python 引數與變數的資料請關注我們其它相關文章!