Python定義函數
在Python中,定義一個函數要使用def
語句,依次寫出函數名、括號、括號中的參數和冒號:
,然後,在縮進塊中編寫函數體,函數的返回值用return
語句返回。
我們以自定義一個求絕對值的my_abs
函數為例:
def my_abs(x): if x >= 0: return x else: return -x
print(my_abs(-99))
請註意,函數體內部的語句在執行時,一旦執行到return
時,函數就執行完畢,並將結果返回。因此,函數內部通過條件判斷和循環可以實現非常復雜的邏輯。
如果沒有return
語句,函數執行完畢後也會返回結果,只是結果為None
return None
可以簡寫為return
。
在Python交互環境中定義函數時,註意Python會出現...
的提示。函數定義結束後需要按兩次回車重新回到>>>
提示符下:
┌────────────────────────────────────────────────────────┐ │Command Prompt - python - □ x │ ├────────────────────────────────────────────────────────┤ │>>> def my_abs(x): │ │... if x >= 0: │ │... return x │ │... else: │ │... return -x │ │... │ │>>> my_abs(-9) │ │9 │ │>>> _ │ │ │ │ │ └────────────────────────────────────────────────────────┘
如果你已經把my_abs()
的函數定義保存為abstest.py
文件了,那麽,可以在該文件的當前目錄下啟動Python解釋器,用from abstest import my_abs
來導入my_abs()
函數,註意abstest
是文件名(不含.py
擴展名):
┌────────────────────────────────────────────────────────┐ │Command Prompt - python - □ x │ ├────────────────────────────────────────────────────────┤ │>>> from abstest import my_abs │ │>>> my_abs(-9) │ │9 │ │>>> _ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └────────────────────────────────────────────────────────┘
import
的用法在後續模塊一節中會詳細介紹。
空函數
如果想定義一個什麽事也不做的空函數,可以用pass
語句:
def nop():
pass
pass
語句什麽都不做,那有什麽用?實際上pass
可以用來作為占位符,比如現在還沒想好怎麽寫函數的代碼,就可以先放一個pass
,讓代碼能運行起來。
pass
還可以用在其他語句裏,比如:
if age >= 18:
pass
缺少了pass
,代碼運行就會有語法錯誤。
參數檢查
調用函數時,如果參數個數不對,Python解釋器會自動檢查出來,並拋出TypeError
:
>>> my_abs(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_abs() takes 1 positional argument but 2 were given
但是如果參數類型不對,Python解釋器就無法幫我們檢查。試試my_abs
和內置函數abs
的差別:
>>> my_abs(‘A‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in my_abs
TypeError: 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()
實現:
def my_abs(x):
if not 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 "<stdin>", line 1, in <module>
File "<stdin>", line 3, in my_abs
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函數返回的仍然是單一值:
>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
原來返回值是一個tuple!但是,在語法上,返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。
小結
定義函數時,需要確定函數名和參數個數;
如果有必要,可以先對參數的數據類型做檢查;
函數體內部可以用return
隨時返回函數結果;
函數執行完畢也沒有return
語句時,自動return None
。
函數可以同時返回多個值,但其實就是一個tuple。
原文鏈接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431679203477b5b364aeba8c4e05a9bd4ec1b32911e2000(轉載僅用於學習目的)
Python定義函數