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生成器的使用方法
Nov 21 Python
Python中的exec、eval使用实例
Sep 23 Python
浅谈Python中的闭包
Jul 08 Python
python3抓取中文网页的方法
Jul 28 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
python下os模块强大的重命名方法renames详解
Mar 07 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
python3实现名片管理系统
Nov 29 Python
pandas实现将dataframe满足某一条件的值选出
Jun 12 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
python之生产者消费者模型实现详解
Jul 27 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
Node.js简单入门前传
2017/08/21 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
深入理解Python3 内置函数大全
2017/11/23 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
基于python3实现倒叙字符串
2020/02/18 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
大学生会计职业生涯规划范文
2014/02/28 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
企业年会主持词
2014/03/27 职场文书
企业新年寄语
2014/04/04 职场文书
公司合作意向书范文
2014/07/30 职场文书
2015年中学元旦晚会活动方案
2014/12/09 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
微信小程序实现聊天室功能
2021/06/14 Javascript