定義函式
在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 "<stdin>", line 1, in <module> File "<stdin>",
line 2, in my_absTypeError: unorderable types: str() >= int()
>>> abs('A')Traceback (most recent call last): File "<stdin>", line 1, in <module>
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,但寫起來更方便。