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 相关文章推荐
python设置windows桌面壁纸的实现代码
Jan 28 Python
跟老齐学Python之模块的加载
Oct 24 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
Python探索之Metaclass初步了解
Oct 28 Python
python实现人人自动回复、抢沙发功能
Jun 08 Python
python递归全排列实现方法
Aug 18 Python
Python中Numpy ndarray的使用详解
May 24 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
解决django FileFIELD的编码问题
Mar 30 Python
python异常处理之try finally不报错的原因
May 18 Python
如何利用python生成MD5并去重
Dec 07 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 获取SWF动画截图示例代码
2014/02/10 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
Node.js编码规范
2014/07/14 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
2018/06/27 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
python paramiko模块学习分享
2017/08/23 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
旅游项目开发策划书
2014/01/18 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
财务情况说明书范文
2014/05/06 职场文书
说明书范文
2014/05/07 职场文书
党员目标管理责任书
2014/07/25 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书