python高阶函数(map/reduce和filter、sorted)

学习目标:

Python学习八、

  • 高阶函数:把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计

学习内容:

1、map/reduce
2、filter
3、sorted


1、map/reduce

Python内建了map()和reduce()函数

1、map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回

def f(x):
    return x*x
t = map(f, [1, 2, 3, 4])
print(list(t))
输出:
[1, 4, 9, 16]
  • map()作为高阶函数,事实上它把运算规则抽象了,可以用来计算任意复杂的函数
print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
输出:
['1', '2', '3', '4', '5', '6', '7', '8', '9']

2、reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

from functools import reduce
def add(x, y):
    return x + y
print(reduce(add, [1, 3, 5, 7, 9]))
输出:
25
  • 把序列[1, 2, 3, 5, 6, 8, 9]变换成整数1235689
  • Python没有提供int()函数,你完全可以自己写一个把字符串转化为整数的函数
from functools import reduce
def zheng(x, y):
    return x*10+y
print(reduce(zheng, [1, 2, 3, 5, 6, 8, 9]))
输出:
1235689
  • 配合map()函数,把str转换为int的函数
from functools import reduce
def zheng(x, y):
    return x*10+y
def ints(s):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits[s]
print(reduce(zheng, map(ints, '1235456')))
输出:
1235456
  • 进一步改进
from functools import reduce
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def doo(s):
    def zheng(x, y):
        return x*10+y
    def ints(s):
        return digits[s]
    return reduce(zheng, map(ints, s))
print(doo('56156566'))
输出:
56156566
  • 用lambda函数进行简化
def doo(s):
    return digits[s]
def ins(s):
    return (reduce(lambda x, y:x*10+y,map(doo, s)))
print(ins('12318656'))
输出:
12318656

2、filter

Python内建的filter()函数用于过滤序列

  • filter()接收一个函数和一个序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
  • 保留一个列表的奇数,丢弃偶数
def que(n):
    return n%2==1
print(list(filter(que, [1, 2, 5, 8, 15, 21, 22, 25, 65, 48, 245, 64, 86])))
输出:
[1, 5, 15, 21, 25, 65, 245]

把一个序列中的空字符串删掉

def empty(s):
    return s and s.strip()
print(list(filter(empty, ['1', '2','5',' ', None, '21', '22', ' ', '25', '65'])))
输出:
['1', '2', '5', '21', '22', '25', '65']

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


3、sorted–排序算法

sorted()函数也是一个高阶函数,排序的核心是比较两个元素的大小

  • Python内置的sorted()函数就可以对list进行排序,sorted()函数是一个高阶函数,它可以接收一个key函数来实现自定义的排序

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

print(sorted([36, 5, -12, 9, -21], key=abs))
输出:
[5, 9, -12, -21, 36]
  • 默认情况下,对字符串排序,是按照ASCII的大小比较的,ASCII小的会排在前面
print(sorted(['bob', 'about', 'Zoo', 'Credit']))
输出:
['Credit', 'Zoo', 'about', 'bob']
  • 当对字符串进行排序时,忽略其大小写可以利用key使其都变形成大写或者都小写
  • key=str.lower小写
  • key=str.upper大写
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower))
输出:
['about', 'bob', 'Credit', 'Zoo']

需要对字符串进行倒序排列时采用参数reverse=True

reverse=True

print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower,reverse=True ))
输出:
['Zoo', 'Credit', 'bob', 'about']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值