python之高阶函数和匿名函数
2024-10-18 22:25:16
map()
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def func(x):
return x*x r = map(func, [, , , , ])
print(type(r))
r = list(r)
print(r)
输出结果:
<class 'map'>
[, , , , ]
可以看出,map让函数func作用于列表的每一项,使列表的每一项都被函数func执行一次,即列表的每一项都进行平方。其返回值是map类型。
reduce()
reduce函数必须接收两个参数,把一个函数作用在一个序列[x1, x2, x3, ...]上,然后再把结果继续和序列的下一个元素做累积计算。
from functools import reduce def fn(x, y):
return x * + y f = reduce(fn, [, , , , ]) # 把序列变为整数
print(f)
print(type(f))
输出结果:
<class 'int'>
和map不同,虽然reduce也是作用于每个元素,但是reduce的作用结果要用在下次和另一个元素做累积计算。
map()和reduce()的结合使用
from functools import reduce def fn(x, y):
return x * + y def char2num(s):
digits = {'': , '': , '': , '': , '': , '': , '': , '': , '': , '': }
return digits[s] f = reduce(fn, map(char2num, ''))
print(f)
输出结果:
可以将字符串类型转换为int类型
filter()
filter()函数用于过滤序列,接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
def not_empty(s):
return s and s.strip() # 不能直接写s.strip() f = filter(not_empty, ['A', '', 'B', None, 'C', ' '])
print(type(f))
print(list(f))
输出结果:
<class 'filter'>
['A', 'B', 'C']
sorted()
sorted()函数也是一个高阶函数,在列表的学习中初步接触了sorted(),但其实它还可以接收一个key函数来实现自定义的排序。
key指定的函数将作用于被排序对象的每一个元素上,并根据key函数返回的结果进行排序。
l = sorted([, , -, , -], key=abs) # 按绝对值大小排序
print(l) s = sorted(['bob', 'about', 'Zoo', 'Credit']) # 按ASCII大小排序
print(s) sl = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) # 忽略大小写排序
print(sl) sr = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) # 反向排序
print(sr)
输出结果:
[, , -, -, ]
['Credit', 'Zoo', 'about', 'bob']
['about', 'bob', 'Credit', 'Zoo']
['Zoo', 'Credit', 'bob', 'about']
同样的,sorted()也可以对元组和字典进行排序
from operator import itemgetter # 需要使用operator模块
L = [('Bob', ), ('Adam', ), ('Bart', ), ('Lisa', )]
print(sorted(L, key=itemgetter()))
输出结果:
[('Adam', ), ('Bart', ), ('Bob', ), ('Lisa', )]
当然,也能以values的值来排序,对字典的排序与元组类似,但返回值不同。
from operator import itemgetter dic = {"Bob": , "Adam": , "Lisa": } print(sorted(dic,key=itemgetter())) print(sorted(dic, key=itemgetter()))
输出结果:
['Adam', 'Bob', 'Lisa']
['Adam', 'Lisa', 'Bob']
可以看到,不管是以key值进行排序,还是以value值进行排序,排序结果只返回对应顺序的key值。
匿名函数
f = list(map(lambda x: x * x, [, , , , , , , , ]))
print(f)
输出结果:
[, , , , , , , , ]
上面就是一个匿名函数的使用,匿名函数 lambda x: x * x 实际上就是:
def f(x):
return x * x
只是在这里没有显式地定义函数,这样因为函数没有名字,不必担心函数名冲突,而且代码看起来也简洁。
最新文章
- 设计模式之结构类模式大PK
- (转)Java中的static关键字解析
- strcpy strlen memcpy等的函数实现
- angular state和stateParams
- Yii2.0 执行流程分析
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
- quartz定时任务中常用的cron表达式
- Delphi NativeXML 乱码的问题
- 关于Fragment与Activity的想法
- [转]C++实现系统服务暂停、停止、启动
- 条款21: 必须返回对象时,不要强行返回对象的reference
- 翻译:MariaDB DATABASE()
- 比较日期大小以及获取select选中的option的value
- 使用Xpath定位元素(和元素定位相关的Xpath语法)
- react VS vue 我们究竟该如何选择(从项目的角度帮你分析)
- python 词云小demo
- git 退回到前面某一版本的具体操作方式
- Kubernetes之总体了解
- 「GXOI / GZOI2019」旧词
- [原创]升级Gerrit的commit-msg,检查git commit时必须填写开发任务编号TaskID