Python中的map()和reduce()以及一些栗子

一.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('测试失败!')

这样,如果直接是个小于一的小数也可以转换


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值