在python中,定義乙個函式要使用def
語句,依次寫出函式名、括號、括號中的引數和冒號:
,然後,在縮排塊中編寫函式體,函式的返回值用return
語句返回。
我們以自定義乙個求絕對值的my_abs
函式為例:
def請自行測試並呼叫my_abs(x):
if x >=0:
return
x
else
:
return -x
my_abs
看看返回結果是否正確。
請注意,函式體內部的語句在執行時,一旦執行到return
時,函式就執行完畢,並將結果返回。因此,函式內部通過條件判斷和迴圈可以實現非常複雜的邏輯。
如果沒有return
語句,函式執行完畢後也會返回結果,只是結果為none
。return none
可以簡寫為return
。
在python互動環境中定義函式時,注意python會出現...
的提示。函式定義結束後需要按兩次回車重新回到>>>
提示符下:
如果你已經把my_abs()
的函式定義儲存為abstest.py
檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用from abstest import my_abs
來匯入my_abs()
函式,注意abstest
是檔名(不含.py
副檔名):
import
的用法在後續模組一節中會詳細介紹。
如果想定義乙個什麼事也不做的空函式,可以用pass
語句:
defnop():
pass
pass
語句什麼都不做,那有什麼用?實際上pass
可以用來作為佔位符,比如現在還沒想好怎麼寫函式的**,就可以先放乙個pass
,讓**能執行起來。
pass
還可以用在其他語句裡,比如:
if age >= 18:缺少了pass
pass
,**執行就會有語法錯誤
呼叫函式時,如果引數個數不對,python直譯器會自動檢查出來,並丟擲typeerror
:
>>> my_abs(1, 2)但是如果引數型別不對,python直譯器就無法幫我們檢查。試試traceback (most recent call last):
file
"", line 1, in
typeerror: my_abs() takes 1 positional argument but 2 were given
my_abs
和內建函式abs
的差別:
>>> my_abs('a'當傳入了不恰當的引數時,內建函式)traceback (most recent call last):
file
"", line 1, in
file
"", line 2, in
my_abs
typeerror: 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()
實現:
def新增了引數檢查後,如果傳入錯誤的引數型別,函式就可以丟擲乙個錯誤:my_abs(x):
ifnot
isinstance(x, (int, float)):
raise typeerror('
bad operand type')
if x >=0:
return
x
else
:
return -x
>>> my_abs('a'錯誤和異常處理將在後續講到。)traceback (most recent call last):
file
"", line 1, in
file
"", line 3, in
my_abs
typeerror: bad operand type
函式可以返回多個值嗎?答案是肯定的。
比如在遊戲中經常需要從乙個點移動到另乙個點,給出座標、位移和角度,就可以計算出新的新的座標:
importmath
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)但其實這只是一種假象,python函式返回的仍然是單一值:(x, y)
151.96152422706632 70.0
>>> r = move(100, 100, 60, math.pi / 6)原來返回值是乙個tuple!但是,在語法上,返回乙個tuple可以省略括號,而多個變數可以同時接收乙個tuple,按位置賦給對應的值,所以,python的函式返回多值其實就是返回乙個tuple,但寫起來更方便。(r)(151.96152422706632, 70.0)
定義函式時,需要確定函式名和引數個數;
如果有必要,可以先對引數的資料型別做檢查;
函式體內部可以用return
隨時返回函式結果;
函式執行完畢也沒有return
語句時,自動return none
。
函式可以同時返回多個值,但其實就是乙個tuple。
冒號 定義成員函式 Python3 函式
函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的 段。函式能提高應用的模組性,和 的重複利用率。你已經知道python提供了許多內建函式,比如print 但你也可以自己建立函式,這被叫做使用者自定義函式。定義乙個函式 你可以定義乙個由自己想要功能的函式,以下是簡單的規則 任何傳入引數和自變...
python3自定義函式
一 什麼是函式 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的 段。函式能提高應用的模組性,和 的重複利用率。你已經知道python提供了許多內建函式,比如print 但你也可以自己建立函式,這被叫做使用者自定義函式。語法def 函式名 引數列表 函式體def func print 王小...
python3 自定義比較函式
python 2 中支援類似 c 中 cmp 的寫法 python 3 放棄了這一用法 官方說明 所以不想寫lambda的話,加一句cmp to key 就行了 def 比較函式 return 原來的方式是 sorted cmp 比較函式 現在的方式是 from functools import c...