Python基礎(chǔ)學習筆記(七)函數(shù)

本節(jié)知識大綱:


圖片.png

函數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霹疫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子综芥,更是在濱河造成了極大的恐慌丽蝎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膀藐,死亡現(xiàn)場離奇詭異屠阻,居然都是意外死亡,警方通過查閱死者的電腦和手機额各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門国觉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虾啦,你說我怎么就攤上這事麻诀。” “怎么了傲醉?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵蝇闭,是天一觀的道長。 經(jīng)常有香客問我硬毕,道長呻引,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任昭殉,我火速辦了婚禮苞七,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挪丢。我一直安慰自己蹂风,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布乾蓬。 她就那樣靜靜地躺著惠啄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪任内。 梳的紋絲不亂的頭發(fā)上撵渡,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音死嗦,去河邊找鬼趋距。 笑死,一個胖子當著我的面吹牛越除,可吹牛的內(nèi)容都是我干的节腐。 我是一名探鬼主播外盯,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼翼雀!你這毒婦竟也來了饱苟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狼渊,失蹤者是張志新(化名)和其女友劉穎箱熬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狈邑,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡城须,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了官地。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酿傍。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驱入,靈堂內(nèi)的尸體忽然破棺而出赤炒,到底是詐尸還是另有隱情,我是刑警寧澤亏较,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布莺褒,位于F島的核電站,受9級特大地震影響雪情,放射性物質(zhì)發(fā)生泄漏遵岩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一巡通、第九天 我趴在偏房一處隱蔽的房頂上張望尘执。 院中可真熱鬧,春花似錦宴凉、人聲如沸誊锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丧靡。三九已至,卻和暖如春籽暇,著一層夾襖步出監(jiān)牢的瞬間温治,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工戒悠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熬荆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓绸狐,卻偏偏與公主長得像惶看,于是被迫代替她去往敵國和親捏顺。 傳聞我的和親對象是個殘疾皇子六孵,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359