打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python中的函数(一)
怎么用python求反函数?
35岁重新学编程---Python 第二天
100 Python编程题给你练(附答案)
Python 初学者必备的常用内置函数
Python 程序员的进化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服