分享

Python闭包有什么作用,解决了什么问题?

 昵称11935121 2018-04-05

python支持过程式,函数式和面向对象的的编程


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

闭包(Closure)

我们可以动态地返回一个内部函数,并且将并根据我们在外部函数中得到的参数赋值给他。 举个简单加法器的例子:

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多