pipeline指什么,什么叫pipeline
管道
流水线流水线借鉴Unix Shell的流水线操作3354来串几个命令,前一个命令的输出成为后一个命令的输入,从而完成一个流计算。(注:管道绝对是一个伟大的发明,他的设计理念是KISS——让每个功能做一件事,把它做到极致,软件或程序的组装会变得更简单直观。这种设计理念影响深远,包括今天的Web服务、云计算、大数据的流计算等。)
例如,我们的shell命令如下:
PS auwwx awk“{ print $ 2 }” sort-n xargs echo
如果我们抽象成函数式语言,像这样:
xargs( echo,sort(n,awk(print $2 ,ps(auwwx))))
它也可能如下所示:
pids=for_each(结果,[ps_auwwx,awk_p2,sort_n,xargs_echo])
好了,我们来看看函数式编程的流水线怎么玩。
我们先来看一个程序如下。这个程序的过程()有三个步骤:
1)找出偶数。
2)乘以3
3)将其转换为字符串并返回。
没人回答问题?边肖创建了一个Python学习交流QQ群:857662006,寻找志同道合的朋友
互帮互助,群里也有不错的视频学习教程和PDF电子书!
定义过程(数量):
#过滤掉非偶数
如果数量% 2!=0:
返回
数量=数量* 3
num=数字:%s % num
退货数量
nums=[1,2,3,4,5,6,7,8,9,10]
对于nums中的num:
打印过程(数字)
#输出:
#无
#数字:6
#无
#数量:12
#无
#数量:18
#无
#数字:24
#无
#数量:30
正如我们所看到的,输出并不完美。另外,如果代码阅读里没有注释,你会很困惑。接下来,我们来看看如何写函数管道(第一种方式)。
定义偶数_过滤器(数量):
对于nums中的num:
如果数量% 2==0:
产量数量
定义乘以三(nums):
对于nums中的num:
产量数量* 3
定义转换为字符串(nums):
对于nums中的num:
“产量”的数量:% s“%数量
nums=[1,2,3,4,5,6,7,8,9,10]
pipeline=convert _ to _ string(multiply _ by _ three(even _ filter(nums)))
对于管道中的数量:
打印编号
#输出:
#数字:6
#数量:12
#数量:18
#数字:24
#数量:30
我们使用Python关键字yield,它主要返回一个生成器。yield是一个类似于return的关键字,但是这个函数返回一个Generator- generator。所谓生成器,就是yield返回一个迭代对象,没有真正的执行函数。也就是说,yield函数实际上只有在返回的迭代对象被实际迭代时才会运行,到达yield语句时就会停止,然后等待下一次迭代。(这是一个相当奇怪的关键字)这是懒惰的评价。
好了,根据前面的原则3354“用Map Reduce,不要用loops”,那我们就用更简单的Map Reduce吧。
没人回答问题?边肖创建了一个Python学习交流QQ群:857662006,寻找志同道合的朋友
互帮互助,群里也有不错的视频学习教程和PDF电子书!
定义偶数_过滤器(数量):
返回过滤器(x:x % 2==0,nums)
定义乘以三(nums):
返回映射(x:x * 3,nums)
定义转换为字符串(nums):
返回映射(lambda x:数字:%s % x,nums)
nums=[1,2,3,4,5,6,7,8,9,10]
管道=转换为字符串(
乘以三(
偶数_滤波器(nums)
)
)
对于管道中的数量:
打印编号
但是他们的代码需要使用嵌套函数,有点不舒服。如果我们能长得像下面这样就好了(第二种方式)。
pipeline_func(nums,[even_filter,
乘以三,
转换为字符串])
然后,pipeline_func实现如下:
def pipeline_func(data,fns):
返回reduce(a,x: x(a),
fns,
数据)
好吧,看了这么多程序,你可以回头看看本文开头对函数式编程的描述,也许你会有更多的感触。
最后,我希望这篇浅显易懂的文章能让你感受到函数式编程的思想,就像面向对象的面向对象的编程,泛型编程,过程式编程一样,我们不用太纠结是不是我们的程序就是OO,就是功能的的,我们重要的品味其中的味道。
参考
维基百科:函数式编程
真正理解程序性和功能性的区别
函数式编程的实用介绍
过程式编程和函数式编程有什么区别?
有人能给我举函数式编程和命令式/过程式编程的例子吗?
面向对象与函数式编程相对过程式
python函数式编程指南
补充:评论中重新修改的这个评论大家也可以读一读。
感谢谢网友S142857提供的壳风格的大蟒管道:
类别管道(对象):
def __init__(self,func):
self.func=func
def __ror__(self,other):
定义生成器():
对于其他对象:
如果目标文件不为无:
产生self.func(对象)
返回生成器()
@管道
定义偶数_过滤器(数量):
如果数量% 2==0,则返回num,否则无
@管道
定义乘以三(数字):
退货数量*3
@管道
def转换为字符串(数字):
返回号码:%s % num
@管道
定义回显(项目):
打印项目
退货项目
定义力(平方):
对于标准中的项目:通过
nums=[1,2,3,4,5,6,7,8,9,10]
force(nums even _ filter multiply _ by _ three convert _ to _ string echo)