#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com
#****************************************************
# Python3 函数式编程-高阶函数-map/reduce *
#****************************************************
print ("--------------------分割线------------------")
#============
# map()
#============
'''
map()函数接收两个参数,一个是函数,一个是Iterable。map将传入的函数依次
作用到序列的每个元素,并把结果作为新的Iterator返回。
'''
# 例:函数func(x)=x的平方,要把这个函数在一个list上,就可以用map实现
from collections import Iterator
def func(x):
return x * x
list_a = [ x for x in range(1,8) ]
print( list_a ) # [1, 2, 3, 4, 5, 6, 7]
map_t = map( func, list_a )
print( isinstance(map_t, Iterator) ) # True
print( next(map_t), next(map_t) ) # 1 4
for val in map_t:
print( val, end=' ' ) # 9 16 25 36 49
print()
'''
map()传入的第一个参数是func,即函数对象本事。由于结果map_t是一个
Iterator,Iterator是惰性序列,因此通过next()函数和for循环把整个序列
计算出来
for循环也可以实现整个列表的平方,但没有map()简单清晰明了。map作为高阶
函数,事实上它把运算规则抽象了。
'''
# 将列表中所有数字转为字符串
print( list( map(str, [1,2,3]) ) ) # ['1', '2', '3']
print ("--------------------分割线------------------")
#============
# reduce()
#============
'''
reduce 把一个函数作用在一个序列[1, 2, 3]上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(func, [x1, x2, x3]) = func(func(x1, x2), x3)
'''
# 序列求和计算,reduce版本
from functools import reduce
def func_add(x, y):
return x + y
print( reduce(func_add, [1, 2, 3, 4]) ) # 10
# 字符串str转换为int函数
from functools import reduce
def func2(x, y):
return x*10 + y
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]
print( reduce(func2, map(char2num, '13456')) ) # 13456
# 整理成一个str2int的函数
from functools import reduce
DIGITS = {'0':0,'1':1,'2':2,'3':3,'4':4,\
'5':5,'6':6,'7':7,'8':8,'9':9}
def str2int(s):
def func3(x, y):
return x*10 + y
def char2num(s):
return DIGITS[s]
return reduce(func3, map(char2num, s))
print( str2int('120030') ) # 120030
# 使用lambda函数进一步简化:
def Str2Int(s):
return reduce(lambda x,y:x*10+y, map(char2num,s))
print( Str2Int('120030') ) # 120030
print ("--------------------分割线------------------")
#利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他
#小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']
L1 = ['adam', 'LISA', 'barT']
def normalize(s):
return s[0].upper()+s[1:].lower()
L2 = list(map(normalize, L1))
print(L2) # ['Adam', 'Lisa', 'Bart']
# Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,
# 可以接受一个list并利用reduce()求积
from functools import reduce
def prod(L):
return reduce(lambda x, y:x*y, L)
print( prod([2,3,6]) ) # 36
# 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
def str2float(s):
return reduce(lambda x,y:x*10+y,map(int,s.replace('.','')))/10**s.find('.')
print( str2float('123.456') ) # 123.456
Python3 学习笔记20_函数式编程-高阶函数-map/reduce_20180312
最新推荐文章于 2024-08-14 20:48:06 发布
456

被折叠的 条评论
为什么被折叠?



