Python基礎學習(四)

來源:互聯網
上載者:User

標籤:style   裝飾器   說明   功能   驗證   需要   變化   lis   highlight   

菜鳥咀嚼python基礎之繼續。

一、返回函數

第三章已經簡單操作了Python的高階函數,目前繼續練手函數作為傳回值的特效;通常,高階函數除了可以接收函數作為參數外,還可以把函數作為結果值返回。

案例:通常我們寫一個求和的函數會這樣寫 

#通常我們寫一個求和的函數會這樣寫def get_sum(*param):    count = 0;    for item in param:        count = count + item    return countprint( get_sum(1,2,3,4) )

  輸出: 10

#但是,如果不去求和,而是在後面的代碼根據需要在計算可以嗎,可以的。它可以不用返回求和結果,而是返回求和函數。def last_sum(*param):    def sum():        num = 0        for n in param:            num = num + n        return num    return sumfun = last_sum(1,2,3,4)print( fun )print( fun() )

  輸出結果:

<function last_sum.<locals>.sum at 0x7f4a2d3b58c8>10

  說明:由此可見單純的輸出返回的函數是沒有結果的,只有調用返回的函數,才能將求和列印出來

  另外,如果多次調用 last_sum 函數,每次返回的都是一個新的函數,即使傳入相同的參數;

  例如:

fun1 = last_sum(1,2,3,4)fun2 = last_sum(1,2,3,4)print( fun1 == fun2 )

  返回:False

  說明:fun1() 和 fun2() 的調用互不影響

  閉包  

def count():    fs = []    for i in range(1,4):        def f():            return  i * i        fs.append( f )    return fsf1, f2, f3 = count()print( f1() )print( f2() )print( f3() )

  輸出:9,9,9

  說明:這是因為當一個函數返回了一個函數後,i 這個內部局部變數還被新的函數引用,等到三個函數都返回時,函數 i 已經比變成3了,所以執行的 函數輸出 9, 9, 9

  注意:返回函數不要引用任何迴圈變數,或者後續會發生變化的變數

  可以這樣寫:

def count2():    def f(i):        def g():            return i * i        return g    fs = []    for i in range(1,4):        fs.append( f(i) )    return  fsf11, f22, f33 = count2()print( f11() )print( f22() )print( f33() )

  返回結果:1,4,9

  說明:方法是再建立一個函數,用該函數的參數綁定迴圈變數當前的值,無論該迴圈變數後續如何更改,已綁定到函數參數的值不變

  也就是說當我們必須要調用迴圈變數的時候,需要多加一個局部函數,在每次執行 迴圈變數 i 的時候 去調用那個新的函數並將 i 作為它的一個參數 達到立刻被執行,則 i 無論後期怎麼變都不會受到影響。

 二、匿名函數

  匿名函數就是沒有名字的函數,有些時候為了簡潔方便可以不去定義函數,而是直接使用匿名函數,案例:

#匿名函數mylist = list( map(lambda y:y*y, [1,2,3,4]) )print( mylist )

  輸出:[1, 4, 9, 16]

  說明:匿名函數 lambda y:y*y  其實就是匿名函數,用 lambda 去表示一個匿名函數,第一個 y 代表匿名函數的參數,冒號後面是匿名體,可以表示函數處理的功能。

       匿名函數就是一個運算式,不用寫returen 傳回值就是運算式結果,同時,匿名函數還可以是一個變數,例如:

#匿名函數-變數mytest = lambda y:y*ymylist = list( map( mytest , [1,2,3,4]) )print( mylist )

  輸出:[1, 4, 9, 16]       效果同上;

三、裝飾器

其實函數就是一個對象。而且函數對象可以被賦值給變數,所以,通過變數也就相當於調用了那個函數。

  例如:

def myFun(a):    return a*atest = myFunprint( test(5) )

  輸出:25

  其實函數有一個__name__的屬性,可以驗證出他真正的函數是誰。例如:

print( test.__name__ )

  輸出:myFun

 

  

 

Python基礎學習(四)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.