python學習筆記 廖雪峰(12 定義函式)

2021-09-11 08:08:08 字數 3875 閱讀 9045

1、乙個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。已經把my_abs()的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄下啟動python直譯器,用from abstest import my_abs來匯入my_abs()函式,注意abstest是檔名(不含.py副檔名)

如果想定義乙個什麼事也不做的空函式,可以用pass語句:

def nop():

pass

pass語句什麼都不做,那有什麼用?實際上pass可以用來作為佔位符,比如現在還沒想好怎麼寫函式的**,就可以先放乙個pass,讓**能執行起來。

如果引數個數不對,python直譯器會自動檢查出來,並丟擲typeerror。但是如果引數型別不對,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不一樣。所以,這個函式定義不夠完善。

對引數型別做檢查,只允許整數和浮點數型別的引數。資料型別檢查可以用內建函式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

7、返回多個值

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

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

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。

請定義乙個函式quadratic(a, b, c),接收3個引數,返回一元二次方程:

ax2 + bx + c = 0

的兩個解。

>>> import math

>>> math.sqrt(2)

1.4142135623730951

in [17]: import math

in [19]: def quadratic(a,b,c):

...: x1=(-b+math.sqrt(pow(b,2)-4*a*c))/(2*a)

...: x2=(-b-math.sqrt(pow(b,2)-4*a*c))/(2*a)

...: return x1,x2

...: x=quadratic(2,3,1)

...: print(x)

...:

...:

(-0.5, -1.0)

import math

def quadratic(a,b,c):

if a == 0:

x = - c / b

s = b*b-(4*a*c)

if (s>0):

x1 = float(-b + math.sqrt((b * b)-(4 * a * c))) / (2 * a)

x2 = float(-b - math.sqrt((b * b) - (4 * a * c))) / (2 * a)

return x1,x2

elif s==0:

x = -(b / (2 * a))

return x

else:

print("無解")import math

def quadratic(a,b,c):

if a == 0:

x = - c / b

s = b*b-(4*a*c)

if (s>0):

x1 = float(-b + math.sqrt((b * b)-(4 * a * c))) / (2 * a)

x2 = float(-b - math.sqrt((b * b) - (4 * a * c))) / (2 * a)

return x1,x2

elif s==0:

x = -(b / (2 * a))

return x

else:

print("無解")

python廖雪峰教程 學習筆記

如何用字元來描述字元 d匹配數字 digit w匹配字母或數字 word s可以匹配空格 space 表示任意個字元,表示至少乙個字元 表示0個或1個字元,表示n個字元,表示n m個字元 可以匹配任意字元 例如 kongxiangyu w如何做到更精確的匹配?規定數字 字母或者下劃線 0 9a za...

Git 廖雪峰 學習筆記

目錄 git工作區域 git初始化及倉庫建立和操作 初始化新的git倉庫 1.新建資料夾 2.在檔案內初始化git 如何將本地倉庫同步到git 遠端倉庫 1.關聯遠端庫 2.第一次推送master分支的所有內容 3.每次本地提交後,推送最新修改 轉殖 分支管理 1.建立與合併分支 2.解決衝突 3....

git 廖雪峰學習筆記

git的誕生 linus堅決反對cvs和svn等集中式版本控制系統 因為速度慢且需要聯網 bitmover公司授權linux社群商業軟體bitkeeper免費使用權 linus社群牛人試圖破解bitkeeper的協議被bitmover公司發現 bitmover公司收回linux社群bitkeeper...