Python学习札记(二十一) 函数式编程2 map/reduce
参考:map/reduce
Note
1.map():map()函数接收两个参数,一个是函数,一个是Iterable。map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
#!/usr/bin/env python3
def f(x) :
return x*x
l = map(f, [1, 2, 3, 4, 5, 6, 7])
print(list(l))
sh-3.2# ./map1.py
[1, 4, 9, 16, 25, 36, 49]
l是map函数返回的一个iterator,惰性序列,保存关系x*x,在调用list()函数的时候执行计算得到序列。
2.map()作为高阶函数,事实上抽象化了运算规则。
比如将一个list中的所有元素转化为字符形式:
l1 = map(str, [1, 2, 3, 4, 5, 6, 7])
print(l1)
print(list(l1))
<map object at 0x1013d89b0>
['1', '2', '3', '4', '5', '6', '7']
3.reduce()函数:"reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算",效果:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比如一个求和序列:
def f1(x, y) :
return x+y
l2 = reduce(f1, [1, 2, 3, 4, 5])
print(l2)
l3 = reduce(f1, 'string')
print(list(l3))
15
['s', 't', 'r', 'i', 'n', 'g']
将数字整合起来:[1, 2, 3, 4, 5] => 12345
def f2(x, y) :
return x*10 + y
l4 = reduce(f2, [1, 2, 3, 4, 5])
print(l4)
12345
4.map(),reduce()函数相组合:
str转int(int()函数):
def func(s) :
def func1(x) :
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[x]
def func2(x, y) :
return x*10 + y
return reduce(func2, map(func1, s))
s = input()
print(func(s))
952693358
952693358
原理是先将可迭代对象str映射到由int元素组成的迭代器,即惰性序列;再将该迭代器作为参数传入reduce()函数求值。
练习:
1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:
#!/usr/bin/env python3
def func(name) :
return name.title()
l = ['adam', 'LISA', 'barT']
itor_l = map(func, l)
print(list(itor_l))
sh-3.2# ./map2.py
['Adam', 'Lisa', 'Bart']
2.Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:
#!/usr/bin/env python3
from functools import reduce
def prod(l) :
def func(x, y) :
return x*y
return reduce(func, l)
print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))
sh-3.2# ./map3.py
3 * 5 * 7 * 9 = 945
3.string 转 float。
#!/usr/bin/env python3
from functools import reduce
def str2float(s) :
floatlen = 0
s1 = ''
flag = True
for i in s :
if i == '.' :
flag = False
continue
else :
s1 = s1+i
if flag :
floatlen = floatlen+1
floatlen = len(s)-floatlen-1
def mapfunc(s) :
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
# return {}[]
def reductfunc(x, y) :
return x*10+y
return reduce(reductfunc, map(mapfunc, s1)) / (10 ** floatlen)
print('str2float(\'123.456\') =', str2float('123.456'))
print('str2float(\'123.978\') =', str2float('123.978'))
sh-3.2# ./map4.py
str2float('123.456') = 123.456
str2float('123.978') = 123.978
2017/2/11
Python学习札记(二十一) 函数式编程2 map/reduce的更多相关文章
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- Python学习札记(二十三) 函数式编程4 sorted
参考:sorted NOTE 1.sorted,快速排序,时间复杂度O(nlogn)渐进最优. #!/usr/bin/env python3 L = [] for i in range(10): L. ...
- Python学习札记(二十七) 函数式编程8 偏函数
偏函数 NOTE 1.int()函数提供额外的base参数,默认值为10.如果传入base参数,就可以做N进制的转换: #!/usr/bin/env python3 import functools ...
- Python学习笔记二:函数式编程
1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...
- Python学习札记(三十一) 面向对象编程 Object Oriented Program 2
参考:类和实例 注意理解第七点. NOTE: 1.类是抽象的模板,比如Student类,实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. ...
- Python学习总结之五 -- 入门函数式编程
函数式编程 最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转. 今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见 ...
- Python函数式编程,map/reduce,filter和sorted
什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...
- 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...
- Python学习札记(二十五) 函数式编程6 匿名函数
参考:匿名函数 NOTE 1.Python对匿名函数提供了有限的支持. eg. #!/usr/bin/env python3 def main(): lis = list(map(lambda x: ...
随机推荐
- 实现一个自动生成小学四则运算题目的命令行程序(java实现)
Github项目地址:https://github.com/xiaobaot/wordcount/tree/master/sizeyusuan 团队成员:谢家明(代码生成) 谢竣(测试完善) 项 ...
- 设计模式C++实现——适配器模式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/29863177 模式定义: 适 ...
- TensorFlow学习笔记(一)--windows系统安装配置
1.关于Tensorflow 国际惯例,先来个总体的简要介绍,摘自一个很强大的TensorFlow中文学习网站(http://www.tensorfly.cn/)的简介 TensorFlow™ 是一个 ...
- centos7使用中文输入法
centos7自带中文输入法,可能我们在安装时会跳过选择汉语拼音,我们来重新设置一下吧 假如你在命令行界面,输入Ctrl+Alt+F1进入图形界面 点击左上角系统工具 --> 设置 --&g ...
- 微信小程序组件navigator
导航navigator:官方文档 Demo Code: // redirect.js navigator.js Page({ onLoad: function(options) { this.setD ...
- Mac OS X 10.10 Yosemite下配置 apache+php
自从系统从OS X Mavericks 10.9升级到OS X Yosemite 10.10 后之前配置apache和php均不能正常使用了, 重新设置配置如下: 首先,查看当前系统的apache版本 ...
- ionic 配置打包环境
配置java环境就不说了,太简单 下载AndroidSdkAndroid SDK Tools翻过墙的朋友可以去Google Android的官网上下载:http://developer.android ...
- XVII Open Cup named after E.V. Pankratiev Grand Prix of Moscow Workshops, Sunday, April 23, 2017 Problem K. Piecemaking
题目:Problem K. PiecemakingInput file: standard inputOutput file: standard outputTime limit: 1 secondM ...
- tomcat服务无响应堆栈分析
tomcat服务突然无响应了,导出内存堆栈和线程堆栈,分析后发现是同步锁使用不合理导致的. [root@prd-dtb-web-01 ~]# [root@prd-dtb-web-01 ~]# jmap ...
- Web服务器端程序的实现
Web服务器端程序主要是两个部分,一部分是主函数,一部门是命令处理函数.命令处理函数比较好理解就是针对客户端不同的命令进行处理,与客户端进行通信.主函数也有两个主要的功能,第一是要对程序进行初始化,其 ...