在python中,定義乙個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。
我們以自定義乙個求絕對值的my_abs函式為例:
如果你已經把my_abs()的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用from abstest import my_abs來匯入my_abs()函式,注意abstest是檔名(不含.py副檔名):
空函式
如果想定義乙個什麼事也不做的空函式,可以用pass語句: def nop(): pass
什麼都不做,那有什麼用?實際上pass可以用來作為佔位符,比如現在還沒想好怎麼寫函式的**,就可以先放乙個pass ,讓**能執行起來。
引數檢查
上篇我們已經講過了,呼叫函式時,如果引數個數不對,python直譯器會自動檢查出來,並丟擲typeerror
但是如果引數型別不對,python直譯器就無法幫我們檢查。試試my_abs和內建函式abs的差別。
>>> my_abs('a')traceback (most recent call last):
file "", line 1, in
file "",
line 2, in my_abstypeerror: unorderable types: str() >= int()
>>> abs('a')traceback (most recent call last): file "", line 1, in
typeerror: bad operand type
for abs(): 'str'
複製**
當傳入了不恰當的引數時,內建函式abs會檢查出引數錯誤,而我們定義的my_abs沒有引數檢查,會導致if語句出錯,出錯資訊和abs不一樣。所以,這個函式定義不夠完善。
讓我們修改一下my_abs的定義,對引數型別做檢查,只允許整數和浮點數型別的引數。資料型別檢查可以用內建函式isinstance()實現:
新增了引數檢查後,如果傳入錯誤的引數型別,函式就可以丟擲乙個錯誤。
返回多個值
在遊戲中經常需要從乙個點移動到另乙個點,給出座標、位移和角度,就可以計算出新的新的座標:
import math語句表示匯入math包,並允許後續**引用math包裡的sin、cos等函式。
然後,我們就可以同時獲得返回值:
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
> (151.96152422706632, 70.0)
複製**
原來返回值是乙個tuple!但是,在語法上,返回乙個tuple可以省略括號,而多個變數可以同時接收乙個tuple,按位置賦給對應的值,所以,python的函式返回多值其實就是返回乙個tuple,但寫起來更方便。 人人都能學會的python程式設計教程15 高階特性2
如果你想要一百萬個數,而這些數里只有一百個數是你經常要用的,剩下的都幾乎不怎麼會用到,那麼如果直接把這一百萬個數全部放在list中是不明智的因為這會浪費較多儲存空間,生成器就是為了解決這個問題而生的。如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不...
人人都能學會的python程式設計教程10 呼叫函式
python裡的函式和數學意義上的函式並沒有太大差別。python內建了很多有用的函式,我們可以直接呼叫。要呼叫乙個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs,只有乙個引數。呼叫函式的時候,如果傳入的引數數量不對,會報typeerror的錯誤,並且python會明確地告訴你 abs 有...
人人都能學會的python程式設計教程12 函式的引數
python的函式定義非常簡單,也非常靈活。除了正常定義的必選引數外,還可以使用預設引數 可變引數和關鍵字引數,使得函式定義出來的介面,不但能處理複雜的引數,還可以簡化呼叫者的 我們先寫乙個計算x的平方的函式 def power x return x x 這裡的引數x就是乙個位置引數。當我們呼叫po...