函數:就是讓程式模塊化,把具有獨立功能的代碼塊當成一個整體封裝成一個函數 首先列印一個佛主看看: 那麼這個時候我們想列印很多遍佛主的話,總不能一直複製粘貼,所以我們需要定義一個列印佛主函數: 帶有參數的函數 首先我們來定義一個函數來計算兩個數的總和: 這樣會不會有點太死板了,我們希望能夠從鍵盤輸入a ...
函數:就是讓程式模塊化,把具有獨立功能的代碼塊當成一個整體封裝成一個函數
首先列印一個佛主看看:
print(" _ooOoo_ ") print(" o8888888o ") print(" 88 . 88 ") print(" (| -_- |) ") print(" O\\ = /O ") print(" ____/`---'\\____ ") print(" . ' \\| |// `. ") print(" / \\||| : |||// \\ ") print(" / _||||| -:- |||||- \\ ") print(" | | \\\\\\ - /// | | ") print(" | \\_| ''\\---/'' | | ") print(" \\ .-\\__ `-` ___/-. / ") print(" ___`. .' /--.--\\ `. . __ ") print(" ."" '< `.___\\_<|>_/___.' >'"". ") print(" | | : `- \\`.;`\\ _ /`;.`/ - ` : | | ") print(" \\ \\ `-. \\_ __\\ /__ _/ .-` / / ") print(" ======`-.____`-.___\\_____/___.-`____.-'====== ") print(" `=---=' ") print(" ") print(" ............................................. ") print(" 佛祖鎮樓 BUG辟易 ") print(" 佛曰: ") print(" 寫字樓里寫字間,寫字間里程式員; ") print(" 程式人員寫程式,又拿程式換酒錢。 ") print(" 酒醒只在網上坐,酒醉還來網下眠; ") print(" 酒醉酒醒日復日,網上網下年復年。 ") print(" 但願老死電腦間,不願鞠躬老闆前; ") print(" 賓士寶馬貴者趣,公交自行程式員。 ") print(" 別人笑我忒瘋癲,我笑自己命太賤; ") print(" 不見滿街漂亮妹,哪個歸得程式員?")
那麼這個時候我們想列印很多遍佛主的話,總不能一直複製粘貼,所以我們需要定義一個列印佛主函數:
def print_fozhu(): #首先在開始定義列印佛主的函數,函數名為print_fozhu print(" _ooOoo_ ") print(" o8888888o ") print(" 88 . 88 ") print(" (| -_- |) ") print(" O\\ = /O ") print(" ____/`---'\\____ ") print(" . ' \\| |// `. ") print(" / \\||| : |||// \\ ") print(" / _||||| -:- |||||- \\ ") print(" | | \\\\\\ - /// | | ") print(" | \\_| ''\\---/'' | | ") print(" \\ .-\\__ `-` ___/-. / ") print(" ___`. .' /--.--\\ `. . __ ") print(" ."" '< `.___\\_<|>_/___.' >'"". ") print(" | | : `- \\`.;`\\ _ /`;.`/ - ` : | | ") print(" \\ \\ `-. \\_ __\\ /__ _/ .-` / / ") print(" ======`-.____`-.___\\_____/___.-`____.-'====== ") print(" `=---=' ") print(" ") print(" ............................................. ") print(" 佛祖鎮樓 BUG辟易 ") print(" 佛曰: ") print(" 寫字樓里寫字間,寫字間里程式員; ") print(" 程式人員寫程式,又拿程式換酒錢。 ") print(" 酒醒只在網上坐,酒醉還來網下眠; ") print(" 酒醉酒醒日復日,網上網下年復年。 ") print(" 但願老死電腦間,不願鞠躬老闆前; ") print(" 賓士寶馬貴者趣,公交自行程式員。 ") print(" 別人笑我忒瘋癲,我笑自己命太賤; ") print(" 不見滿街漂亮妹,哪個歸得程式員?") print_fozhu() #然後在下麵調用print_fozhu函數 print_fozhu()
帶有參數的函數
首先我們來定義一個函數來計算兩個數的總和:
def sum(): #表示定義一個函數,函數名為sum a = 20 b = 30 sum = a+b print("%d+%d=%d"%(a,b,sum)) sum() #在下麵調動這個函數
這樣會不會有點太死板了,我們希望能夠從鍵盤輸入a和b去獲取這兩個數的總和,那麼需要怎麼做呢?
def sum(a,b): #在上面定義搞一個函數,函數名為sum,並且攜帶兩個參數a,b,用來接收的叫做形參 sum = a+b print("%d+%d=%d"%(a,b,sum)) num1 = int(input("第1個值:")) #input鍵盤輸入的值是字元串類型,需要用int()轉換成整形 num2 = int(input("第2個值:")) sum(num1,num2) #在調用sum函數時,等於把num1和num2傳到sum()函數里去,調用時的傳的參數叫做實參
root@test:~/codes# python3 01-帶有參數的函數-input.py
第1個值: 10
第2個值:50
10+50=60
return的作用:所謂“返回值”,就是程式中函數完成一件事情後,最後給調用者的結果
比如:我給了我的朋友22塊錢,讓他幫我去買一包煙,然後朋友買完回來了把煙交給我,這個煙就是返回值
其次,在獲取鍵盤輸入時,也是這種道理:
In [1]: name = input("Name:") Name:laowang In [2]: name Out[2]: 'laowang' #相當於才從鍵盤獲取了一個值,然後拿給了name
那麼,我們現在來舉一個例子來說明return的作用:
def get_wendu(): #這裡定義一個獲取溫度的函數get_wendu wendu = 22 #定義一個wendu變數 print("當前的室溫是%d"%wendu) def get_wendu_huashi(): #定義一個獲取華氏溫度的函數get_wendu_huashi wendu = wendu + 2 #假設華氏溫度=溫度+2 print("當前的室溫(華氏)是%d"%wendu) get_wendu_huashi() #調用剛剛定義的函數,get_wendu_huashi
讓我們看一下運行結果:
Traceback (most recent call last):
File "02-獲取溫度.py", line 10, in <module>
get_wendu_huashi()
File "02-獲取溫度.py", line 7, in get_wendu_huashi
wendu = wendu + 2
UnboundLocalError: local variable 'wendu' referenced before assignment #這句話表示在聲明變數wendu之前就已經對其調用,定位到錯誤的地方了
讓我來解釋一下:在函數中定義的變數,只允許在當前函數中使用,在其他函數里不能用,而且函數中不允許直接調用結果那麼意思就是在get_wendu中定義的變數wendu,到了get_wendu_huashi中卻不認識這個wendu變數
讓我們來看一下修改後的代碼:
def get_wendu(): wendu = 22 print("當前的室溫是%d"%wendu) return wendu #在這裡我們使用了return函數,那麼意味著我們可以把這個值、這個結果返回到調用的地方 def get_wendu_huashi(wendu): #wendu是形參,用來接收的 wendu = wendu + 2 print("當前的室溫(華氏)是%d"%wendu) result = get_wendu() #return時需要有個容器來把結果存放起來,然後再傳入時,把這個結果給存進去 get_wendu_huashi(result) #在調用get_wendu_huashi函數時,把result這個變數作為實參給傳送到函數里去
運行結果如下:
root@test:~/codes# python3 !$
python3 02-獲取溫度.py
當前的室溫是22
當前的室溫(華氏)是24
大功告成.....
總結:如果在一個函數中有了return,那麼就意味著這個函數可以把一個值,一個結果返回到調用的地方,return時需要有個東西把結果存放起來,然後在傳入時把這個東西存進去
如果一個函數想要有多個return,可以寫多個return,但是函數一旦運行到return,函數就會結束,如下:
In [1]: def test(): #定義一個test函數 ...: a = 11 #變數a ...: b = 22 #變數b ...: return a ...: return b ...: In [2]: a = test() #調用test函數,並把它的結果賦值給a In [3]: a Out[3]: 11 In [4]: b = test() #調用test函數,並把他的結果賦值給b In [5]: b Out[5]: 11
那麼為什麼a和b的值是一樣的呢?我們來看一下流程:
1.定義了一個test函數
2.在test函數中定義了兩個變數a和b,並分別複製a = 11,b = 22
3.使用return返回a的值和b的值
4.調用test函數,並把它賦值給了a
5.然後開始進入函數,a = 11,b = 22,然後return a,結果賦值給了a,此時的a等於11,程式結束
6.到了b = test(),進入函數,a = 11,b = 22,然後return a,結果被賦值給了b,此時b等於11,所以a和b的結果是一樣的
為什麼呢?因為在函數中,每調用一次函數就從函數從頭開始做,可以寫多個return,但是當進入函數時,一看見return程式就會結束,所以a和b的結果是一樣的了
修改程式如下:
In [6]: def test(): ...: a = 11 ...: b = 22 ...: return a,b ...: In [7]: a,b = test() In [8]: print(a) 11 In [9]: print(b) 22
函數的類型
函數可以根據有沒有參數,有沒有返回值,可以相互結合
(1)無參數,無返回值
(2)無參數,有返回值
(3)有參數,無返回值
(4)有參數,有返回值
函數的嵌套使用
指在一個函數被調用的過程里,又調用了一個函數,舉例說明一下:
def test1(): pass def test2(): print("-----2-1-----") print("-----2-2-----") def test3(): print("-----3-1-----") test2() #在函數裡面調用test2函數 print("-----3-2-----") test3() #調用test3函數
程式運行結果如下:
-----3-1-----
-----2-1-----
-----2-2-----
-----3-2----
def print_line(): #定義一個函數,列印40個* print("*"*40) def print_5_lines(): #定義一個函數,列印5行 i = 0 while i<5: print_line() #又簽到調用了print_line函數 i += 1 print_5_lines()
程式運行結果如下:
root@test:~/codes# python3 04-函數的嵌套調用2.py **************************************** **************************************** **************************************** **************************************** ***************************************