Python之高阶函数map/reduce

  Python内建map()和reduce()函数

  map()函数接收两个参数一个是函数一个是一个Iterable(迭代器),并把结果作为新的Iterator(生成器)返回

  有一个函数f(x)=x*x作用于序列list[1,2,3,4,5,6,7,8,9]

  使用python函数实现

>>> r=map(f,range(1,4))
>>> r
<map object at 0x7fcec039ee80>
>>> list(r)
[1, 4, 9]
>>> def f(x):
...   return x*x
...
>>> r=map(f,[1,2,3,4,5,6,7,8,9])
>>> r
<map object at 0x7fcec039eda0>
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

  map传递的第一个参数是f是一个函数本身,第二个参数为一个迭代器,结果为生成器Iterator所以需要使用list函数打印才能打印

  也可以不使用map函数而使用一个循环实现如下

>>> L=[]
>>> for i in range(1,11):
...   L.append(i*i)
...
>>> print(L)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

  map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:

>>> list(map(str,[1,2,3,4,5,6,7,8,9]))
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘]

  同理以上可以使用循环实现

>>> L=[1,2,3,4,5,6,7,8,9]
>>> L
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> L1=[]
>>> for i in L:
...   L1.append(str(i))
...
>>> print(L1)
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘]

  使用map可以一行代码实现

  

  reduce的用法

  reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f,[x1,x2,x3.x4])=f(f(f(x1,x2),x3),x4)

  比如一个序列求和

>>> from functools import reduce
>>> def add(x,y):
...   return x+y
...
>>> reduce(add,[1,3,5,7,9])
25

  

#执行顺序如下
add(add(add(add(1,3),5),7),9)
add(add(add(4,5),7),9)
add(add(9,7),9)
add(16,9)
25

  求和运算可以使用python内建函数sum实现

>>> sum([1,3,5,7,9])
25

  但是如果需要把序列[1,3,5,7,9]变成整数就可以使用reduce

>>> from functools import reduce
>>> def fn(x,y):
...   return x*10+y
...
>>> reduce(fn,[1,3,5,7,9])
13579

  这个例子本身没多大用处,但是,如果考虑到字符串str也是一个序列,对上面的例子稍加改动,配合map(),我们就可以写出把str转换为int的函数:

  PS:python内置函数int可以把str转换成int

>>> int(‘13579‘)
13579

  假设python不带int函数怎么把str ‘13579‘转换成整数13579

  思路

  char2num.py

#加载reduce模块
from functools import reduce
def fn(x,y):
    return x*10+y

#定义函数把字符串转换成数字参数为字符串‘1’,返回为整数1
def char2num(s):
    digits={‘0‘:0,‘1‘:1,‘2‘:2,‘3‘:3,‘4‘:4,‘5‘:5,‘6‘:6,‘7‘:7,‘8‘:8,‘9‘:9}
    return digits[s]

s=‘13579‘
print(‘需要转换成整数的字符串是‘,s)
#使用map函数生成迭代器,迭代后输出为[1,3,5,7,9]
l=map(char2num,s)
print(‘使用map转换后的生成器‘,l)
#使用reduce把生成的序列计算成整数
#计算过程为
#reduce(fn,[1,3,5,7,9])
#fn(fn(fn(fn(1,3),5),7),9)
#fn(fn(fn(13,5),7),9)
#fn(fn(135,7),9)
#fn(1357,9)
#13579
print(reduce(fn,l))

  运行输出如下

需要转换成整数的字符串是 13579
使用map转换后的生成器 <map object at 0x7f5cbec4e7b8>
13579

  改成函数char2num_fuction.py

#加载reduce模块
from functools import reduce
def char2int(s):
    def fn(x,y):
        return x*10+y

#定义函数把字符串转换成数字参数为字符串‘1’,返回为整数1
    def char2num(s):
        digits={‘0‘:0,‘1‘:1,‘2‘:2,‘3‘:3,‘4‘:4,‘5‘:5,‘6‘:6,‘7‘:7,‘8‘:8,‘9‘:9}
        return digits[s]

    return(reduce(fn,map(char2num,s)))

s=‘13579‘
print(char2int(s))

  

  练习1 利用map函数把用户不规范输入的字符串改成规范及首字母大写其余小写

normalize.py

def normalize(name):
    return name.title()

L1=[‘adam‘,‘LISA‘,‘barT‘]
L2=list(map(normalize,L1))
print(L2)

  输出

[‘Adam‘, ‘Lisa‘, ‘Bart‘]

  

  练习2 请编写一个prod()函数,可以接受一个list并利用reduce()求积:

  prod.py

from functools import reduce
def fn(x,y):
  return x*y

def prod(L):
  return reduce(fn,L)

PROD=prod([3,5,7,9])
print(PROD)

  

原文地址:https://www.cnblogs.com/minseo/p/11046737.html

时间: 2024-10-12 23:30:20

Python之高阶函数map/reduce的相关文章

python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来的出想要的结果,只要是输入时确定的,输出就是确定的. 1.2高阶函数 能把函数作为参数传入,这样的函数就称为高阶函数. 1.2.1函数即变量 以python的内置函数print()为列,调用该函数一下代码 >>> pri

函数式编程 &amp; Python中的高阶函数map reduce filter 和sorted

1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数式编程的第一型.在面向对象编程中,我们把对象传来传去,那在函数式编程中,我们要做的是把函数传来传去,而这个,说成术语,我们把他叫做高阶函数.飞林沙 2)特点 计算视为视为函数而非指令 纯函数式编程:不需变量,无副作用,测试简单(每次的执行结果是一样的) 支持高阶函数,代码简洁 2. python支持

JavaScript高阶函数 map reduce filter sort

本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 高阶函数 一个函数就接收另一个函数作为参数,这种函数就称之为高阶函数 1.高阶函数之map: 此时我们有一个数组和一个接受一个参数并返回一个数的函数.我们需要把这个数组的每一个值在这个函数上走一遍,从而得到一个新数组.此时就需要map了 var a = [1,2,3,4,5,6]; var b = [] var fun = function(x) { return x * x; } b = a.map(fun) alert(b)  /

Python 高阶函数 -- map/reduce

这个内容我是参考廖雪峰的博客,摘抄其中一些内容而来的,附带解决他最后的问题代码. 这是我在C/C++中未曾见过的语法(可能是我学艺未精),理解它确实花了十来二十分钟.它提供了一条google的论文链接:"MapReduce: Simplified Data Processing on Large Clusters",据说是一篇很牛逼的文章.当我理解了这个概念后,觉得确实很方便. 先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列

python 高阶函数map/reduce

Python内建了map()和reduce()函数. map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. 1 def f(x): 2 return x*x 3 r = map(f, [1,2,3,4,5,6]) 4 print(r) 5 print(list(r)) Output: <map object at 0x00000269FA005E10> [1, 4, 9, 16, 25, 36] re

[ Python - 9 ] 高阶函数map和reduce连用实例

1. 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functools import reduce def str2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] def str2float(s): if '.' in s: # 将字符串s拆分成list类型 s = s.s

Python学习之高阶函数——map/reduce

map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. 即map(函数,Iteratable) map()传入的第一个参数是f,即函数对象本身.由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list. >>> def f(x): ... return x * x ... >>> r = map(f,

高阶函数 map/reduce页面习题

简单来说,map函数就是把数组元素一个一个取出来玩,reduce函数就是按顺序去前两个玩,玩完了把结果再和下一个元素放在一起玩. 1.利用reduce求积 'use strict'; function product(arr) { return arr.reduce(function(x,y){return x*y}); } // 测试: if (product([1, 2, 3, 4]) === 24 && product([0, 1, 2]) === 0 && prod

Python高阶函数_map/reduce/filter函数

本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文"MapReduce: Simplified Data Processing on Large Clusters",你就能大概明白map/reduce的概念. 我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序