今日主要內(nèi)容
-
函數(shù)初識(shí)
- 函數(shù)定義
- 函數(shù)調(diào)用
- 函數(shù)返回值
- 函數(shù)參數(shù)
一、函數(shù)初識(shí)
(一)為什么要用函數(shù)
-
有一個(gè)需求,給出一個(gè)變量,計(jì)算變量的長(zhǎng)度,要求不能使用
len()
s = "郭老濕今天崩潰了,在后面直嘆氣" count = 0 for i in s: count += 1 print(count)
-
我們利用上述一段代碼完成了需求,很強(qiáng)666。但是問(wèn)題來(lái)了,現(xiàn)在100個(gè)人每個(gè)人給你一個(gè)變量,讓你計(jì)算變量的長(zhǎng)度,此時(shí)只能苦逼的敲代碼來(lái)計(jì)算!!!
s = ...... count = 0 for i in s: count += 1 print(count) lst = ...... count = 0 for i in lst: count += 1 print(count) tu = ...... count = 0 for i in tu: count += 1 print(count) ......................
-
我們發(fā)現(xiàn)一個(gè)問(wèn)題,上述每一段代碼有將近99%的內(nèi)容完全一樣,我們完全可以把這段代碼提前寫出來(lái),等到使用的時(shí)候,拿過(guò)來(lái)用一下,解決了我們重復(fù)性的大問(wèn)題,這就是函數(shù)的產(chǎn)生
def my_len(): # 這就是把我的代碼封裝成一個(gè)函數(shù) count = 0 for i in s: count += 1 print(count) s = [1, 2, 3, 4, 5] my_len() s = "12345" my_len() ......................
-
函數(shù)可以為我們精簡(jiǎn)代碼,把重復(fù)的內(nèi)容封裝起來(lái),需要使用的時(shí)候調(diào)用就好了,同時(shí)加強(qiáng)了代碼的重用性
(二)函數(shù)定義
-
定義函數(shù)的格式:
def 函數(shù)名(): 函數(shù)體
- def:定義函數(shù)的關(guān)鍵字
- 函數(shù)名:函數(shù)名的命名規(guī)范和變量的命名規(guī)范完全相同
- 函數(shù)體: 函數(shù)執(zhí)行 的時(shí)候,真正執(zhí)行的部分
-
補(bǔ)充:定義變量時(shí),開辟的內(nèi)存空間、內(nèi)存地址與變量名之間的關(guān)系
- 內(nèi)存空間:程序執(zhí)行到定義變量?jī)?nèi)一行,先開辟一塊內(nèi)存空間,用來(lái)存放數(shù)據(jù)
- 內(nèi)存地址:當(dāng)內(nèi)存空間開辟之后,內(nèi)存地址同時(shí)就產(chǎn)生了,一個(gè)內(nèi)存空間的地址是永遠(yuǎn)不會(huì)改變的
- 變量名:內(nèi)存地址的外號(hào),可以更快的找到內(nèi)存空間,可有可無(wú)
s = "zxd" print(id("zxd")) # 2844747728632 print(s)
-
此時(shí)已經(jīng)開辟了一塊內(nèi)存空間,同時(shí)產(chǎn)生內(nèi)存地址,之后為了方便找到"zxd",起一個(gè)外號(hào)為a,a也指向這個(gè)內(nèi)存空間
print("zxd") print(id("zxd")) # 2118956123896 # 單執(zhí)行這句話時(shí),開辟了一塊內(nèi)存空間,同時(shí)產(chǎn)生內(nèi)存地址,但是這個(gè)就沒(méi)有變量名,所以變量名可有可無(wú),但內(nèi)存地址是唯一的
(三)函數(shù)調(diào)用
-
函數(shù)的調(diào)用就是 使用之前預(yù)先定義好的函數(shù)
-
函數(shù)調(diào)用方法:
函數(shù)名+()
def play(): print("登陸游戲") print("開始排位賽") print("開始激烈的爭(zhēng)逐...") print("Victory") play() # 函數(shù)名+括號(hào) 就是函數(shù)調(diào)用
-
函數(shù)執(zhí)行順序
- 先定義,在調(diào)用,調(diào)用后執(zhí)行函數(shù)體內(nèi)容
-
在內(nèi)存中的變化
- 定義函數(shù)時(shí)在在內(nèi)存中開辟一塊空間,用于存放函數(shù)體執(zhí)行時(shí)產(chǎn)生的數(shù)據(jù)
- 當(dāng)調(diào)用函數(shù)時(shí),執(zhí)行到每一行代碼都會(huì)新開辟一塊內(nèi)存空間用來(lái)存儲(chǔ)數(shù)據(jù)
(四)函數(shù)返回值
-
為什么要有返回值?
- 函數(shù)在執(zhí)行完之后,會(huì)自動(dòng)銷毀函數(shù)執(zhí)行期間產(chǎn)生的數(shù)據(jù),若外部程序需要用到內(nèi)部函數(shù)產(chǎn)生的數(shù)據(jù),此時(shí)就需要用返回值返回給外部函數(shù)
-
返回值關(guān)鍵字:
return
-
返回值可以將函數(shù)執(zhí)行過(guò)程中產(chǎn)生的數(shù)據(jù)返回,也可以返回任意數(shù)據(jù)
-
如果函數(shù)沒(méi)有return或者return后沒(méi)有寫值都默認(rèn)返回None
-
返回值可以返回多個(gè)數(shù)據(jù),以元組形式存儲(chǔ)
-
返回值是函數(shù)執(zhí)行時(shí)的最后一行代碼,遇到return函數(shù)就結(jié)束了
-
返回值將數(shù)據(jù)返回給調(diào)用者
-
函數(shù)體中可以有多個(gè)返回值,但只執(zhí)行一個(gè)
def func(): print("郭老濕沒(méi)有買到沙發(fā)") print("郭老濕很絕望") print("郭老濕要離我們而去了") return "郭老濕開卡車" a = func() # 返回"郭老濕開卡車"
-
函數(shù)名+()
的全部作用:- 調(diào)用函數(shù)
- 接收返回值
(五)函數(shù)參數(shù)
-
看我們一段上面的代碼
def play(): print("登陸游戲") print("開始排位賽") print("開始激烈的爭(zhēng)逐...") print("Victory") play()
-
這是LOL大概的流程,但是我們忽略了一點(diǎn),打排位得選英雄吧,那么此時(shí)我們需要填入一個(gè)參數(shù)來(lái)決定我們選擇的英雄
def play(hero): print("登陸游戲") print("開始排位賽") print("選擇英雄", hero) print("進(jìn)入召喚師峽谷") print("開始激烈的爭(zhēng)逐...") print("Victory") play("卡莎")
-
而hero就是我們填入的參數(shù),在函數(shù)執(zhí)行的時(shí)候,我們傳入的參數(shù)就會(huì)通過(guò)函數(shù)名傳入到我們的函數(shù)體中,這有點(diǎn)類似我們的格式化輸出,參數(shù)其實(shí)可以理解為一個(gè)占位符,通過(guò)函數(shù)調(diào)用時(shí)傳進(jìn)去,接下來(lái)我們來(lái)看看參數(shù)的分類
-
形參(形式參數(shù)):函數(shù)定義時(shí)填入的參數(shù)
- 位置參數(shù):按照位置順序來(lái)接收實(shí)參傳來(lái)參數(shù)
def play(game, hero, take): # 按照位置接收實(shí)參 print(f"登陸{game}") print(f"選擇角色:{hero}") print(f"開始游戲:{take}") print("結(jié)束游戲") play("LOL", "卡莎", "發(fā)育、對(duì)線、打團(tuán)") play("DNF", "念皇", "刷深淵、打團(tuán)")
- 默認(rèn)值參數(shù):在函數(shù)聲明的時(shí)候就可以給出參數(shù)的默認(rèn)值,當(dāng)實(shí)際調(diào)用的時(shí)候可以給出具體的值,也可以不給
def msg(name="zxd", age=23, sex="男"): # 默認(rèn)值參數(shù) dic = dict() dic["name"] = name dic["age"] = age dic["sex"] = sex return dic print(msg()) # 默認(rèn)值參數(shù)可以傳也可以不傳
-
混合參數(shù):兩種參數(shù)混合使用
- 優(yōu)先級(jí):位置參數(shù) > 默認(rèn)值參數(shù),位置參數(shù)一定要在默認(rèn)值參數(shù)前
def msg(name, age, sex="男"): # 混合參數(shù) dic = dict() dic["name"] = name dic["age"] = age dic["sex"] = sex return dic print(msg("zxd", 23))
-
實(shí)參(實(shí)際參數(shù)):函數(shù)調(diào)用時(shí)填入的參數(shù)
- 位置參數(shù):按位置照順序填入實(shí)際的參數(shù)
def play(game, hero, take): print(f"登陸{game}") print(f"選擇角色:{hero}") print(f"開始游戲:{take}") print("結(jié)束游戲") play("LOL", "卡莎", "發(fā)育、對(duì)線、打團(tuán)") play("DNF", "念皇", "刷深淵、打團(tuán)") # 按照位置接收實(shí)參
- 關(guān)鍵字參數(shù):按照參數(shù)名字指定傳參,不用考慮位置順序
def play(game, hero, take): print(f"登陸{game}") print(f"選擇角色:{hero}") print(f"開始游戲:{take}") print("結(jié)束游戲") play(game="LOL", take="發(fā)育、對(duì)線、打團(tuán)", hero="卡莎") play(take="刷深淵、打團(tuán)", game="DNF", hero="念皇") # 關(guān)鍵字參數(shù)
-
混合參數(shù):兩種參數(shù)混合使用
- 優(yōu)先級(jí):位置參數(shù) > 關(guān)鍵字參數(shù),位置參數(shù)必須寫在關(guān)鍵字參數(shù)之前
def play(game, hero, take): print(f"登陸{game}") print(f"選擇角色:{hero}") print(f"開始游戲:{take}") print("結(jié)束游戲") play("LOL", "卡莎", "發(fā)育、對(duì)線、打團(tuán)") play("DNF", "念皇", take="刷深淵、打團(tuán)") # 混合參數(shù)
-
傳參:傳參就是實(shí)際參數(shù)傳給形式參數(shù)的一個(gè)過(guò)程
- 紅色箭頭就是傳參的過(guò)程,將實(shí)參按照位置傳給形參
- 綠色箭頭代表函數(shù)把接收到的參數(shù)分配給自己的函數(shù)體,此時(shí)和傳參沒(méi)有關(guān)系,通過(guò)相同的形參名將參數(shù)分配給函數(shù)體
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
