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

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