小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python閉包有什么作用,解決了什么問題?

 昵稱11935121 2018-04-05

python支持過程式,函數式和面向對象的的編程


Python是一種優(yōu)秀的編程語言,可以支持過程式,函數式和面向對象的的編程并開發(fā)幾乎任何東西。 在編寫代碼和使用某些基礎架構時,你需要擴展重用而不去動原始代碼。 在面向對象編程中,靠繼承來實現,但如果用過程式編程則,需要函數裝飾器。

函數即對象

在python中,函數就是對象,你可以實時創(chuàng)建函數,將函數發(fā)送到另一個函數并從另一個函數返回函數。 使用lambda表達式容易實現這個功能。

例如,使用lambda表達式創(chuàng)建一個函數并將其發(fā)送給另一個函數:

from __future__ import print_function

def cc(fn):

print('**************')

fn()

print('*************')

f1 = lambda : print('Hello ChongChong!');

cc( f1 )

注意第一句“from __future__ import print_function” 為了兼容2.x的語法,讓其支持print當成函數來使用。

輸出為:

*************

Hello ChongChong!

*************

內部函數

是用內部函數可以讓你更好的理解函數即對象。我們可以聲明一個內部函數并動態(tài)返回一個函數。

例如,比我們計算一個斐波那契數列,計算1到20的數列值,函數可以用迭代地或遞歸來做,并且我們希望在運行時選擇該方法。 我們也可以使用一個內部函數,不對外訪問(在這個例子中是checkn)

def fibf(i):

def checkn( n ):

return n == 0 or n == 1

def addfib( n ):

if checkn( n ):

return n

a, b = 0, 1

for item in range(0, n-1):

b = a + b

a = b - a

return b

def morefib( n ):

if checkn( n ):

return n

return morefib( n-1 ) + morefib( n-2 )

if i == 0:

return addfib

return morefib

fib = fibf( 1 )

for i in range(1,20):

print( fib(i) )

在這個例子中,我們可以使用帶參數的fibf來實現我們需要的功能。

結果:

1

1

2

3

5

8

13

21

34

55

89

144

233

377

610

987

1597

2584

4181

閉包(Closure)

我們可以動態(tài)地返回一個內部函數,并且將并根據我們在外部函數中得到的參數賦值給他。 舉個簡單加法器的例子:

def add( i ):

def fun( j ):

return i + j

return fun

f1=add(10)

f2=add(5)

print ( f1(2) )

print ( f2(2) )

兩次調用中,可以根據不同函數,就賦給內部函數不同的基準值j,就好像兩個函數一樣,而且每次調用都能保存這個基準值,互不干涉,就像是把函數執(zhí)行和數據打成一個包一樣,所以,把這種機制叫做閉包。

閉包的作用

閉包在支持函數式語言中廣泛使用比如perl,js,java等都有使用。

閉包的一個作用就是實現編程模式里面的工廠模式,非常有用。

我們再組個例子,這個例子來源于網絡。如果我們有一組點(x,y),我們用想要插值法生成一個曲線,并畫出圖來,用來預測y值:

from scipy.interpolate import interp1d

from pylab import plot, axis, legend, scatter

import numpy as np

x = np.array( [10,13,16,22,28,30,32,35,39,44] )

y = np.array( [90,120,170,210,290,300,330,370,390,410] )

scatter(x, y)

則,可以使用interp1d函數來生成函數:

interfn = interp1d(x, y, kind = 3)

yy = interfn(25)

print(yy)

答案為:

253.42

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多