Python3的高阶函数map,reduce,filter的示例详解


Posted in Python onJuly 23, 2019

函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

注意其中:map和filter返回一个惰性序列,可迭代对象,需要转化为list

>>> a = 3.1415
>>> round(a,2)
3.14
>>> a_round = round
>>> a_round(a,2)
3.14
>>> def func_devide(x, y, f):
  return f(x) - f(y)
#传递参数为函数
print(func_devide(9.3, 3.2, round))

1. map函数

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

>>> print(list(map(str, [1, 2, 3])))
['1', '2', '3']
>>> dt = map(str,[-1,2,3,4,5,-34,-45,-23.454])
>>> dt
<map object at 0x10f431dd8>
>>> list(dt)
['-1', '2', '3', '4', '5', '-34', '-45', '-23.454']
>>> dt = map(abs,[-1,2,3,4,5,-34,-45,-23.454])
>>> list(dt)
[1, 2, 3, 4, 5, 34, 45, 23.454]

注意报错:TypeError: 'map' object is not callable

一般出现的原因是迭代对象(str,abs等)或者函数(map)被修改,不再是原来的函数,导致出现不可迭代对象

2. reduce函数

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

def add(x,y):
...   return x + y
... 
>>> reduce(add,[1,2,3,4,5,6,7,8,9,10])
55
>>> def concate(x,y):
...   return str(x)+str(y)
... 
>>> reduce(concate,[1,2,3,4,5,6,7,8,9,0])
'1234567890'

reduce和map函数结合做字符串转整型(或者整型转字符串)

>>> str = '12121212132323'
>>> dic_str_int = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
>>> def str_arr(x):
...   dic_str_int = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
...   return dic_str_int[x]
... 
>>> def int_dum(x,y):
...   return 10*x + y
... 
>>> reduce(int_dum,map(str_arr,str))
12121212132323

示例,转换列表内数据为大写,首字母大写

>>> names = ['jack','john','wilianmon','jobs','bill','gates']
>>> def str_upper(string):
...   return string.upper()
... 
>>> names = map(str_upper,names)
>>> list(names)
['JACK', 'JOHN', 'WILIANMON', 'JOBS', 'BILL', 'GATES']
>>> def str_capitialize(string):
...   return string.capitalize()
... 
>>> names = ['jack','john','wilianmon','jobs','bill','gates']
>>> 
>>> names = map(str_capitialize,names)
>>> list(names)
['Jack', 'John', 'Wilianmon', 'Jobs', 'Bill', 'Gates']

列表内参数求所有元素乘积:

int_li = [2,3,5,10]
>>> reduce(lambda x, y: x*y,int_li)
300
>>> def func_mult(li=None):
...   return reduce(lambda x, y: x*y,li)
... 
>>> func_mult(int_li)
300

上面的可以根据需要转成函数,更方便调用

'123.456'转成整数123.456

方法一:截断之后拼接

def string_int(strs):
  str_li = strs.split('.')
  def str_int(str):
    dic_str_int = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return dic_str_int[str]
  int_1 = reduce(lambda x, y: x*10+y, list( map(str_int,str_li[0])))
  int_2 = reduce(lambda x,y: x*10 + y,list(map(str_int,str_li[1])))
  return int_1 + int_2/(10**(len(str_li)+1))

res = string_int('123.456')
print(res)
#结果:123.456

方法二: 转成纯数字字符串

def string_int1(strs):
  # 记住位置,替换
  point_len = len(strs) - strs.find('.')-1
  str_li = strs.replace('.', '')
  def str_int(str):
    dic_str_int = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return dic_str_int[str]
  int_num = reduce(lambda x,y: x*10 + y,list(map(str_int,str_li)))
  return int_num/(10**(point_len))

res = string_int1('123.456')
print(res)
#结果:123.456

3. filter函数

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

注意:和map函数的区别

函数名 区别
map 作用于每个可迭代对象的元素,并返回处理之后的元素
filter 作用于可迭代内每个元素,根据计算后结果:True保留,Flase去掉

eg: 获取列表内所有的整数类型元素

def only_int(x):
  try:
    if isinstance(x, int):
      return True
    else:
      return False
  except ValueError as e:
    return False
dt = filter(type_int,[1,2,3,3,'3232',-34.5,34.5])
>>> list(dt)
[1, 2, 3, 3]

总结

以上所述是小编给大家介绍的Python3的高阶函数map,reduce,filter的示例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python3实现从指定路径查找文件的方法
May 22 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
浅谈Python的异常处理
Jun 19 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
Python实现的用户登录系统功能示例
Feb 05 Python
Python Flask框架扩展操作示例
May 03 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
Python何绘制带有背景色块的折线图
Apr 23 Python
python实现socket+threading处理多连接的方法
Jul 23 #Python
简单了解Django ContentType内置组件
Jul 23 #Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 #Python
python设计tcp数据包协议类的例子
Jul 23 #Python
Django 缓存配置Redis使用详解
Jul 23 #Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 #Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 #Python
You might like
PHP中的string类型使用说明
2010/07/27 PHP
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
简单实用的全选反选按钮例子
2013/10/18 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
js定时器实例分享
2016/12/20 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
微信小程序返回多级页面的实现方法
2017/10/27 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
使用nodejs实现JSON文件自动转Excel的工具(推荐)
2020/06/24 NodeJs
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python测试人员需要掌握的知识
2018/02/08 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
中专毕业生求职简历的自我评价
2013/10/21 职场文书
大学校园活动策划书
2014/02/04 职场文书
中餐厅经理岗位职责
2014/04/11 职场文书
产品包装策划方案
2014/05/18 职场文书
关于运动会的口号
2014/06/07 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
人口与计划生育责任书
2015/05/09 职场文书
高中班主任寄语
2019/06/21 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python
Golang日志包的使用
2022/04/20 Golang