十一 定義函式

2021-08-10 22:31:52 字數 2950 閱讀 4031

在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語句:

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_abstypeerror: 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_abstypeerror: bad operand type

錯誤和異常處理將在後續講到。

返回多個值

函式可以返回多個值嗎?答案是肯定的。

比如在遊戲中經常需要從乙個點移動到另乙個點,給出座標、位移和角度,就可以計算出新的新的座標:

import mathdef 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個引數,返回一元二次方程:

ax2 + bx + c = 0

的兩個解。

>>> import math>>> math.sqrt(2)1.4142135623730951

# -*- coding: utf-8 -*-import mathdef quadratic(a, b, c):

# 測試:print(quadratic(2, 3, 1)) # => (-0.5, -1.0)print(quadratic(1, 3, -4)) # => (1.0, -4.0)

Python之函式(一)定義函式以及傳參

函式的定義 def 函式名 函式體 例子 def func def關鍵字 定義 func函式名 和變數定義規則一樣 必須要寫格式 宣告 語句結束 s 1,2,3 count 0 for i in s count 1 print count 呼叫函式 def my len s 1,2,23,3,4,5...

多執行緒(一) 定義,使用

1.程式 程序和執行緒 程式是乙個靜態概念 程序是 程式 的乙個執行例項 執行緒是一種輕量級程序,大多是情況下用於執行非同步操作。執行緒是cpu排程的基本單位 相互關係 android程式開始啟動時,會單獨啟動乙個程序,同時產生乙個uithread main執行緒 乙個程式預設情況下只有乙個proc...

Nodejs 入門學習 (一) 定義變數

宣告與未聲名變數的區別 g a var name d name nodejs b name nodejs var name c functionx x console.log y 1 console.log z referenceerror z is not defined d console.lo...