本節(jié)知識大綱:
函數(shù)是實現(xiàn)某個特定功能的代碼塊的集合:
一办桨、認識函數(shù)
1.使用函數(shù)的好處:
(1) 分而治之:通過函數(shù)將程序分一個個小模塊,如果代碼出現(xiàn)了問題調(diào)試起來要容易得多昭卓,否則寫在一個代碼塊里會很麻煩
(2) 代碼復用:反復使用某一功能的代碼,不需要進行多次書寫辩棒,大大減少代碼量
(3) 可讀性強:分開成多個小的代碼塊可讀性強
(4) 代碼的封裝:使用函數(shù)的用戶不需要了解方法實現(xiàn)的細節(jié)贞绳,可以直接使用方法
2. 使用函數(shù)的例子
通過函數(shù)實現(xiàn)兩個數(shù)的加減乘除
def get_add_result(num01,num02):
return num01 + num02
def get_sub_result(num01,num02):
return num01 - num02
def get_mul_result(num01,num02):
return num01 * num02
def get_div_result(num01,num02):
return num01 / num02
if __name__ == "__main__":
print(get_add_result(100,20)) # 調(diào)用兩數(shù)相加的函數(shù)
print(get_sub_result(100,20)) # 調(diào)用兩數(shù)相減的函數(shù)
print(get_mul_result(100,20)) # 調(diào)用兩數(shù)相乘的函數(shù)
print(get_div_result(100,20)) # 調(diào)用兩數(shù)相除的函數(shù)
二、函數(shù)的定義
1. 語法格式
def 函數(shù)名稱(參數(shù)列表):
"""函數(shù)的功能說明"""
函數(shù)具體代碼
return[expression]
2. 創(chuàng)建函數(shù)的規(guī)則
(1)函數(shù)代碼塊以def
關(guān)鍵詞開頭操骡,后接函數(shù)標識名稱和圓括號()
(2)傳入的參數(shù)和自變量放于圓括號中間
(3)函數(shù)的第一行語句最好寫上注釋用于說明函數(shù)的功能
(4)return關(guān)鍵詞既是一個返回值的關(guān)鍵詞也是標志函數(shù)結(jié)束的標識符
(5)如果函數(shù)無返回值九火,可以不寫return語句或者只寫一個return關(guān)鍵詞
案例:
生成若干個整數(shù)的集合,求最大數(shù)册招、最小數(shù)岔激、元素之和、元素的平均數(shù):
from random import randint
def build_array(start_num:int,end_num,number:int):
"""
功能描述:生成若干個固定長度的整數(shù)集合
~~~~~~~~~~~~~~~~~~~
:param start_num: 指定整數(shù)范圍的起始值
:param end_num: 指定整數(shù)范圍的結(jié)束值
:param number: 生成的數(shù)量
:return: 整數(shù)的集合
"""
number_list = []
for i in range(number):
number_list.append(randint(start_num,end_num))
return number_list
def max_of_list(num_list):
"""
功能描述:求集合中的最大數(shù)
:param num_list: 集合
:return: 集合中的最大數(shù)
"""
max_value = num_list[0]
for i in range(len(num_list)):
if num_list[i] > max_value:
max_value = num_list[i]
return max_value
def min_of_list(num_list):
"""
功能描述:求集合中的最小數(shù)
:param num_list: 集合
:return: 最小數(shù)
"""
min_num = min(num_list)
return min_num
def sum_of_list(num_list):
"""
功能描述:求集合中元素之和
:param num_list: 集合
:return: 元素之和
"""
sum_list = 0
for i in num_list:
sum_list += i
return sum_list
def avg_of_list(num_list):
"""
功能描述:求集合中元素的平均數(shù)
:param num_list: 集合
:return: 平均數(shù)
"""
avg_num = sum_of_list(num_list)/len(num_list)
return avg_num
if __name__ == "__main__":
# 創(chuàng)建10個整數(shù)集合
num_list = build_array(10,100,10)
print(num_list)
# 求最大數(shù)
print("最大數(shù)為:",max_of_list(num_list))
# 求最小數(shù)
print("最小數(shù)為:",min_of_list(num_list))
# 求和
print("和為:",sum_of_list(num_list))
# 求平均值
print("平均值為:",avg_of_list(num_list))
輸出結(jié)果:
[93, 17, 17, 34, 69, 33, 98, 21, 18, 80]
最大數(shù)為: 98
最小數(shù)為: 17
和為: 480
平均值為: 48.0
三是掰、不定長參數(shù)
1. 含有不定參數(shù)
定義一個函數(shù)時虑鼎,如果不確定參數(shù)的數(shù)量,則使用不定長參數(shù),即在參數(shù)前面加*號表示這是一個不定長參數(shù)炫彩。
def sum_of_num(*args):
當我們查看這個不定長參數(shù)的數(shù)據(jù)類型時匾七,發(fā)現(xiàn)它其實是一個元組類型;
注意:當給不定參數(shù)的函數(shù)傳遞列表或者字典時江兢,一定要給實參變量加*號解封裝昨忆,否則會報錯
案例:
求一些整數(shù)之和
def sum_of_num(*args):
"""
功能介紹:求一組數(shù)字之和
:param args: 提供的數(shù)字元組
:return: 所有的數(shù)字之和
"""
sum = 0
for i in args:
sum += i
return sum
if __name__ == "__main__":
print(sum_of_num(11,22,22,22))
list01 = [11,22,33,44,55]
tuple01 = (11,22,33)
print(sum_of_num(*list01)) # 加*號給列表解封裝
print(sum_of_num(*tuple01)) # 加*號給元組解封裝
2. 既有普通參數(shù)也有不定參數(shù)
如果函數(shù)具有不定長參數(shù)外還有其它參數(shù),一定要把不定長參數(shù)放到最后杉允。
# 求不定長參數(shù)
def print_number(num01,num02,*args):
print("num01:",num01)
print("num02:",num02)
print("args:",args)
if __name__ == "__main__":
print_number(11,22,33,44,55,66)
輸出結(jié)果:
num01: 11
num02: 22
args: (33, 44, 55, 66)
注意:在調(diào)用的時候邑贴,系統(tǒng)會把實參先匹配普通參數(shù),普通參數(shù)全部匹配完之后再匹配不定參數(shù)
3. 參數(shù)為不定長的字典
參數(shù)為不定長的字典類型叔磷,定義函數(shù)時使用兩個*
號拢驾,給定義的函數(shù)傳值時,key即使是字符串也不要雙引號改基,且把冒號改為等于號独旷;如果直接把字典變量傳遞給定義的函數(shù)記得也要加雙*
號解包。
def sum_of_result(**kwargs):
sum = 0
for key in kwargs:
sum += kwargs[key]
return sum
if __name__ == '__main__':
print(sum_of_result(語文=82,數(shù)學=99))
print(sum_of_result(語文=82, 數(shù)學=99,外語=89))
dict01 = {"語文":89,"數(shù)學":98,"英語":88,"物理":87}
print(sum_of_result(**dict01))
4. 參數(shù)既有普通參數(shù)又有元組又有字典
如果定義的函數(shù)有普通參數(shù)寥裂、不定長元組嵌洼、不定長字典,那么在函數(shù)定義的時候的順序是:普通參數(shù)->不定長元組->不定長字典封恰;
在調(diào)用的時候先匹配普通參數(shù)再匹配不定長元組再匹配不定長字典麻养。
def print_result(num01,*args,**kwargs):
print("num01=",num01)
print("args=",args)
print("kwargs=",kwargs)
if __name__ == '__main__':
print_result(100,200,300,400,語文=100,數(shù)學=98)
輸出結(jié)果:
num01= 100
args= (200, 300, 400)
kwargs= {'語文': 100, '數(shù)學': 98}
四、函數(shù)的調(diào)用
1. 形參與實參的概念
形參:函數(shù)中的參數(shù)
實參:調(diào)用函數(shù)的時候提供的參數(shù)
2. 調(diào)用方法
(1)調(diào)用的標準做法:實參诺舔、形參必須要一一對應
from random import randint
def build_array(start_num:int,end_num:int,number:int):
number_list = []
for i in range(number):
number_list.append(randint(start_num,end_num))
return number_list
if __name__ == '__main__':
# 實參鳖昌、形參一一對應,生成5個從10到20的隨機數(shù)
print(build_array(10,20,5))
(2)調(diào)用的時候指明參數(shù)的名稱低飒,這種情況下調(diào)用的順序可以和函數(shù)的順序不一致
from random import randint
def build_array(start_num:int,end_num:int,number:int):
number_list = []
for i in range(number):
number_list.append(randint(start_num,end_num))
return number_list
if __name__ == '__main__':
# 指明參數(shù)的名稱調(diào)用的時候不需要按照形參的順序许昨,這里表示生成5個從10到99的隨機數(shù)
print(build_array(number=5,end_num=99,start_num=10))
(3)在形參后面設(shè)置默認值,如果實參沒有聲明,函數(shù)就以默認值執(zhí)行
from random import randint
def build_array(start_num:int = 100 ,end_num:int = 200,number:int = 10):
number_list = []
for i in range(number):
number_list.append(randint(start_num,end_num))
return number_list
if __name__ == '__main__':
# 在形參后面設(shè)置默認值褥赊,如果實參沒有聲明,函數(shù)就以默認值執(zhí)行糕档,這里表示生成10個從1000到2000的隨機數(shù)
print(build_array(start_num= 1000,end_num= 2000))
五、多個返回值
我們知道函數(shù)中是以return關(guān)鍵字來返回函數(shù)執(zhí)行的結(jié)果拌喉,但是如果一個函數(shù)想要返回多個值該怎么處理呢速那?
案例:
生成若干整數(shù)的集合,求最大數(shù)尿背、最小數(shù)端仰、元素之和:
方法一:把輸出的結(jié)果存在一個列表里,函數(shù)返回一個列表田藐,在主函數(shù)調(diào)用的時候調(diào)用這個列表里的元素荔烧;
from random import randint
def build_array(start_num:int,end_num:int,number:int):
number_list = []
for i in range(number):
number_list.append(randint(start_num,end_num))
return number_list
def get_result_01(list01:list):
result_list=[] # 第一個元素就是最大值吱七、第二個元素就是最小值、第三元素就是和
max_result = list01[0]
min_result = list01[0]
sum_result = 0
# 求最大值鹤竭、最小值踊餐、求和
for i in list01:
if i > max_result: max_result = i
if i < min_result: min_result = i
sum_result += i
result_list.append(max_result)
result_list.append(min_result)
result_list.append(sum_result)
# 返回一個列表
return result_list
if __name__ == '__main__':
# 生成集合
list_number = build_array(number=10,start_num=100,end_num=200)
print(list_number)
# 最大值、最小值诺擅、求和
result_list = get_result_01(list_number)
print("最大值",result_list[0])
print("最小值",result_list[1])
print("所有元素之和",result_list[2])
方法二:把函數(shù)返回的結(jié)果封裝在元組里市袖,用逗號隔開,可以加括號也可以不加烁涌,
# 生成若干整數(shù)的集合苍碟,求最大數(shù)、最小數(shù)撮执、元素之和
from random import randint
def build_array(number:int,start_number:int,end_number):
number_list = []
for i in range(number):
number_list.append(randint(start_number,end_number))
return number_list
# 方法02
def get_result_02(list01:list):
max_number = list01[0]
min_number = list01[0]
sum_number = 0
number_result = []
for i in list01:
if i > max_number: max_number = i
if i < min_number: min_number = i
sum_number += i
return (max_number,min_number,sum_number)
if __name__ == '__main__':
# 生成整數(shù)集合
raw_number_list = build_array(10,10,100)
# 最值微峰、求和
max_number,min_number,sum_number = get_result_02(raw_number_list)
print("最大值為", max_number)
print("最小值為", min_number)
print("和為", sum_number)
六、可變對象和不可變對象
先看一個案例:
def update_number(num01,result:list):
num01 = num01 +100
result[0] = result[0] + 100
if __name__ == '__main__':
num01 = 100
result_array = [11,22,33,44,55]
# 調(diào)用函數(shù)
update_number(num01,result_array)
# 輸出
print(num01)
print(result_array[0])
輸出結(jié)果:
100
111
傳遞參數(shù)的方式:
(1)按值傳遞抒钱,針對不可變對象蜓肆,有數(shù)值類型:int、float谋币、bool;字符串類型:string仗扬;元組:tuple
按值傳遞指每次傳遞參數(shù)時,把參數(shù)的原始數(shù)值拷貝一份新的蕾额,把新拷貝出來的數(shù)值傳遞到方法內(nèi)部早芭,在方法內(nèi)部修改時,則修改的是拷貝出來的值诅蝶,而原始的值不發(fā)生改變退个。
使用該方法傳遞的參數(shù),參數(shù)原始的值不發(fā)生改變调炬。
(2)按地址傳遞语盈,針對可變對象,有l(wèi)ist缰泡、dict
按地址傳遞指每次傳遞參數(shù)時刀荒,把引用類型參數(shù)的存儲在棧中的內(nèi)存地址復制一份,把新拷貝出來的內(nèi)存地址傳遞到方法內(nèi)部匀谣,在方法內(nèi)部修改時照棋,則修改的是內(nèi)存地址指向的對空間的值,所以修改完成后對于原數(shù)據(jù)也產(chǎn)生影響武翎。
使用該方式傳遞的參數(shù),參數(shù)原始的值發(fā)生改變溶锭。
總結(jié):按值傳遞宝恶,在函數(shù)中的修改不影響調(diào)用的實參;按地址傳遞,修改的值影響調(diào)用的實參
七垫毙、遞歸函數(shù)
遞歸函數(shù)就只自己對自己的反復調(diào)用
案例1:
求一個數(shù)的階乘
def get_result(num01):
if num01 == 1:
return 1
else:
return num01 * get_result(num01-1)
if __name__ == '__main__':
result_mul = get_result(10) # 10的階乘
print(result_mul)
結(jié)果:
3628800
案例2:
求包含列表和元組內(nèi)所有元素之和
def sum_of_result(*args):
sum_result = 0
for i in args:
if isinstance(i,(int,float,bool)):
sum_result += i
elif isinstance(i,(list,tuple)):
sum_result += sum_of_result(*i)
return sum_result
if __name__ == '__main__':
result = sum_of_result(10,10,[10],(10,10,[10,10,[10]]))
print(result)
輸出結(jié)果:
80