python 函数式编程

函数式编程是可以对同一个输入返回相同输出的函数,内部代码不包含对输出结果有影响的状态。

函数变量

有很多拥有函数编程的语言有可以将函数作为变量,然后传入函数使用。
python 中如果使用一个函数变量?

def add(x,y):
    return x +y

v1 = add

print v1(999,1)#1000

代码v1 = add 可以说是多余的,因为add 函数其实就是个变量。

高阶函数

高阶函数可以把函数变量当作形参,传入函数里面,然后进行操作

def add(x,y):
    return x +y

def printadd(add):
    print add

printadd(add(999,1))#1000

闭包

python 函数里面可以定义一个函数,而且还可以还函数,这个函数也可以使用外部函数的变量,这种情况叫做闭包。

def make_adder(addend):
    def adder(augend):
        return augend + addend
    return adder

p = make_adder(23)
q = make_adder(44)

print p(100)#123
print q(100)#124

这两个函数因为闭包配置参数的不同,所以对输出的结果不同。

匿名函数

在python 中,匿名函数是一个lambda 表达式,这个表达式可以传入参数,并且有返回值。

import math

f = lambda x:math.sqrt(x) % 1 == 0

print f(9) #True

代码lambda x:math.sqrt(x) % 1 == 0就是一个函数,只是没有函数名,所以称作为匿名函数,这个函数支持一个参数传入,然后计算这个数的平方根是否是整数。

装饰器(decorator)

装饰器是一个函数,但是使用的时候不和平常的函数那样使用。装饰器是使用到方法上。

简单的装饰器

def log(f):
    print 'call function %s'  % (f.__name__)
    return f

@log
def hello():
    print 'hello '

hello()

#call function hello
#hello 

当调用hello 的时候,其实调用的log 函数,而编译器则会把这个函数当作参数出入log 函数。
log 函数会把使用的函数返回

带参数的装饰器和带参数的函数

def log(level):
    def ff(f):
        def fff(*args,**fm):
            print 'debug function: %s \t param : %s' % (f.__name__,args)
            return f(*args,**fm)
        return fff
    return ff


@log('debug')
def hello(str):
    print 'hello,' + str


hello('tom')
#debug function: hello   param : ('tom',)
#hello,tom

装饰器的问题

def log(level):
    def ff(f):
        def fff(*args,**fm):
            print 'debug function: %s \t param : %s' % (f.__name__,args)
            return f(*args,**fm)
        return fff
    return ff


@log('debug')
def hello(str):
    print 'hello,' + str


print hello.__name__

#fff

当打印hello 函数的名称时,打印结果却是fff,这是怎么回事?
原因是hello 函数的装饰器使用了闭包。所以更改了hello 函数name 的属性。

如何解决这个问题?

import functools
def log(level):
    def ff(f):
        @functools.araps(f)
        def fff(*args,**fm):
            print 'debug function: %s \t param : %s' % (f.__name__,args)
            return f(*args,**fm)
        return fff
    return ff


@log('debug')
def hello(str):
    print 'hello,' + str


print hello.__name__

#hello

当给装饰器里面调用 hello 的函数,加上个@functools.wraps(f) 装饰器,则可以解决。
像简单的装饰器的代码里面就不会出现这种问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值