在python中,定義乙個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。
我們以自定義乙個求絕對值的my_abs函式為例:
請注意,函式體內部的語句在執行時,一旦執行到return時,函式就執行完畢,並將結果返回。因此,函式內部通過條件判斷和迴圈可以實現非常複雜的邏輯。
如果沒有return語句,函式執行完畢後也會返回結果,只是結果為none。return none可以簡寫為return。
在python互動環境中定義函式時,注意python會出現...的提示。函式定義結束後需要按兩次回車重新回到》提示符下:
如果你已經把my_abs()的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用from abstest import my_abs來匯入my_abs()函式,注意abstest是檔名(不含.py副檔名):
如果想定義乙個什麼事也不做的空函式,可以用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 "", line 1, in typeerror: my_abs() takes 1 positional argument but 2 were given
但是如果引數型別不對,python直譯器就無法幫我們檢查。試試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):
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 "", line 1, in file "", 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。
練習請定義乙個函式quadratic(a, b, c),接收3個引數,返回一元二次方程 ax^2+bx+c=0ax
2+bx+c=0 的兩個解。
一元二次方程的求根公式為:
計算平方根可以呼叫math.sqrt()函式:
import math
>>> math.sqrt(2)
1.4142135623730951
import math
def quadratic(a, b, c):
if a!=0 & b*b-4*a*c>=0:
x1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 * a
x2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 * a
return x1, x2
else:
print('無根請重新輸入')
py相關函式問題
合理地拼接乙個或多個路徑部分。返回值是 path 和 paths 所有值的連線,每個非空部分後面都緊跟乙個目錄分隔符 os.sep 除了最後一部分。這意味著如果最後一部分為空,則結果將以分隔符結尾。如果引數中某個部分是絕對路徑,則絕對路徑前的路徑都將被丟棄,並從絕對路徑部分開始連線。在 window...
py函式式程式設計
函式式程式設計把計算視為函式而非指令,純函式式程式設計不需要變數,沒有 測試簡單,python支援的函式式程式設計不是純函式式程式設計,允許有變數存在,支援高階函式,支援閉包,有限度的支援匿名函式 變數可以指向函式,而函式又可以把變數作為引數,所以高階函式就是把函式作為引數的函式。def add x...
Py基礎之函式
函式是指一類同類事物的抽象,而且這種抽象可以拓展,並且可以用在同一類事物上 print abs 100 abs 100 abs函式是python內建的函式,可以用來求絕對值 print cmp 1,2 cmp 1,1 cmp 2,1 cmp 函式可以比較兩個函式的值,如果前面的數大於後面的數,則返回...