人人都能學會的python程式設計教程12 函式的引數

2021-09-12 01:33:22 字數 2369 閱讀 1277

python的函式定義非常簡單,也非常靈活。除了正常定義的必選引數外,還可以使用預設引數、可變引數和關鍵字引數,使得函式定義出來的介面,不但能處理複雜的引數,還可以簡化呼叫者的**。

我們先寫乙個計算x的平方的函式:

def power(x): return x * x

這裡的引數x就是乙個位置引數。

當我們呼叫power函式時,必須傳入有且僅有的乙個引數x:

power(5)25

那麼如果我想要計算x的n次方,怎麼辦呢?

聰明的你一定想到了。沒錯就是定義2個引數,如下:

def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s

新的power(x, n)函式定義沒有問題,但是,舊的呼叫**失敗了,原因是我們增加了乙個引數,導致舊的**因為缺少乙個引數而無法正常呼叫。這個時候,預設引數就排上用場了。由於我們經常計算x的平方,所以,完全可以把第二個引數n的預設值設定為2。

從上面的例子可以看出,預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意:

一是必選引數在前,預設引數在後,否則python的直譯器會報錯(思考一下為什麼預設引數不能放在必選引數前面);

二是如何設定預設引數。

當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。

使用預設引數有什麼好處?最大的好處是能降低呼叫函式的難度。

定義預設引數要牢記一點:預設引數必須指向不變物件!

為什麼要設計str、none這樣的不變物件呢?因為不變物件一旦建立,物件內部的資料就不能修改,這樣就減少了由於修改資料導致的錯誤。此外,由於物件不變,多工環境下同時讀取物件不需要加鎖,同時讀一點問題都沒有。我們在編寫程式時,如果可以設計乙個不變物件,那就盡量設計成不變物件。

在python函式中,還可以定義可變引數。顧名思義,可變引數就是傳入的引數個數是可變的,可以是1個、2個到任意個,還可以是0個。

我們以數學題為例子,給定一組數字a,b,c……,請計算a2 + b2 + c2 + ……。

定義可變引數和定義乙個list或tuple引數相比,僅僅在引數前面加了乙個*號。在函式內部,引數numbers接收到的是乙個tuple,因此,函式**完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數。

如果已經有乙個list或者tuple,要呼叫乙個可變引數怎麼辦?*nums表示把nums這個list的所有元素作為可變引數傳進去。這種寫法相當有用,而且很常見。

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

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

函式person除了必選引數name和age外,還接受關鍵字引數kw。在呼叫該函式時,可以只傳入必選引數。

person('michael', 30)

也可以傳入任意個數的關鍵字引數:

person('bob', 35, city='beijing') person('adam', 45, gender='m', job='engineer')

關鍵字引數有什麼用?它可以擴充套件函式的功能。比如,在person函式裡,我們保證能接收到name和age這兩個引數,但是,如果呼叫者願意提供更多的引數,我們也能收到。試想你正在做乙個使用者註冊的功能,除了使用者名稱和年齡是必填項外,其他都是可選項,利用關鍵字引數來定義這個函式就能滿足註冊的需求。

對於關鍵字引數,函式的呼叫者可以傳入任意不受限制的關鍵字引數。至於到底傳入了哪些,就需要在函式內部通過kw檢查。 如果要限制關鍵字引數的名字,就可以用命名關鍵字引數,例如,只接收city和job作為關鍵字引數。這種方式定義的函式如下:

def person(name, age, *, city, job): print(name, age, city, job)

和關鍵字引數**kw不同,命名關鍵字引數需要乙個特殊分隔符*,*後面的引數被視為命名關鍵字引數。

呼叫方式如下:

person('jack', 24, city='beijing', job='engineer')

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

def person(name, age, *args, city, job): print(name, age, args, city, job)

在python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

比如定義乙個函式,包含上述若干種引數:

人人都能學會的python程式設計教程15 高階特性2

如果你想要一百萬個數,而這些數里只有一百個數是你經常要用的,剩下的都幾乎不怎麼會用到,那麼如果直接把這一百萬個數全部放在list中是不明智的因為這會浪費較多儲存空間,生成器就是為了解決這個問題而生的。如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不...

人人都能學會的python程式設計教程11 定義函式

在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和冒號 然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。我們以自定義乙個求絕對值的my abs函式為例 如果你已經把my abs 的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄...

人人都能學會的python程式設計教程10 呼叫函式

python裡的函式和數學意義上的函式並沒有太大差別。python內建了很多有用的函式,我們可以直接呼叫。要呼叫乙個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs,只有乙個引數。呼叫函式的時候,如果傳入的引數數量不對,會報typeerror的錯誤,並且python會明確地告訴你 abs 有...