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实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Python3 模块、包调用&amp;路径详解
Oct 25 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
Python Socket使用实例
Dec 18 Python
Python实现生成随机数据插入mysql数据库的方法
Dec 25 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python调用opencv实现猫脸检测功能
Jan 15 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
20行Python代码实现视频字符化功能
Apr 13 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 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
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
Python字符串处理实例详解
2017/05/18 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
基于python实现查询ip地址来源
2020/06/02 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
python实现扫雷游戏的示例
2020/10/20 Python
美国网上书店:Barnes & Noble
2018/08/15 全球购物
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
学校消防演习方案
2014/02/19 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
学籍证明模板
2014/11/21 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python