函数式编程与高阶函数

高阶函数

        把函数作为参数传入,这样的函数称为高阶函数

常用的高阶函数

map

  • map()函数接收两个参数,一个是函数,一个是Iterable(可多个),

  • map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回

  • map()传入的第一个参数是f,即函数对象本身。

  • 由于结果r是一个Iterator,Iterator是惰性序列。

  • 可通过list()函数让它把整个序列都计算出来并返回一个list

lst = [1,2,3,4,5]
lst2 = [3,6,7]
def func(item):
    return item *item
result = map(func,lst)
result1 = map(lambda x:x**2,lst) #一个表达式用匿名函数比较方便
print(list(result),list(result1)) #result是一个可迭代对象,直接转换list可以输出里面所有的值,当然也可以用next只输出一个值
print(list(map(lambda x,y:x+y,lst,lst2))) #木桶效应,以最短的为基准,所以后面的4,5不会输出

filter

        用Python-filter代码实现:在一个list中,删掉偶数,只保留奇数

  • Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列

  • filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该 元素。

  • 注意到filter()函数返回的是一个Iterator,也就是一个惰性序列

result = filter(lambda x:x %2,range(10))
print(list(result))

sorted

要相同类型才可以

lst = [-6,3,2,-9,7]
print(sorted(lst,key = abs)) #根据绝对值排序,根据key所指定的函数的返回值
lst2 = [True,len(lst)>2,0,2]  
>>>>:[0, True, True, 2]
#列表里包元组的形式排序
lst = [(True,True,False),
       (2,1,3),
       (2,2,4),
       (False,True,2),
       (False,False,3)]
print(sorted(lst))
>>>:[(False, False, 3), (False, True, 2), (True, True, False), (2, 1, 3), (2, 2, 4)]
#列表中的值忽略大小写排序
lst1 = ['bob','about','Zoo','Credit']
print(sorted(lst1,key=str.upper))
#value值排序
d1 = {"a":3,"b":2,"c":4,"d":1}
print(sorted(d1,key = lambda x:d1[x]))

reduce

用Python-reduce代码实现:将列表[1,3,5,7,9],变成整数13579

  • reduce把一个函数作用在一个序列[x1, x2, x3, ...]上

  • 这个函数必须接收两个参数

  • reduce把结果继续和序列的下一个元素做累积计算

  • reduce(f, [x1, x2, x3, x4]) => f(f(f(x1, x2), x3), x4

from functools import  reduce
a = [1,2,3,4]
def func1(x,y):
    return x*10 +y
print(reduce(func1,a))
#使用reduce,取出lst里得数字
from functools import reduce
def fn(x,y):
    if y.isdigit():
        return x+y
    else:
        return x
lst = ['a','1','2bb','234','','9']
print(reduce(fn,lst)[1:])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值