Python是一种优秀的编程语言,可以支持过程式,函数式和面向对象的的编程并开发几乎任何东西。 在编写代码和使用某些基础架构时,你需要扩展重用而不去动原始代码。 在面向对象编程中,靠继承来实现,但如果用过程式编程则,需要函数装饰器。
在python中,函数就是对象,你可以实时创建函数,将函数发送到另一个函数并从另一个函数返回函数。 使用lambda表达式容易实现这个功能。
例如,使用lambda表达式创建一个函数并将其发送给另一个函数:
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!
*************
内部函数
是用内部函数可以让你更好的理解函数即对象。我们可以声明一个内部函数并动态返回一个函数。
例如,比我们计算一个斐波那契数列,计算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
我们可以动态地返回一个内部函数,并且将并根据我们在外部函数中得到的参数赋值给他。 举个简单加法器的例子:
def add( i ):
def fun( j ):
return i + j
return fun
f1=add(10)
f2=add(5)
print ( f1(2) )
print ( f2(2) )
两次调用中,可以根据不同函数,就赋给内部函数不同的基准值j,就好像两个函数一样,而且每次调用都能保存这个基准值,互不干涉,就像是把函数执行和数据打成一个包一样,所以,把这种机制叫做闭包。
闭包在支持函数式语言中广泛使用比如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
联系客服