抽象
函數就是最基本的一種代碼抽象的方式。
調用函數
可以通過help(abs)查看abs函數的幫助信息
abs(x) : return position number
# 常見報錯:abs() takes exactly one argument (2 given )abs()有且僅有1個參數, 不能為兩個
# TypeError: bad operand type for abs(): 'str' str是錯誤的參數類型
max() : return the max of the argument
# max()可以接收任意多個參數,並返回最大的那個
int() ,float() ,bool(), str() ,float()
#常用函數還包括數據類型轉換函數,可以把其他數據類型轉換為對應類型
# 函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當於給這個函數起了一個“別名”:
a = max
print(a(1,2,3))
# hex()函數把一個整數轉換成十六進制表示的字符串
print(hex(123))
#0x7b
print(sum([1,2,3,4]))
#10 這里參數要一個列表集合
定義函數
Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然后,在縮進塊中編寫函數體,函數的返回值用return語句返回
def boolean_position_num(x):
if x >= 0 :
return True
else :
return False
print(boolean_position_num(int(input())))
函數體內部的語句在執行時,一旦執行到return時,函數就執行完畢,並將結果返回。因此,函數內部通過條件判斷和循環可以實現非常復雜的邏輯。
如果沒有return語句,函數執行完畢后也會返回結果,只是結果為None。return None可以簡寫為return
def boolean_position_num(x):
if x >= 0 :
print('position num')
else :
print('not position num')
# 默認return None
print(boolean_position_num(int(input())))
# 10 None
命令行格式
#調用別的文件里的函數
# main.py
from func import boolean_position_num
print(boolean_position_num(int(input())))
# func.py
def boolean_position_num(x):
if x >= 0 :
print('position num')
else :
print('not position num')
空函數
#定義一個什么事也不做的空函數,可以用pass語句
def non():
pass
#pass可以用來作為占位符,比如現在還沒想好怎么寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。不加pass就會報錯
if x >= 18:
pass
參數檢查
TypeError: my_abs() takes 1 positional argument but 2 were given : 參數數量不對
自己寫的函數跟內置函數的區別為:自己寫的函數很多都不能支持其他的數據類型,內置函數可以
數據類型檢查可以用內置函數isinstance()實現:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多個值? 只是返回一個tuple值 Python函數返回的仍然是單一值。
用途:在游戲中經常需要從一個點移動到另一個點,給出坐標、位移和角度,就可以計算出新的坐標:
def return_nums(x , y):
return int(x),int(y)
if __name__ == '__main__':
print(return_nums(1,2))
# (1 , 2)
小結
定義函數時,需要確定函數名和參數個數;
如果有必要,可以先對參數的數據類型做檢查;
函數體內部可以用return隨時返回函數結果;
函數執行完畢也沒有return語句時,自動return None。
函數可以同時返回多個值,但其實就是一個tuple。
練習
ax^2+bx+c=0
from cmath import sqrt
def quadratic(a, b, c):
a = float(a)
b = float(b)
c = float(c)
temp = pow(b, 2) - 4 * a * c
if temp<0 :
print('該方程無解')
x1 = (-b + (sqrt(temp))) / (2 * a)
x2 = (-b - (sqrt(temp))) / (2 * a)
if temp == 0:
print('該方程只有一個解')
return x1
return x1, x2
if __name__ == '__main__':
print('quadratic(2, 3, 1) =', quadratic(2, 3, 1))
print('quadratic(1, 3, -4) =', quadratic(1, 3, -4))
if quadratic(2, 3, 1) != (-0.5, -1.0):
print('測試失敗')
elif quadratic(1, 3, -4) != (1.0, -4.0):
print('測試失敗')
else:
print('測試成功')
-------------------------------------------------------------------------------
import cmath
def quadratic(a,b,c):
if not (isinstance(a,(int,float) ) and isinstance(b,(int,float)) and isinstance(c,(int,float)) ):
raise TypeError('bad operation type')
elif b**2-4*a*c < 0 :
print('該方程沒有實數解')
else :
x1 = (-b + math.sqrt(b**2-4*a*c))/(2*a)
x2 = (-b - math.sqrt(b**2-4*a*c))/(2*a)
return x1, x2
print(quadratic(3,5,1))
print(quadratic(a,c,1))