美文网首页ITS·黑客
【python】高阶函数、map()、reduce()

【python】高阶函数、map()、reduce()

作者: MJXH | 来源:发表于2017-05-05 12:00 被阅读5次
  • 高阶函数
    1)函数本身可以赋值给变量,即"变量指向函数"
>>> f = abs
>>> f(-10)
10

2)函数名实为指向函数的变量,即abs()看做一个函数,abs看做变量,可以指向一个求绝对值的函数

>>> abs = 10
>>> abs(-10) 这样写会出错

3)高阶函数:一个函数就可以接收另一个函数作为参数

def add(x, y, f):
    return f(x) + f(y)
调用add(-5, 6, abs)
  • map() 函数
    接收两个参数,一个是函数,一个是Iterable
    map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
>>> def f(x):
...     return x * x   计算f(x)=x²
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。当然也可以返回别的,比如tuple,set;但不可以是str,int之类

  • rudece()函数
    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    要点是:f函数必须接收2个参数,reduce把结果继续和序列的下一个元素做累积计算
>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> def char2num(s):
...     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
>>> reduce(fn, map(char2num, '13579')) 这里的map()返回的是1,3,5,7的int数值了
13579

{}[]表示:{key:value}[key] 这种索引就该返回value 但是[key]是['13579'] 这样的字典索引难道会自己拆分?
其实不是,这里还是map的作用,它可以将函数依次作用到序列的每个元素,'13579'是str,是一种序列,它被map拆分成单个元素单独在{}[]中进行使用,即代码中[s]只有一个元素

课后题

def normalize(name):
    def change(s):
        return s.title()
    L2 = map(change,name)
    return list(L2)
normalize(['adam', 'LISA', 'barT'])
#编写一个prod()函数,可以接受一个list并利用reduce()求积
def prod(L):
    def product(x,y):
        return x*y
    return reduce(product,L)
prod([3,5,7,9])
#利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
def char2num(s):
        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def zhengshu(x,y):
        return x*10 +y
def str2float(s):
    l = s.split('.') #以‘.’为分隔成两个元素的list
    return reduce(zhengshu,map(char2num,l[0]))+reduce(zhengshu,map(char2num,l[1]))/10**len(l[1])
print(str2float('123.4'))

相关文章

网友评论

    本文标题:【python】高阶函数、map()、reduce()

    本文链接:https://www.haomeiwen.com/subject/ndlktxtx.html