本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes
本節繼續介紹函數的一些特性,包括返回值,任意個參數傳遞,列表作為函數參數等。
一、函數的返回值
函數的一個很重要的功能是有返回值,函數使用return語句將結果返回給主函數。
1、返回簡單值
我們對上一篇的例子稍加改造,將結果用return語句返回給變量fbook,在主函數中才列印出結果。
def favorite_book(btype,book,page='900'):"""輸出我最喜歡的書"""return ('這是一本'+btype+'類的書'+'書名叫:'+book+'共有'+page+'頁')fbook = favorite_book('哲學','易經')print(fbook)
2、返回字典
我們可以在函數內部構造一個字典,然後作為返回值返回,請看代碼:
def favorite_book(btype,book,page='900'):"""輸出我最喜歡的書""" fbook = {'類別':btype,'書名':book,'頁數':page}return fbookfbook = favorite_book('哲學','易經')print(fbook)for k,v in fbook.items(): print(k,v)
函數可以返回任意類型的數據,大家可以自己嘗試。
二、傳遞列表給函數
使用列表處理數據會很方便和高效,下面我們對第八課中的字符串和數字分離代碼稍加改造,用函數來表示,請看代碼:
def speList(Alist,str_list,num_list):while Alist:if isinstance(Alist[-1], int): # [-1]是指最後一個列表元素num_list.append(Alist.pop()) # 彈出最後一個元素,存入num_list中if isinstance(Alist[-1], str): str_list.append(Alist.pop()) # 彈出最後一個元素,存入str_list中Alist = ['a',2,'dd',15,78,22,'ff','kk']str_list = [] #用來存儲字符串num_list = [] #用來存儲數字speList(Alist,str_list,num_list)print(str_list) #列印字符列表print(num_list) #列印數字列表print(Alist)
除了多一行函數定義和執行函數外,我們並沒有額外寫代碼了。要注意最後一條Print的執行結果,說明函數對列表的操作是永久改變的,Alist執行後變成了空列表,因為裡面的元素在函數中都被移除列表了。
如果不想讓函數修改列表,可以複製一份列表,還記得複製列表用操作符「[:]」嗎?見下面的執行結果,紅色框中是改變的部分:
三、使用任意數量的參數
函數還可以定義成使用任意數量的參數,這樣當預先不知道有多少參數的時候就很有用。比如製作不同麵條需要的配料不同,但是都可以用同一個函數來處理,請看代碼:
def makenoodles(*toppings):'''列印製作麵條的配料'''return toppings;print('您的番茄雞蛋面配料有:',makenoodles('番茄','雞蛋'))print('您的炸醬麵配料有:',makenoodles('肉絲','蔥','香菇','香油'))
*toppings 中的星號讓Python創建一個名為toppings 的空元組,並將收到的所有值都封裝到這個元組中。主意,元組的元素是不可修改的。
我們也可以將位置實參和任意數量參數結合起來用,比如增加一個表示分量的變量,列印麵條的時候能同時說明麵條的分量。
如果將上面例子中的*toppings改成兩個星號開頭,則會傳遞給函數一個字典,這時傳遞給函數的參數形式是以「鍵=值」的形式的,這種形式很直觀,能幫助我們傳遞更多的信息。
def makenoodles(size,**toppings):'''列印製作麵條的配料''' print('這份麵條的分量是'+size+'量')return toppings;cailiao = makenoodles('4',zhuliaos = ['番茄','雞蛋'],peiliaos = ['油','鹽','糖'])print(cailiao,'\n')print('主料有:',end='')for zhuliao in cailiao['zhuliaos']: print(zhuliao+',',end='')print('\n配料有:',end='')for peiliao in cailiao['peiliaos']: print(peiliao+',',end='')
上面代碼比較複製一點,我們是先把字典列印出來,然後再去字典中將主料和配料列印出來,大家仔細體會。
四、函數的模塊化
在這之前,我們都是在同一個文件裡面編寫代碼。
我們可以將函數與主程序分別存儲在不同的文件,主程序使用函數的時候需要導入函數模塊,這樣的好處有幾個:函數模塊可以分享給其他人使用,隱藏細節,更專注於高層邏輯的編寫。
我們在同一個目錄下,新建了一個mknoodles.py的文件,並將函數的定義放在這個文件裡面,hello.py是我們的主程序。
主程序的代碼沒有多大變化,增加了一個import mknoodles,函數調用時增加了一個前綴,變成:mknoodles.makenoodles而已,執行的結果和上例一模一樣。
如果不想在調用函數的時候增加前綴,我們需要指定一下導入的函數名,見下面:
還可以給模塊或者函數指定別名,下面是給函數makenoodles指定了一個別名叫pp,調用的時候就直接使用pp()。大家可以自己試一下給模塊mknoodles指定別名。指定別名是為了避免與主程序中的函數命名相同。
還可以使用from mknoodles import *這種形式導入所有的函數,但一般不推薦這種方法,會導致各種命名衝突。
最後說一個小細節,函數名要清晰易懂,在函數體中要有注釋,說明這個函數是幹什麼的,方便後續維護。因為再過幾個月,可能連你自己都忘了這個函數是幹什麼了。
長按文末點讚送三連,支持本文作者多寫點~