在python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然后,在縮進塊中編寫函數體,函數的返回值用return語句返回。
首先自定義一個求絕對值的zl_abs
函數為例:
def zl_abs(x):
if x >= 0:
return x
else:
return -x
為了避免混淆,我們接下來定義Drzl函數。
如果你已經把Drzl_abs()
的函數定義保存為abstext.py
文件了,那可以在該文件的當前目錄下啟動Python解釋器,用from abstext import Drzl_abs
來導入Drzl_abs()
函數,注意abstest
是文件名(不含.py
擴展名):
參數檢查
調用函數時,如果參數個數不對,python解釋器會自動檢查出來,并拋出異常TypeError
Drzl_abs(-87,909)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Drzl_abs() takes 1 positional argument but 2 were given
但是如果傳入的參數類型不對,Python
解釋器就無法幫我們檢查。試試Drzl_abs
和內置函數```abs``的差別:
Drzl_abs("f")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "F:\pyFile\abstext.py", line 3, in Drzl_abs
raise TypeError('bad operand type')
TypeError: unorderable types: str() >= int()
abs('f')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for abs(): 'str'
讓我們改一下 Drzl_abs
的定義,對參數類型做檢查,只允許整數和浮點數類型的參數。數據類型檢查可以使用內置函數isinstance()
實現:
def Drzl_abs(x):
if not isinstance(x,(int, float)):
raise TypeError('bad operand type')
if x > 0:
return x
else:
return -x
添加參數檢查后,如果傳入錯誤的參數類型,函數就可以拋出一個錯誤:
Drzl_abs("f")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "F:\pyFile\abstext.py", line 3, in Drzl_abs
raise TypeError('bad operand type')
TypeError: bad operand type
返回多個值
函數可以返回多個值嗎?答案是肯定的。
比如在游戲中經常需要從一個點移動到另一個點,給出坐標、位移、角度,就可算出新的坐標:
>>> import math
>>> def move(x,y,step,angle=0):
... nx = x + step * math.cos(angle)
... ny = y - step * math.sin(angle)
... return nx,ny
...
import math
語句表示導入 math
包,并允許后續代碼引用math
包里的sin
、cos
等函數。然后我們就可以同時獲得返回值:
>>> x,y = move(100,100,60,math.pi / 6)
>>> print(x,y)
151.96152422706632 70.0
但其實著只是一種假象,Python函數返回的仍然時單一值:
>>> def move(x,y,step,angle=0):
... nx = x + step *math.cos(angle)
... ny = y - step * math.sin(angle)
... return nx,ny
...
>>> r = move(100,100,60,math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
>>>
原來返回值是一個tuple!但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回值其實就是返回一個tuple,但寫起來更方便。
小結:
定義函數時,需要確定函數名和參數個數;
如果有必要,可以先對參數的數據類型做檢查;
函數體內部可以用return
隨時返回函數結果;
函數執行完畢也沒有return
語句是,自動return None
。
函數可以同時返回多個值,但其實就是一個tuple。
練習
請定義一個函數quadratic(a,b,c)
,接收3個參數,返回一元二次方程:
ax^2 + bx + c = 0的兩個解。
提示:計算平方根可以調用math.sqrt()
函數: