参考: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的更多相关文章

  1. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍

    参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...

  2. Python学习札记(二十三) 函数式编程4 sorted

    参考:sorted NOTE 1.sorted,快速排序,时间复杂度O(nlogn)渐进最优. #!/usr/bin/env python3 L = [] for i in range(10): L. ...

  3. Python学习札记(二十七) 函数式编程8 偏函数

    偏函数 NOTE 1.int()函数提供额外的base参数,默认值为10.如果传入base参数,就可以做N进制的转换: #!/usr/bin/env python3 import functools ...

  4. Python学习笔记二:函数式编程

    1:Python中,内置函数名相当于一个变量,指向内置函数.所以可以通过函数名调用相应函数,也可以给函数名赋值,改变它的内容,如:可以把另一个函数变量赋值给它,那它就指向了所赋值的函数了. 2:高级函 ...

  5. Python学习札记(三十一) 面向对象编程 Object Oriented Program 2

    参考:类和实例 注意理解第七点. NOTE: 1.类是抽象的模板,比如Student类,实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. ...

  6. Python学习总结之五 -- 入门函数式编程

    函数式编程 最近对Python的学习有些怠慢,最近的学习态度和学习效率确实很不好,目前这种病况正在好转. 今天,我把之前学过的Python中函数式编程简单总结一下,分享给大家,也欢迎并感谢大家提出意见 ...

  7. Python函数式编程,map/reduce,filter和sorted

    什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...

  8. 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)

    二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...

  9. Python学习札记(二十五) 函数式编程6 匿名函数

    参考:匿名函数 NOTE 1.Python对匿名函数提供了有限的支持. eg. #!/usr/bin/env python3 def main(): lis = list(map(lambda x: ...

随机推荐

  1. git学习——<三>git操作

    一.创建仓库 创建一个目录 mkdir repository cd到该目录下,初始化该版本库 git init 至此,版本库创建成功,可以在该文件夹下看到.git文件夹,ls -ah可以看到该文件夹. ...

  2. MYSQL--表分区、查看分区(转)

    一.       mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间, ...

  3. SpringBoot-基于Maven工程使用SpringBoot

    Spring Boot SpringBoot是一个社区反馈推动的项目.SpringBoot可以说是至少五年来Spring乃至整个Java社区最有影响力的项目之一.SpringBoot主要包括以下特性: ...

  4. maven 之 web.xml 头设置错误问题

    1.一般开发工具创建web.xml的时候会默认添加web.xml头,而有些插件(例如maven相关插件)默认添加的为 版本和你的开发工具Project facets(项目特性)中设置不同.那么就会导致 ...

  5. (2.4)备份与还原--WAL与备份原理

    预写式日志(Write-Ahead Logging (WAL))  部分转自:http://www.cnblogs.com/wenBlog/p/4423497.html SQL Server中使用了W ...

  6. C#版-Redis缓存服务器在Windows下的使用

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

  7. Hadoop2.7.3 HA高可靠性集群搭建

    1.背景介绍 Hadoop2.0.0之前,在一个HDFS集群中,NameNode存在单节点故障(SPOF):因为集群中只有一个NameNode,所以在使用过程中,如果该NameNode出现故障或数据丢 ...

  8. 测试:safenet提供的CheckKey函数 内存泄漏。具体来说是句柄.

    unsigned char vendor_code[] = "7XSQT4jxlSkDJhwqpxxfLwbuxgrYw93OMy+K5sc5pyfTa7HQo1ikLyg7FDuEpgUK ...

  9. Java泛型三:Java泛型详解

    原文地址https://www.cnblogs.com/lzq198754/p/5780426.html 1.为什么需要泛型 泛型在Java中有很重要的地位,网上很多文章罗列各种理论,不便于理解,本篇 ...

  10. 以About Us为范例在Zen cart中增加页面

    1.在includes\languages\english\html_includes目录中新建文件define_about_us.php 2.在includes\templates\Your_tem ...