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 |
|
來自: 昵稱11935121 > 《未命名》