四、Python函数式编程——学习笔记

1、高阶函数

1、map/reduce函数

map(函数,Iterable):把传入的函数依次作用在序列的每个元素上,并将结果作为一个新的Iterable返回。

例子:用户输入的英文名字,首字母大写,其他小写

# -*- coding: utf-8 -*-
def normalize(name):
    return name[0].upper()+name[1:].lower()
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)

reduce(函数,序列):函数必须接受两个参数reduce把结果继续和序列的下一个元素做累积计算

例子:编写一个prod()函数,可以接受一个list并利用reduce()求积

# -*- coding: utf-8 -*-
from functools import reduce
def prod(L):
    return reduce(lambda x,y:x*y,L)

2、filter函数

filter(函数,序列):用于过滤序列,返回的结果是序列中满足函数的元素。

注意:filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

3、sorted函数

排序函数

对数字:sorted(list):对list中的数字升序排

自定义的排序:sorted(list,key=函数)key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序

注意!!:key指定的函数不是作用于list,而是list里的每个元素

降序排序:sorted(list,key=函数,reverse=Ture)

2、返回函数

函数作为返回值,调用时,并不是立马执行。

如:

def  函数名():

     def 函数名1():

          ...

          return value

    return 函数名1

调用时,f=函数名(),此时,相当于f为 函数名2的函数,需要再调用一下 f()

注意:每次调用都是一个新的函数,即使传入相同的参数,也不同。

闭包:相关参数和变量都保存在返回函数中的程序结构

返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量因为并不是立刻执行,等到函数都返回时,其引用的变量变为最后一个值。

注意全局变量局部变量

在闭包中,引用外部变量,报错:UnboundLocaError

解决办法:1、为变量申明全局变量  global   

                   2、python中关键字:nonlocal(指向之前在最近的包含作用域中绑定的除全局变量以外的变量

                   3、将变量改为一个可变的列表。

3、匿名函数

lambda 参数1,参数2 :表达式

限制:只能有一个表达式

好处:1、没有名字,不担心函数名冲突

           2、可以将匿名函数赋值给一个变量,再利用变量来调用该函数

           3、作为返回值返回

4、装饰器

定义:在代码运行期间动态增加功能的方式

decorator本质上就是一个返回函数的高阶函数。例:定义一个能打印日志的decorator

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

将decorator置于函数的定义处

@log
def now():
    print('2015-3-25')

调用now()函数:

>>> now()
           call now():
           2015-3-25

5、偏函数

当函数的参数个数太多,需要简化时,使用functools.partial可以传建一个新函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

例:固定了int()函数的关键字参数base。使默认按二进制转换。

int2 = functools.partial(int, base=2)

创建偏函数时,实际可以接受:函数对象、*args和**kw三个参数。

当传入*args时,如:  会把10作为*args的一部分自动加到左边

max2 = functools.partial(max, 10)

 

 

 

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值