三、Python基礎(chǔ)之函數(shù)
函數(shù)
為實現(xiàn)代碼的重復(fù)利用,對實現(xiàn)某一功能的代碼進行封裝以實現(xiàn)代碼抽象,方便重復(fù)調(diào)用
python常用內(nèi)置函數(shù)在builtins.py中
print() # 輸出
type() # 返回類型
id() # 返回內(nèi)存地址
input() # 輸入
len() # 返回長度
open() # 打開文件
round() #返回浮點數(shù)x的四舍五入值
abs() # 取絕對值
函數(shù)調(diào)用
在Python中調(diào)用一個函數(shù),需要知道這個函數(shù)的名稱和傳入?yún)?shù)
a1 = abs(-1)
print(a1) # 1
a2 = abs(-1,-2)
print(a2) # TypeError: abs() takes exactly one argument (2 given)
a3 = abs('a')
print(a3) # TypeError: bad operand type for abs(): 'str'
'''
函數(shù)名其實就是指向一個函數(shù)對象的引用,完全可以把函數(shù)名賦給一個變量,相當(dāng)于給這個函數(shù)起了一個“別名”
'''
a4 = abs # 變量a4指向abs函數(shù)
print(a4) # <built-in function abs>
print(a4(-1)) # 1
調(diào)用函數(shù)的時候,如果傳入的參數(shù)數(shù)量不對,會報TypeError的錯誤,并且Python會明確地告訴你:abs()有且僅有1個參數(shù),但給出了兩個;
如果傳入的參數(shù)數(shù)量是對的,但參數(shù)類型不能被函數(shù)所接受,也會報TypeError的錯誤,并且給出錯誤信息:str是錯誤的參數(shù)類型;
自定義一個函數(shù)
Python中定義一個函數(shù),使用 def 語句,def+函數(shù)名+(參數(shù))+: ,通過語句塊縮進來編寫函數(shù)體,通過 return 來返回值
def add(x,y):
sum = x + y
return sum
a = add(2,3)
print(a) # 5
def add(x,y):
sum = x + y
a = add(2,3)
print(a) # None
注:函數(shù)需要return來把數(shù)據(jù)返回給外部調(diào)用,如果不寫return,函數(shù)默認return None
函數(shù)在內(nèi)部執(zhí)行語句時,一旦執(zhí)行到return,函數(shù)就執(zhí)行完畢并把結(jié)果返回,即使return下面有同樣縮進的語句塊,但并不會執(zhí)行
def add(x,y):
sum = x + y
return sum
print("這是函數(shù)中return后的語句") # 在調(diào)用函數(shù)時,該print語句并不會被執(zhí)行
空函數(shù)
有確定的 def+函數(shù)名+(參數(shù))+: ,在函數(shù)體中用 pass 代替實際的代碼語句
def func():
pass # pass語句什么都不做,實際上 pass 通常作為代碼的點位符,在程序框架設(shè)計中常用
返回多個值
函數(shù)通過 return 返回單個值,同樣也可返回多個值
def names(x,y):
name_1 = x
name_2 = y
return name_1, name_2
n = names('Jack','Flack')
print(n) # 返回('Jack', 'Flack')
print(type(n)) # 返回類型 <class 'tuple'>
Python中函數(shù)return多個值時,返回類型為 tuple(元祖),tuple中包含多個值
任務(wù):
定義一個函數(shù),傳入?yún)?shù)為一個list, l1 = [1,2,3,4,5,6......n],對這個list 按 12+22+32.+....+n2 累加,返回這個累加值。
def sum(n):
sum = 0
for each in range(1,n+1):
sum = sum+each*each
return sum
if __name__ == '__main__':
total = sum(100)
print(total)
函數(shù)的參數(shù)
Python函數(shù)的定義比較靈活,除正常定義必選參數(shù)外,還可以使用默認參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù),在處理復(fù)雜參數(shù)的同時,方便簡化調(diào)用
'''定義一個函數(shù),實現(xiàn)x2+1的計算'''
def formula(x):
return x*x+1
對于函數(shù) formula(x) ,參數(shù) x 就是一個位置參數(shù),當(dāng)我們調(diào)用 func函數(shù)時,就必須傳入并且只傳入一個參數(shù) x
a1 = formula(3) # 參數(shù)傳入3,等同于x=3
print(a1) # 10
a2 = formula(x=4)
print(a2) # 17
現(xiàn)在如果要通過函數(shù)來實現(xiàn) x2+ y,在formula的參數(shù)中就需要傳入x, y兩個參數(shù)
'''定義一個函數(shù),實現(xiàn)x2+y的計算'''
def formula(x,y):
return x*x+y
a3 = formula(3,2) # 調(diào)用formula函數(shù)時,傳入的參數(shù)為3和2,按照位置相當(dāng)于x=3,y=2,結(jié)果為11
a4 = formula(2,3) # 調(diào)用formula函數(shù)時,傳入的參數(shù)為2和3,按照位置相當(dāng)于x=2,y=3,結(jié)果為7
傳參時按照參數(shù)位置填入對應(yīng)參數(shù),就屬于位置參數(shù)
默認參數(shù)
根據(jù) formula函數(shù),如果實際工作中,這個函數(shù)更多的是用來計算 x2+1,但我們也需要這個函數(shù)能計算 x2+y,為了簡化代碼調(diào)用,可以給 y 指定一個默認參數(shù) y=1
def formula(x,y=1):
return x*x+y
a5 = formula(3) # 調(diào)用formula函數(shù)時,雖然只傳入的參數(shù)x=3,但定義函數(shù)時默認y=1,等價于formula(3,1)所以結(jié)果為10
從上面例子可以看到,默認參數(shù)可以簡化函數(shù)的調(diào)用
需要注意:定義函數(shù)時,必選參數(shù)放前,默認參數(shù)放后
def formula(x=3,y): # SyntaxError: non-default argument follows default argument
return x*x+y
解釋器會報錯:SyntaxError: non-default argument follows default argument
可變參數(shù)
例:當(dāng)我們需要定義一個函數(shù),實現(xiàn)a2+b2+c2+d2.......+n2,n為任意數(shù)
def formula(*numbers): # *numbers為可變參數(shù)(numbers類型為元祖,用于接收任意個傳入的參數(shù)),即調(diào)用該formula函數(shù)時,可傳入任意數(shù)量參數(shù)
sum = 0
print(type(numbers),numbers) # <class 'tuple'> numbers類型為元祖
for i in numbers:
sum += i*i
return sum
a6 = formula(1) # 此時可變參數(shù)numbers接收的參數(shù)是1,numbers = (1,),結(jié)果為1
a7 = formula(1,2,3) # 此時可變參數(shù)numbers接收的參數(shù)是1,2,3,numbers=(1,2,3),結(jié)果為14
如果需要傳入的參數(shù)是一個list或tuple,可通過*+參數(shù)來對list或tuple解包
n = [1,2,3,4]
a8 = formula(*n) # *n作用是把n中的元素全部取出,放入numbers元祖中,等價于formula(1,2,3,4)
通過 *n 把 n這個list中所有元素解包后作為可變參數(shù)傳入函數(shù),是一種常用方法
關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)允許傳入0個或任意個帶參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部以字典的形式存儲
'''定義一個函數(shù),存儲學(xué)生信息'''
def student_info(name, age, **kw):
student_name = name
student_age = age
key_values = kw # **kw是以字典類型來存儲傳入的關(guān)鍵字參數(shù)
print("key_values類型:",type(key_values))
print(student_name, student_age, key_values)
a9 = student_info('Jie',18) # key_values類型: <class 'dict'>
Jie 18 {}
a10 = student_info('Jie',18,city='Shanghai',country='China')
# key_values類型: <class 'dict'>
# Jie 18 {'city': 'Shanghai', 'country': 'China'}
把一個已聲明的字典作為關(guān)鍵字參數(shù)傳入 student_info函數(shù),可通過 **+變量名 實現(xiàn)
more_info = {'city': 'Shanghai', 'country': 'China'}
a11 = student_info('Jie',18,\*\*more_info)
**more_info作用是把字典more_info中的key:value解包后作為關(guān)鍵字參數(shù)以字典形式存入kw中
注意:**more_info 只是對more_info拷貝,因此在函數(shù)內(nèi)更改這個more_info是不會對原來的more_info產(chǎn)生影響的
參數(shù)組合
在Python中定義函數(shù)時,可以用必選參數(shù)、默認參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù),組合使用
參數(shù)定義的順序,位置參數(shù)-可變參數(shù)-默認參數(shù)-可變關(guān)鍵字參數(shù)
def func_1(a,b,*args,c=3,**kw):
print(f"參數(shù)a={a},參數(shù)b=,可變參數(shù)args={args},參數(shù)c={c},關(guān)鍵字參數(shù)kw={kw}")
a12 = func_1(1,2) # 參數(shù)a=1,參數(shù)b=2,參數(shù)c=3,可變參數(shù)args=(),關(guān)鍵字參數(shù)kw={}
a13 = func_1(1,2,4,'A','B',k='D',v='E')
# 參數(shù)a=1,參數(shù)b=2,參數(shù)c=4,可變參數(shù)args=('A','B'),關(guān)鍵字參數(shù)kw={'k': 'D', 'v': 'E'}
小結(jié):
1、Python函數(shù)定義中參數(shù)形態(tài)比較靈活,可以傳入復(fù)雜的參數(shù),又方便簡單調(diào)用;
2、默認參數(shù)不能是可變對象(List),可變對象引發(fā)程序邏輯錯誤;
3、可變參數(shù) *args,接收一個tuple;
4、可變關(guān)鍵字參數(shù) **kw, 接收一個dict;
5、可變參數(shù)可直接傳入:func(1,2,3),又可以通過list或tuple,再通過*解包的方式傳入:func(*(1,2,3));
6、關(guān)鍵字參數(shù)可直接傳入:func(x=1,y=2),又可以通過dict,經(jīng)過**解包方式傳入:func(**{'k'=1,'v'=1};
7、參數(shù)組合時,參數(shù)定義順序:位置參數(shù)-可變參數(shù)-默認參數(shù)-可變關(guān)鍵字參數(shù)(同學(xué)們注意下基于python參數(shù)特性,文檔此處有修改)
浙公網(wǎng)安備 33010602011771號