专栏首页python3python之高阶函数和匿名函数

python之高阶函数和匿名函数

map()

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

1 def func(x):
2     return x*x
3 
4 r = map(func, [1, 2, 3, 4, 5])
5 print(type(r))
6 r = list(r)
7 print(r)

输出结果:

<class 'map'>
[1, 4, 9, 16, 25]

可以看出,map让函数func作用于列表的每一项,使列表的每一项都被函数func执行一次,即列表的每一项都进行平方。其返回值是map类型。

reduce()

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

1 from functools import reduce
2 
3 def fn(x, y):
4     return x * 10 + y
5 
6 f = reduce(fn, [1, 3, 5, 7, 9])   # 把序列变为整数
7 print(f)
8 print(type(f))

输出结果:

13579
<class 'int'>

和map不同,虽然reduce也是作用于每个元素,但是reduce的作用结果要用在下次和另一个元素做累积计算。

map()和reduce()的结合使用

 1 from functools import reduce
 2 
 3 def fn(x, y):
 4     return x * 10 + y
 5 
 6 def char2num(s):
 7     digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
 8     return digits[s]
 9 
10 f = reduce(fn, map(char2num, '13579'))
11 print(f)

输出结果:

13579

可以将字符串类型转换为int类型

filter()

filter()函数用于过滤序列,接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

1 def not_empty(s):
2     return s and s.strip()  # 不能直接写s.strip()
3 
4 f = filter(not_empty, ['A', '', 'B', None, 'C', '  '])
5 print(type(f))
6 print(list(f))

输出结果:

<class 'filter'>
['A', 'B', 'C']

sorted()

sorted()函数也是一个高阶函数,在列表的学习中初步接触了sorted(),但其实它还可以接收一个key函数来实现自定义的排序。

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

 1 l = sorted([36, 5, -12, 9, -21], key=abs)   # 按绝对值大小排序
 2 print(l)
 3 
 4 s = sorted(['bob', 'about', 'Zoo', 'Credit'])       # 按ASCII大小排序
 5 print(s)
 6 
 7 sl = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)   # 忽略大小写排序
 8 print(sl)
 9 
10 sr = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)     # 反向排序
11 print(sr)

输出结果:

[5, 9, -12, -21, 36]
['Credit', 'Zoo', 'about', 'bob']
['about', 'bob', 'Credit', 'Zoo']
['Zoo', 'Credit', 'bob', 'about']

同样的,sorted()也可以对元组和字典进行排序

1 from operator import itemgetter    # 需要使用operator模块
2 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
3 print(sorted(L, key=itemgetter(0)))

输出结果:

[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]

当然,也能以values的值来排序,对字典的排序与元组类似,但返回值不同。

1 from operator import itemgetter
2 
3 dic = {"Bob": 75, "Adam": 92, "Lisa": 88}
4 
5 print(sorted(dic,key=itemgetter(0)))
6 
7 print(sorted(dic, key=itemgetter(1)))

输出结果:

['Adam', 'Bob', 'Lisa']
['Adam', 'Lisa', 'Bob']

可以看到,不管是以key值进行排序,还是以value值进行排序,排序结果只返回对应顺序的key值。

匿名函数

1 f = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
2 print(f)

输出结果:

[1, 4, 9, 16, 25, 36, 49, 64, 81]

上面就是一个匿名函数的使用,匿名函数 lambda x: x * x 实际上就是:

1 def f(x):
2     return x * x

只是在这里没有显式地定义函数,这样因为函数没有名字,不必担心函数名冲突,而且代码看起来也简洁。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 的 map、列表推导、循环

    发现map最快,map返回的是迭代器,如果变成list则花的时间与循环差不多,其次是列表推导,最后是循环来写。

    py3study
  • Python+Xml +操作+增删改查

    由于小编的系统需要进程间通信,想通过对Xml文件操作,来进行信息交互,于是写了一组相关的类。 xml文件:

    py3study
  • 第二天学习_基础数据类型整理

        字符串[start:end] 从start到end拿到数据, end取不到

    py3study
  • Coinbase大变!它要与‘’垃圾代币‘’同流合污了?

    受美国证券交易委员会(SEC)的监管影响,Coinbase 是加密数字货币领域最保守的交易所之一,这家市值80亿美元的公司仅仅向用户提供了不超过10种的数字加密...

    区块链大本营
  • Redis类型之sets类型

    5、sdiffstore 返回所有给定key 与第一个key 的差集,并将结果存为另一个key

    人生不设限为梦想时刻准备着
  • 赢在附近五公里---揭秘花店小程序火热之因

    O2O形式对于线下实体花店的发展很有帮助,用户通过小程序订购产品的习惯正在慢慢养成。小程序自身的便捷可以为线上的花店带来新的商机。为助力商家线上线下融合,帮助线...

    微盛企微管家
  • TypeScript: 常用的高级类型

    今天这篇文章分享的内容挺简单,却应该引起重视,在实践场景中各种交叉使用又会让内容变得复杂。因此掌握基础不难,在实践中的思考与总结则是我们更应该随时要做的事情。

    用户6901603
  • RPA解决企业信息系统运行性能问题详解

    企业信息系统出现系统加载缓慢、响应时间过长等性能问题,往往经由最终用户发现并反馈。从用户发现问题、反馈问题到问题得到解决,这一过程可能会耗费较长的时间,而这会大...

    蕉黄
  • Redis实现用户登录错误次数限制

    系统登录的时候经常会有这种场景,如果密码连续N次输入错误,则要等N分钟之后才能重试。实现的方式有多种,比如在内存中维护一个数据结构来存储这些信息,但实现起来比较...

    会跳舞的机器人
  • Day12-字符串-重复的DNA序列

    Q:将DNA序列看作是只包含【'A', 'C', 'G', 'T'】4个字符的字符串。现有一个这样的字符串,找到所有长度为10且出现次数超过1的子串。

    BUPTrenyi

扫码关注云+社区

领取腾讯云代金券