1. 程式人生 > >python學習筆記-8

python學習筆記-8

在Python中,定義一個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。

函式體內部的語句在執行時,一旦執行到return時,函式就執行完畢,並將結果返回。因此,函式內部通過條件判斷和迴圈可以實現非常複雜的邏輯。

如果沒有return語句,函式執行完畢後也會返回結果,只是結果為Nonereturn None可以簡寫為return

在Python互動環境中定義函式時,Python會出現...的提示。函式定義結束後需要按兩次回車重新回到>>>

如果把my_abs()的函式定義儲存為abstest.py

檔案,那麼,可以在該檔案的當前目錄下啟動Python直譯器,用from abstest import my_abs來匯入my_abs()函式,

空函式

如果想定義一個什麼事也不做的空函式,用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包裡的sincos等函式。

然後,我們就可以同時獲得返回值:

>>> 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。