Python中自定義函數(shù)的教程
在Python中,定義一個函數(shù)要使用def語句,依次寫出函數(shù)名、括號、括號中的參數(shù)和冒號:,然后,在縮進塊中編寫函數(shù)體,函數(shù)的返回值用return語句返回。
我們以自定義一個求絕對值的my_abs函數(shù)為例:
def my_abs(x): if x >= 0: return x else: return -x
請自行測試并調(diào)用my_abs看看返回結(jié)果是否正確。
請注意,函數(shù)體內(nèi)部的語句在執(zhí)行時,一旦執(zhí)行到return時,函數(shù)就執(zhí)行完畢,并將結(jié)果返回。因此,函數(shù)內(nèi)部通過條件判斷和循環(huán)可以實現(xiàn)非常復雜的邏輯。
如果沒有return語句,函數(shù)執(zhí)行完畢后也會返回結(jié)果,只是結(jié)果為None。
return None可以簡寫為return。
空函數(shù)
如果想定義一個什么事也不做的空函數(shù),可以用pass語句:
def nop(): pass
pass語句什么都不做,那有什么用?實際上pass可以用來作為占位符,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個pass,讓代碼能運行起來。
pass還可以用在其他語句里,比如:
if age >= 18: pass
缺少了pass,代碼運行就會有語法錯誤。
參數(shù)檢查
調(diào)用函數(shù)時,如果參數(shù)個數(shù)不對,Python解釋器會自動檢查出來,并拋出TypeError:
>>> my_abs(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: my_abs() takes exactly 1 argument (2 given)
但是如果參數(shù)類型不對,Python解釋器就無法幫我們檢查。試試my_abs和內(nèi)置函數(shù)abs的差別:
>>> my_abs('A') 'A' >>> abs('A') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: bad operand type for abs(): 'str'
當傳入了不恰當?shù)膮?shù)時,內(nèi)置函數(shù)abs會檢查出參數(shù)錯誤,而我們定義的my_abs沒有參數(shù)檢查,所以,這個函數(shù)定義不夠完善。
讓我們修改一下my_abs的定義,對參數(shù)類型做檢查,只允許整數(shù)和浮點數(shù)類型的參數(shù)。數(shù)據(jù)類型檢查可以用內(nèi)置函數(shù)isinstance實現(xiàn):
def my_abs(x): if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x
添加了參數(shù)檢查后,如果傳入錯誤的參數(shù)類型,函數(shù)就可以拋出一個錯誤:
>>> my_abs('A') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in my_abs TypeError: bad operand type
錯誤和異常處理將在后續(xù)講到。
返回多個值
函數(shù)可以返回多個值嗎?答案是肯定的。
比如在游戲中經(jīng)常需要從一個點移動到另一個點,給出坐標、位移和角度,就可以計算出新的新的坐標:
import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny
這樣我們就可以同時獲得返回值:
>>> x, y = move(100, 100, 60, math.pi / 6) >>> print x, y 151.961524227 70.0
但其實這只是一種假象,Python函數(shù)返回的仍然是單一值:
>>> r = move(100, 100, 60, math.pi / 6) >>> print r (151.96152422706632, 70.0)
原來返回值是一個tuple!但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數(shù)返回多值其實就是返回一個tuple,但寫起來更方便。
小結(jié)
定義函數(shù)時,需要確定函數(shù)名和參數(shù)個數(shù);
如果有必要,可以先對參數(shù)的數(shù)據(jù)類型做檢查;
函數(shù)體內(nèi)部可以用return隨時返回函數(shù)結(jié)果;
函數(shù)執(zhí)行完畢也沒有return語句時,自動return None。
函數(shù)可以同時返回多個值,但其實就是一個tuple。
- Python自定義函數(shù)的創(chuàng)建、調(diào)用和函數(shù)的參數(shù)詳解
- Python def函數(shù)的定義、使用及參數(shù)傳遞實現(xiàn)代碼
- Python函數(shù)中定義參數(shù)的四種方式
- 實例講解Python中函數(shù)的調(diào)用與定義
- Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式實例詳解
- Python自定義函數(shù)實現(xiàn)求兩個數(shù)最大公約數(shù)、最小公倍數(shù)示例
- python簡單的函數(shù)定義和用法實例
- Python中scatter函數(shù)參數(shù)及用法詳解
- python進階教程之函數(shù)參數(shù)的多種傳遞方法
- python函數(shù)參數(shù)*args**kwargs用法實例
- Python函數(shù)參數(shù)類型*、**的區(qū)別
- Python函數(shù)的定義方式與函數(shù)參數(shù)問題實例分析
相關(guān)文章
python?字符串模糊匹配Fuzzywuzzy的實現(xiàn)
本文主要介紹了python?字符串模糊匹配Fuzzywuzzy的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內(nèi)容)
Excel文件中可能包含合并單元格的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Pandas讀取excel合并單元格的正確方式,主要介紹的openpyxl合并單元格拆分并填充內(nèi)容,需要的朋友可以參考下2023-06-06jupyter notebook 寫代碼自動補全的實現(xiàn)
這篇文章主要介紹了jupyter notebook 寫代碼自動補全的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11