一.map()函数接收两个参数,一个是函数,一个是iterable, map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
二.reduce()把一个函数作用在一个序列上,这个函数必须接收两个参数, reduce把结果继续和序列的下一个元素做累积计算。
先看map的用法:
栗子1:
def f(x): return x*x r = map(f,[1,2,3,4,5,6,7,8,9,10]) print(list(r))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]map()传入的第一个参数是f ,即函数对象本身。由于结果 是一个Iterator ,Iterator 是惰性序列,因此通过list() 函数让它把整个序列都计算出来并返回一个list。
栗子2:
def normalize(name):
return str(name[0]).upper() + str(name[1:]).lower()
# 测试:
L1 = ['applE', 'liSA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
结果:['Apple', 'Lisa', 'Bart']
(不知道格式怎么出问题了,所以直接放文字)
再看reduce的用法:
from functools import reduce def add(x, y): return x + y print(reduce(add, [1, 3, 5, 7, 9]))结果25,emmm,这个Python有内置函数sum(),效果是一样的
再来一个:Python提供的sum()函数可以接受一个list并求和,编写一个函数,可以接受一个list并利用reduce()求积:
from functools import reduce def fn(x, y): return x * y def prod(L): return reduce(fn, L) #使用lambda表达式 def prod(L): return reduce(lambda x, y: x * y, L) print('1 * 2 * 3 * 4 =', prod([1, 2, 3, 4])) if prod([1, 2, 3, 4]) == 24: print('测试成功!') else: print('测试失败!')当然是成功的!
综合的:
利用map和reduce编写一个str2float函数
说实话,实在想不出来怎么写,但是找到了网上的两种方式,这里做个记录, 以后可以回头看看:
方式一:
from functools import reduce
def str2float(s):
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]
return reduce(fn, map(char2num, s.replace(".","")))
s="1234.567"
if s.find(".")!=-1:
print('str2float(\'%s\') ='%s, str2float(s)/pow(10,(len(s)-s.find(".")-1)))
else:
print('str2float(\'%s\') ='%s, str2float(s))
方式二:
from functools import reduce
def str2float(s):
def fn(x,y):
return x*10+y
n=s.index('.')
s1=list(map(int,[x for x in s[:n]]))
s2=list(map(int,[x for x in s[n+1:]]))
return reduce(fn,s1) + reduce(fn,s2)/10**len(s2)
print('\'123.4567\'=',str2float('123.4567'))
这个是自己结合了一下,觉得比较好理解的一种,也稍微严谨了一点
def str2float(s): def fn(x, y): return x * 10 + y DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def char2num(s): return DIGITS[s] i = s.index(".") if i != -1: if i != 0: s1 = list(map(char2num, [x for x in s[:i]])) else: s1 = 0 s2 = list(map(char2num, [x for x in s[i + 1:]])) return reduce(fn, s1) + reduce(fn, s2) / 10 ** len(s2) print('str2float(\'123.456\') =', str2float('123.456')) if abs(str2float('123.456') - 123.456) < 0.00001: print('测试成功!') else: print('测试失败!')
这样,如果直接是个小于一的小数也可以转换