参考: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. python基础-第三篇-函数编程

    基本数据类型之set set是无序不允许重复的集合 set创建:s = set() 创建空集合  s = {11,22,33} 转换s = set(可迭代数据) li = [11,22,33,44] ...

  2. Python程序员鲜为人知但你应该知道的16个问题(转)

    add by zhj: 没找到原文出处,只能找到转载的,文中说有17个坑,其实是16个 全文如下 这篇文章主要介绍了Python程序员代码编写时应该避免的16个“坑”,也可以说成Python程序员代码 ...

  3. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  4. 怎么解决tomcat占用8080端口问题图文教程

     怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) required ...

  5. BD面试题1-两个大文件中找出公共记录[转载]

    转自:https://blog.csdn.net/tiankong_/article/details/77234726#commentBox 1.题目 给定a.b两个文件,各存放50亿个url,每个u ...

  6. postgresql 建模文件 LDM 转成PDM 生成 SQL问题

    LDM 转成 PDM (Tool --- GPDM ) 生成 SQL,查看全部SQL 详细步骤见下图. 1.postgresql 没有 VARCHAR2 只有 VARCHAR. 2.LDM 生成 PD ...

  7. Python3 安装第三方包

    打开cmd(切记是cmd,不是Python3.6那个敲代码环境)输入 pip3 install numpy 即可(安装numpy包)

  8. ruby 修改Setting config yaml内容

    参考:http://ruby-doc.org/stdlib-1.9.3/libdoc/yaml/rdoc/YAML/Store.html 本事例只为说明如何修改yml文件内容. 一.需求是怎么样修改y ...

  9. ElasticSearch的x-pack配置查询

    ElasticSearch在安装完x-pack后, 存在客户端通过Transport访问ES出现异常:java.lang.IllegalArgumentException: Unknown Named ...

  10. unity手势插件《FingerGestures 》使用入门

    什么是FingerGestures? FingerGestures是Unity上,非常热门的一款用于处理用户输入的插件 为什么要使用FingerGestures? 1:它统一了鼠标点击和用户触摸的输入 ...