什么是函數
我們目前為止,已經可以完成一些軟件的基本功能了,那么我們來完成這樣一個功能:約x
pint("拿出手機") print("打開陌陌") print("找個漂亮的妹子") print("問她,約不約啊!") print("ok 走起")
ok so easy我們已經完成了對一個功能的描述,那么問題來了,我還想在約一次怎么搞,是不是就是在寫一遍
# 約一次 pint("拿出手機") print("打開陌陌") print("找個漂亮的妹子") print("問她,約不約啊!") print("ok 走起") # 再約一次 pint("拿出手機") print("打開陌陌") print("找個漂亮的妹子") print("問她,約不約啊!") print("ok 走起")
ok 非常簡單搞定了,但是我還想約上個10次8次的,怎么搞,加個循環不就行了嗎?
while True: pint("拿出手機") print("打開陌陌") print("找個漂亮的妹子") print("問她,約不約啊!") print("ok 走起")
這樣不就能實現不停的約了嗎?但是呢 我一直約不是干不了別的了嗎?.人要有節制,有需求了再約,這樣比較好.所以呢這樣寫是不行的
最好是我想什么時候約就什么時候約. 好了說的這 我們就這樣做,把約這個事,先計划好,然后按照安排好的流程.在需要約的時候 把這個約
的流程拿出來執行以下就好了.那么這里.我們可以先去定義一個事情或者是功能,等到需要的時候直接去用就好了.那么這里定義東西就是一個函數
函數:對代碼塊和功能的封裝和定義
函數的定義
首先咱們認識一下要實現我們剛說的功能必備的知識點
def 函數名(): 函數體
我們使用def關鍵字來定義函數,函數的定義語法,這里的函數名的命名規則和變量的命名規則一樣.自己回顧一下變量的命名規則
函數體:就是函數被執行之后要執行的代碼
我們現在就來實現剛剛我們說的定義一個約x功能:
def make(): print("拿出手機") print("打開陌陌") print("找一個漂亮的妹子") print("問她,約不約啊") print("ok 走起")
哦了,這就定義完了,但是這個時候我們去執行,會發生什么現象? 什么都沒有發生.因為我只定義了一個函數.但是還沒有執行過這個函數.
函數的調用
使用函數名加小括號就可以調用了 寫法:函數名() 這個時候函數的函數體會被執行
# 調用yue函數 def make(): print("拿出手機") print("打開陌陌") print("找一個漂亮的妹子") print("問 約不約啊") print("ok 走起") make() # 這是make函數的調用 結果: 拿出⼿手機 打開陌陌 找個漂亮的妹⼦ 問她, 約不約啊 ok. 走你
函數的執行流程
現在就實現了約一次,我想要約幾次我就只需要
make() make() make() make() make() make()
直接調用定義好的函數就可以了 咱們約完之后的得有個結果吧, 比如是約的蘿莉,還是大媽啊總得有個結果,那么這個結果
怎么來描述和獲得呢? 這就涉及到函數的返回值啦
函數的返回值
執行完函數之后,我們可以使用return來返回結果
def make(): print("約你") print("約我") print("約他") return print("約誰呀") # 這句話不會被執行 make()
函數中遇到return,此函數結束.不在繼續執行
我們現在有return返回值,我們試試返回個東西
def make(): print("約你") print("約我") print("約他") return "美女一枚" make()
我們現在返回了一個字符串,但是返回給誰了呢? 這個返回值返回給函數的調用者了,我們來看一下
def make(): print("約你") print("約我") print("約他") return '美女一枚' girl = make() print(girl) 結果: 約你 約我 約他 美女一枚
肯定好多朋友還是不明白上邊怎么就打印美女一枚了,莫慌看下圖:
1.定義了一個函數make 2.調用函數 3.執行函數里的約你 4.執行函數里的約我 5.執行函數里的約他 6.返回給調用者一個字符串'美女一枚',這個調用者就是make() 7.將返回的字符串通過一個等號賦值給白變量girl 8.打印變量girl的值
函數的返回值可以有多個結果:
def make(): print("約你") print("約我") print("約他") return "美女一枚", "蘿莉一枚" girl = make() print(type(girl)) # tuple
總結一下:
1.遇到return,此函數結束,函數后面的東西將不會在執行
2.return 返回值
關於返回值:
如果return什么都不寫或者干脆就沒寫return,返回的結果就是None
如果return后面寫了一哥值,則調用者可以接受一個結果
如果return后面寫了多個結果,則調用者可以接受一個tuple,調用者可以直接使用解構獲取多個變量
OK,完美 可以得到結果了 但是我們約的方式是不是有點問題啊?陌陌現在還能約到嗎?約不到了 我們換探探 那要是過幾天探探也不行了
是不是會有一個替代品,那你們想有一個替代的,你就需要去改代碼.是不是有點不合適了 最好的方式是想用什么約就用什么約 ok 我們也是可以實現的
我們可以在函數后邊的括號里搞點事情
函數的參數
參數,也就是函數括號里的內容 函數在調用的時候指定一個具體的變量的值 就是參數.寫法如下:
def 函數名(參數): 函數體
我們應該把代碼改一下,能夠實現我剛說的那種效果
def make(chat): print("拿出⼿手機") print("打開"+chat) print("找個漂亮的妹⼦子") print("約不不約") make("陌陌") make("微信") make("探探") 結果: 拿出手機 打開陌陌 找個漂亮的妹⼦ 約不約 拿出⼿機 打開微信 找個漂亮的妹⼦ 約不約 拿出手機 打開探探 找個漂亮的妹⼦ 約不約
搞定了. 我們在調用make的時候給chat一個值. 然后再執行函數體.
參數
1.形參
寫在函數聲明的位置的變量叫形參,形式上的一個完整.表示這個函數需要xxx
2.實參
在函數調用的時候給函數傳遞的值.加實參,實際執行的時候給函數傳遞的信息.表示給函數xxx
3.傳參
給函數傳遞信息的時候將實際參數交給形式參數的過程被稱為傳參.
def make(chat): # chat 形參 print("拿出手機") print("打開"+chat) print("找個漂亮的妹子") print("約不約") make("陌陌") # 實參 len("字符串") # "字符串"在這⾥里里就是實參 print("麻花藤") # "麻花藤"就是實參
參數的分類
1.位置參數
約到現在,有沒有想過這么一個問題,什么樣的都約么? 哪里的都約么? 不一定吧.比如我現在在北京,我很寂寞,我喜歡小姐姐
alex在泰國,很寂寞 來一個就行了 .需要是不一樣的 而我們現在的函數沒沒有這寫功能 那怎么辦呢? 很簡單 多來幾個參數就好了
def make(chat,addr,age): # chat 形參 print("拿出手機") print("打開"+chat) print("找個" + addr +"附近漂亮的" + str(age) + "歲妹子") print("約不約") make("陌陌","北京",18) # 實參 結果: 拿出手機 打開陌陌 找個北京附近漂亮的18歲妹子 約不約
上述代碼分析: 在訪問make()的時候,我們按照位置的順序分別把"陌陌","北京",18賦值給了chat,addr,age,在傳參過程中.系統會按照位置吧實參賦值到形參
練習
編寫函數,給函數傳遞兩個參數a,b a,b相加 返回a參數和b參數相加的和
def f(a,b):
c = a+b
return c
num_sum = f(5,8)
print(num_sum)
結果: 13
編寫函數,給函數傳遞兩個參數a,b 比較a,b的大小 返回a,b中最大的那個數
def f(a,b): if a>b: return a else: return b num_sum = f(5,8) print(num_sum) 結果:8
比較大小的這個寫法有點麻煩,我們在這里學一個三元運算符
def f(a,b): c = a if a > b else b #當a>b就把a賦值給c,否則就把b賦值給c return c msg = f(5,7) print(msg) 結果: 7
關鍵字參數
位置參數好不好呢? 如果是少量的參數還算OK, 沒有問題. 但是如果函數在定義的時候參數非常多怎么辦? 程序員必須記住, 我有哪些參數, 而且還有記住每個參數的位置, 否則函數就不能正常調用了. 那則么辦呢? python提出了一種叫做關鍵字參數. 我們不需要記住每個參數的位置. 只要記住每個參數的名字就可以了
def make(chat, address, age): print("拿出手機") print("打開"+chat) print("找個"+address+"附近漂亮的"+str(age)+"歲妹子") print("約不約") make(chat="微信", age=18, address="北京") # 關鍵字參數. 結果: 拿出手機 打開微信 找個北京附近漂亮的18歲妹子 約不約
搞定, 這樣就不需要記住繁瑣的參數位置了.
混合參數
可以把上面兩種參數混合着使用. 也就是說在調用函數的時候即可以給出位置參數, 也可以指定關鍵字參數.
# 混合參數
make("微信", age=18, address="上海")# 正確.第一個位置賦值給chat, 后面的參數開始指定關鍵字. make(age="18", "微信", address="廣州") # 錯誤, 最開始使用了關鍵字參數, 那么后面的 微信的位置就串了, 容易出現混亂
注意: 在使用混合參數的時候, 關鍵字參數必須在位置參數后面
綜上: 在實參的⾓角度來看. 分為三種:
1. 位置參數
2. 關鍵字參數
3. 混合參數, 位置參數必須在關鍵字參數前面
位置參數:
位置參數,按照位置來賦值,到目前為止,我們編寫的函數都是這種
def make(chat, address, age): print("拿出手機") print("打開"+chat) print("找個"+address+"附近漂亮的"+str(age)+"歲妹子") print("約不約")
默認值參數:
在函數聲明的時候, 就可以給出函數參數的默認值. 在調用的時候可以 給出具體的值, 也可以不給值, 使⽤用默認值. 比如, 我們錄入咱們班學生的基本信息. 通過調查發現. 我們班大部分學生都是男生. 這個時 候就可以給出⼀一個sex='男'的默認值.
def stu_info(name, age, sex='男'): print("錄入學生信息") print(name, age, sex) print("錄入完畢") stu_info("張強", 18)
注意:必須先聲明在位置參數,才能聲明關鍵字參數
綜上:在形參的角度來看
1. 位置參數
2. 默認值參數(大多數傳進來的參數都是一樣的, 一般用默認參數)
在實參的角度來看
1.位置參數 就是按照順序傳遞
2.默認值參數(在填寫參數的時候需要指定傳遞到形參中那個變量)