1. 程式人生 > >2.6 功能的封裝——函式,末尾有彩蛋

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]      # 想一想為什麼沒有變呢?