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

