2.6 功能的封裝——函式,末尾有彩蛋
函式:數學中的x,y函式???python中就是功能的封裝。方便使用這個工具,就像python的包一樣,你會用這個包,你不用瞭解他的執行結構,除非你要二開。其實包就是一系列函式的整合。一句話:函式就是你封裝的功能,在每次用這個函式的時候叫他名字就行了。
#定義函式 def 函式名(形參): 功能程式碼塊 #使用函式 函式名(傳入實參) #介紹兩個概念:在定義函式中的引數叫做形式引數,簡稱形參,就是挖坑用的。 #實際使用的引數叫做實參,填坑用的。也就是真正的資料才會叫做實參 。稍後詳細介紹。 #例子如下: #下面的就是求ab連個數字的和的函式。a,b現在都是形參。 def sum_a_b(a,b): print(a+b) #函式呼叫:下面的就是1,2就是實參。實參和形參還有分類稍後介紹。 sum_a_b(1,2)
如果想要了解某個函式的功能:用help(函式名) 就行。
2,帶有返回值的函式。假設剛剛的兩個數字相加的函式,他的運算結果,你不想要輸出打印出來。想要儲存起來。只需要把print(a+b) 換成 return a+b 就行。不過在用這個函式的時候需要把結果接收下。既然想要儲存,肯定要接受起來.
c =sum_a_b(1,2)
3,函式引數型別細講:
a,無引數,無返回值的。就是那種直接列印結果的。
b,無引數,有返回值的。不呼叫引數,但是會返回一些資料。
c,有引數,無返回值的。剛剛上面的第一個例子。
d,有引數,有返回值的。剛剛上面修改過的例子2.
補充【超重要】:e,預設引數【預設值引數】:就是這個形參定義了,但是這個形參預設已經有了值。如果在呼叫引數的時候,不給這個帶有預設值的形參傳入值。則會使用預設值。如果傳值了,則會優先使用傳入的值。
注意:帶有預設值的引數一定要位於引數列表的最後面。
def printinfo( name, age = 35 ): # 列印任何傳入的字串 print "Name: ", name print "Age ", age # 呼叫printinfo函式 printinfo(name="miki" ) printinfo( age=9,name="miki" )
f:不定長引數:在不確定有幾個引數時定義一個函式可以用這個。(*)會存放所有的未命名引數,型別會變成元組型別。(**)會存放所有的字典型別引數key1=value1的這種。千萬記住【重點】不是因為後面的 args 字元確定型別的。而是因為 * 的個數。
【附圖一張:結果和下面的圖片執行結果一樣】
【以前不定長引數還是一臉懵逼,現在回頭仔細品味下,領悟不少。多做筆記多實踐才是技巧,不要眼高手低。送給我自己。】:直接上剛剛練習的截圖 。說一個格式化函式。format 。簡單的使用方法就是前面挖坑,後面把資料填上就行,類似於%s 。但是這個可以格式化元組等。
4,函式的巢狀使用。
所謂巢狀呢,就是函式裡面有函式。
結果:
---- testA start----
---- testB start----
這裡是testB函式執行的程式碼...(省略)...
---- testB end----
---- testA end----
5,區域性變數和全域性變數。
簡單來說:函式裡面定義的變數叫做區域性變數。外界不能直接訪問 。
全域性變數:就是不在函式裡面定義的,在任何位置都能訪問的變數。
- 如果在函式中修改全域性變數,那麼就需要使用
global
進行宣告,否則出錯 - 如果全域性變數的名字和區域性變數的名字相同,那麼使用的是區域性變數的,小技巧
強龍不壓地頭蛇。或者說函式就是懶,不會捨近求遠。先找最近的。
6,可變型別的全域性變數:
回想一下上一節講過的可變引用和不可變引用的資料型別。
對於不可變型別【數值,元組型別】的全域性變數,它指向的資料不能修改。所以在函式中不使用global 時無法修改全域性變數、
而對於可變型別【字典,和列表】的全域性變數。不用使用global也能修改全域性變數。這樣的性質是不是說明可變型別的變數沒有全域性和區域性之分呢?【錯了,定義在函式內部的區域性變數可變型別的,外界就不能修改(特殊方法除外)】。
7,引用傳參。
考慮一下為啥打印出來的函式裡的a是2,而直接輸出的a還是1呢??
- 可變型別與不可變型別的變數分別作為函式引數時,會有什麼不同嗎?
def selfadd(a): a+=a print("函式中的a的值{}".format(a)) a= 1 selfadd(a) print(a) #列表可變型別 b=[1,2] selfadd(b) print(b)
Python中函式引數是引用傳遞(注意不是值傳遞)。對於不可變型別,因變數不能修改,所以運算不會影響到變數自身;而對於可變型別來說,函式體中的運算有可能會更改傳入的引數變數。小提示可以用:id() 檢視地址哦。答案下一篇部落格揭曉。
>>> def selfAdd(a):
... """自增"""
... a = a + a # 我們更改了函式體的這句話
...
>>> a_int = 1
>>> a_int
1
>>> selfAdd(a_int)
>>> a_int
1
>>> a_list = [1, 2]
>>> a_list
[1, 2]
>>> selfAdd(a_list)
>>> a_list
[1, 2] # 想一想為什麼沒有變呢?