pipe并不是Python内置的库,如果你安装了easy_install,直接可以安装它,否则你需要自己下载它:http://pypi.python.org/pypi/pipe

之所以要介绍这个库,是因为它向我们展示了一种很有新意的使用迭代器和生成器的方式:流。pipe将可迭代的数据看成是流,类似于linux,pipe使用’|'传递数据流,并且定义了一系列的“流处理”函数用于接受并处理数据流,并最终再次输出数据流或者是将数据流归纳得到一个结果。我们来看一些例子。

第一个,非常简单的,使用add求和:

Python

1

2

3

>>> from pipe import *

>>> range(5) | add

10

求偶数和需要使用到where,作用类似于内建函数filter,过滤出符合条件的元素:

Python

1

2

>>> range(5) | where(lambda x: x % 2 == 0) | add

6

还记得我们定义的斐波那契数列生成器吗?求出数列中所有小于10000的偶数和需要用到take_while,与itertools的同名函数有类似的功能,截取元素直到条件不成立:

Python

1

2

3

4

5

>>> fib = fibonacci

>>> fib() | where(lambda x: x % 2 == 0)\

...       | take_while(lambda x: x < 10000)\

...       | add

3382

需要对元素应用某个函数可以使用select,作用类似于内建函数map;需要得到一个列表,可以使用as_list:

Python

1

2

>>> fib() | select(lambda x: x ** 2) | take_while(lambda x: x < 100) | as_list

[1, 1, 4, 9, 25, 64]

pipe中还包括了更多的流处理函数。你甚至可以自己定义流处理函数,只需要定义一个生成器函数并加上修饰器Pipe。如下定义了一个获取元素直到索引不符合条件的流处理函数:

Python

1

2

3

4

5

6

>>> @Pipe

... def take_while_idx(iterable, predicate):

...   for idx, x in enumerate(iterable):

...     if predicate(idx): yield x

...     else: return

...

使用这个流处理函数获取fib的前10个数字:

Python

1

2

>>> fib() | take_while_idx(lambda x: x < 10) | as_list

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

更多的函数就不在这里介绍了,你可以查看pipe的源文件,总共600行不到的文件其中有300行是文档,文档中包含了大量的示例。

pipe实现起来非常简单,使用Pipe装饰器,将普通的生成器函数(或者返回迭代器的函数)代理在一个实现了__ror__方法的普通类实例上即可,但是这种思路真的很有趣。

转的,至于from谁已经不得而知...

转载于:https://www.cnblogs.com/Vito2008/p/pypipe.html

有趣的库:pipe(类似linux | 管道)库相关推荐

  1. 程序员的自我修养--链接、装载与库笔记:Linux共享库的组织

    共享库(Shared Library)概念:其实从文件结构上来讲,共享库和共享对象没什么区别,Linux下的共享库就是普通的ELF共享对象.由于共享对象可以被各个程序之间共享,所以它也就成为了库的很好 ...

  2. linux静态库添加文件,Linux静态库和动态库的编写和使用

    Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1  静态库和动态库的区别 1.1. 静态函数库 (1)静态函数库的名 ...

  3. linux 线程库在哪里,linux线程库

    简单地讲,进程是资源管理的最小单位,线程是程序执行的最小单位.一个进程至少要一个线程作为它的指令执行体,进程管理着资源(比如CPU,内存,文件等),而将线程分配到某个CPU上执行.一个进程当然可以拥有 ...

  4. linux下动态库符号表,Linux动态库(.so)符号表

    最近编译libbinder.so发现system/lib/libbinder.so只有358K,但单独编译生成的obj/SHARED_LIBRARIES/libbinder_intermediates ...

  5. python调用pipe_Python中使用PIPE操作Linux管道

    Linux中进程的通信方式有信号,管道,共享内存,消息队列socket等.其中管道是*nix系统进程间通信的最古老形式,所有*nix都提供这种通信方式.管道是一种半双工的通信机制,也就是说,它只能一端 ...

  6. Linux共享库编程方法,Linux共享库c

    我有一个明智的共享图书馆.我如何在我的程序中使用它?我是否需要包含该库的标题? 我在Linux下使用Eclipce.我使用-L和-l设置了库的路径.但我的功能在程序中不可见. 你能解释一下共享图书馆是 ...

  7. 关于Linux静态库和动态库的分析

    From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...

  8. linux动态链接库的使用,Linux动态库soname的使用

    通过一个简单的例子,体验一下Linux动态库soname的使用. 假设有一个动态库:libbar.so.1.1.0,其对应的三个名称如下. realname:libbar.so.1.1.0 sonam ...

  9. 分析Windows和Linux动态库

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系 ...

最新文章

  1. JavaScript与C# Windows应用程序交互
  2. 006_P名称空间的属性注入
  3. React Native 实现物流进度信息
  4. Linux内核 crypto文件夹 密码学知识学习
  5. BugkuCTF-WEB题cookie欺骗
  6. css :after和:before
  7. 暑假周进度总结报告7
  8. 拖动窗体FormBorderStyle属性为None的窗体移动
  9. 如何将两个php超链接,php超链接跳转
  10. <select> 表单元素
  11. PCB 多层设计 实例视频教程 pretell99
  12. 使用github安装atom插件
  13. python爬携程上出境游数据_Python爬虫 —— 携程机票数据
  14. 启动计算机命令,电脑启动项命令
  15. 【Java】线程插队
  16. 前端工程师的摸鱼日常(8)
  17. jQuery fsBanner 手风琴
  18. NOIP2013普及组 题解
  19. StarRocks Analyzer 源码解析
  20. 大数据24小时:链家研究院发布地产大数据产品Real Data,上海交大与依图共建AI联合实验室

热门文章

  1. HBase设计与开发性能优化(转)
  2. Deep Residual Learning for Image Recognition 笔记
  3. 算法导论之贪心算法(Huffman编码和拟阵)
  4. HttpClient实现CSDN自动登录
  5. Hadoop系列一:Hadoop集群分布式部署
  6. 线程基础知识——Windows核心编程学习手札系列之六
  7. java 一千万数字排序_java 输入任意几个数字,怎样将他们从大到小排序?
  8. session过期设置
  9. JavaScript 技术篇-js获取dom节点、html标签自定义属性的值。
  10. C++ leetcode 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。