main函数传参并进行二进制数据转化_高阶函数map/reduce

代码环境:python3.6

map/reduce 简单对比

5f7688c0c88f198a7acb63378e7b1193.png

map

map 是 python 内置函数,使用方法:map(func, iterable),将传入的函数 func 依次作用到 iterable 的每个元素。

举个例子,给出一个序列[1, 2, 3, 4, 5, 6, 7, 8, 9],我们要计算出所有元素的平方,用 map 实现如下:

def f(x):
    return x * x

def my_map():
    return map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])


if __name__ == "__main__":
    print(my_map())
    print(list(my_map()))


# 运行结果:
# <map object at 0x*******>
# [1, 4, 9, 16, 25, 36, 49, 64, 81]

在上面运行结果中,我们需要注意的是,map 返回的结果 iterator 是一个惰性序列,我们需要用 list 函数把序列都计算出来并返回一个 list。

reduce

reduce 在 python2 中是内置函数,在 python3 中被移到 functools,所以使用之前需要先导入,调用方法:reduce(func, sequence)

注意:这里的参数 sequence和 map 的参数 iterable有所不同,详细可参考我前面的文章:
老K:python中的sequence​zhuanlan.zhihu.com

reduce 的作用是把一个函数 f 作用在一个序列[x1, x2, x3, x4, ...]上,这个函数 f 必须接收两个参数,先计算出 f(x1, x2) 的值,reduce 再把这个结果继续和下一个元素 x3 做累积的计算,以此类推,效果大概如下:

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

举个例子,给出一个序列[1, 3, 5, 7],我们利用 reduce 求积,代码如下:

from functools import reduce


def prod(x, y):
    return x * y

def my_prod(obj_list):
    return reduce(prod, obj_list)

if __name__ == "__main__":
    print(my_prod())


# 运行结果:
# 105

map/reduce 联合使用

我们利用 map/reduce 编写一个 str2float 函数,把字符串'123.456'转换成浮点数123.456(示例仅使用正数)。

from functools import reduce


# 按整数规则累加传参
def reduce_zhengshu(x, y):
    return x * 10 + y


# 将字符转为对应整数
def char2int(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]


def str2float(my_str):
    # 将字符串分割为 整数字符串 和 小数字符串 两部分
    my_list = my_str.split('.')

    len_num_part2 = len(my_list[1])

    # 字符串先用 map 函数映射为一个整数序列,再用 reduce 累加这个序列
    num_part1_int = reduce(reduce_int, map(char2int, my_list[0]))

    # 先计算出小数字符串部分对应的整数为 456,再转化为真正的小数
    num_part2_int = reduce(reduce_int, map(char2int, my_list[1]))
    num_part2_decimal = num_part2_int * (10**-len_num_part2)
    
    return num_part1_int + num_part2_decimal


if __name__ == "__main__":
    print(str2float('123.456'))


# 运行结果:
# 123.456
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值