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的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
关于Python解包知识点总结
May 05 Python
python和php哪个更适合写爬虫
Jun 22 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
如何利用python发送邮件
Sep 26 Python
python cookie反爬处理的实现
Nov 01 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
php 5.3.5安装memcache注意事项小结
2011/04/12 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
php计算税后工资的方法
2015/07/28 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
爱我中华教学反思
2014/04/28 职场文书
安全横幅标语
2014/06/09 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
总经理检讨书
2014/09/15 职场文书
个人查摆剖析材料
2014/10/04 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
企业介绍信范文
2015/01/30 职场文书
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript