博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 函数式编程 map、reduce用法
阅读量:4215 次
发布时间:2019-05-26

本文共 2269 字,大约阅读时间需要 7 分钟。

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

示例1:实现str 到 int 转换
 
from functools import reduceDIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}def fn(x,y):    return x*10+ydef char2num(s):    return DIGITS[s]print(reduce(fn,map(char2num,'13597')))//写成函数形式def str2int(s):    def fn(x,y)://函数内嵌套定义函数        return x*10+y    def char2num(s):        return DIGITS[s]    return reduce(fn,map(char2num,s))print(str2int('12425'))//结合lambda表达式def str2int(s):    def char2num(s):        return DIGITS[s]    return reduce(lambda x,y:x*10+y,map(char2num,s))print(str2int('12353'))

示例2:str 到 float转换
from functools import reduceDIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,'.':'.'}def str2float(s):    index = -1    for i in range(len(s)):        if s[i] == '.':            index = i            break    if(index == -1):        sl = s[:]        sr = ''    else:        sl = s[:index]        sr = s[index + 1:]    def base(n):        ans = 1        for i in range(n):            ans *= 10        return ans    def char2num(s):        return DIGITS[s]    def fl(x,y):        return x*10+y    if len(sr) != 0 and len(sl) != 0:        return reduce(fl, map(char2num, sl)) + reduce(fl, map(char2num, sr)) / (base(len(sr)))    elif len(sl) == 0 and len(sr) == 0:        return 0    elif len(sl) == 0:        return reduce(fl, map(char2num, sr)) / (base(len(sr)))    else:        return reduce(fl, map(char2num, sl))

大神写法1(不过这个代码并没有判断是否没有'.'):
from functools import reducedef 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)

大大神(使用切片):
from functools import reducedef str2float(s):    def add_two(x, y):        return x * 10 + y    s_list = s.split('.')    s1, s2 = list(map(int, s_list[0])), list(map(int, s_list[1]))//利用map直接转换为Int类型    f1, f2 = reduce(add_two, s1), reduce(add_two, s2)/10**len(s2)    return f1 + f2print(str2float('123.466'))
参考廖雪峰网站:

转载地址:http://shimi.baihongyu.com/

你可能感兴趣的文章
MarkDown学习笔记——语法
查看>>
Python学习笔记——栈和队列
查看>>
Python学习笔记——排序与搜索
查看>>
Python学习笔记——爬虫之BeautifulSoup4数据提取
查看>>
Python学习笔记——爬虫的思路总结
查看>>
Python学习笔记——爬虫之动态HTML处理和机器图像识别
查看>>
Python学习笔记——爬虫之执行JavaScript语句与训练Tesseract
查看>>
Python学习笔记——爬虫之Scrapy框架
查看>>
Python学习笔记——爬虫之Scrapy项目实战
查看>>
Python学习笔记——爬虫之通过Fiddler进行手机抓包
查看>>
Python学习笔记——爬虫之Scrapy-Redis分布式组件
查看>>
Python学习笔记——爬虫之Scrapy-Redis实战
查看>>
Python学习笔记——大数据之Spark简介与环境搭建
查看>>
Python学习笔记——大数据之SPARK核心
查看>>
Python学习笔记——大数据之Pyspark与notebook使用matplotlib
查看>>
Python学习笔记——云计算
查看>>
Python学习笔记——运维和Shell
查看>>
Python学习笔记——nginx
查看>>
Python学习笔记——自动化部署
查看>>
Python学习笔记——多任务-协程
查看>>