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压缩和解压缩zip文件的教程
May 06 Python
详解Python字符串对象的实现
Dec 24 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 Python
简单介绍python封装的基本知识
Aug 10 Python
Python中base64与xml取值结合问题
Dec 22 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
使用python turtle画高达
Jan 19 Python
python Plotly绘图工具的简单使用
Mar 03 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
python实现自动清理文件夹旧文件
May 10 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 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
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
php实现算术验证码功能
2018/12/05 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
python列表与元组详解实例
2013/11/01 Python
Python中AND、OR的一个使用小技巧
2015/02/18 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
英国家用电器购物网站:Hughes
2018/02/23 全球购物
沙特阿拉伯排名第一的在线时尚购物应用程序:1Zillion
2020/08/08 全球购物
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
北大自主招生自荐信
2013/10/19 职场文书
电子银行营销方案
2014/02/22 职场文书
公司领导班子对照材料
2014/08/18 职场文书
心灵捕手观后感
2015/06/02 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python