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