Pipe——Python 的中缀语法库

来源:互联网 发布:linux删除history 编辑:程序博客网 时间:2024/05/14 18:00

赖勇浩(http://laiyonghao.com)

注:本文基本上是翻译这篇文章(http://dev-tricks.net/pipe-infix-syntax-for-python)。

通过 Pipe 模块,就能够使用 Python 用上中缀语法。

首先来看一下传统前缀语法的代码:

sum(select(where(take_while(fib(), lambda x: x < 1000000) lambda x: x % 2), lambda x: x * x))

很难读?再来看看中缀语法代码:

fib() | take_while(lambda x: x < 1000000) \      | where(lambda x: x % 2) \      | select(lambda x: x * x) \      | sum()

好读多了吧?

虽然 Pipe 基类的代码很少,但很强大,能够让你很容易写出 pipeable 函数哦。而且这个模块本身就带了超过 30 个已经写好的函数,比如 ‘where’, ‘group_by’, ‘sort’, ‘take_while’ …

如果想一下 Pipe,需要先安装,在命令行执行:

pip install -U pipe

然后等着安装完成就行了。现在可以打开一个交互式 Shell,来试一下:

Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) [GCC 4.4.5] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> from pipe import *>>> [1, 2, 3, 4, 5] | add15>>> [5, 4, 3, 2, 1] | sort[1, 2, 3, 4, 5]

很简单吧?如果有什么问题,可以随时 help(pipe) 一下,就可以看到完备的帮助了。

接下来我们展示一下组合两个或更多的 pipeable 函数:

>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | concat'1, 3, 5'>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | tail(2) | concat'3, 5'>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | tail(2) | select(lambda x: x * x) | concat'9, 25'>>> [1, 2, 3, 4, 5] | where(lambda x: x % 2) | tail(2) | select(lambda x: x * x) | add34

因为 Pipe 是惰性求值的,所以我们完成可以弄一个无穷生成器而不用担心内存用完,比如:

>>> def fib():...    a, b = 0, 1...    while True:...        yield a...        a, b = b, a + b

现在让我们用 fib() 函数来完成一个 http://projecteuler.net 的第 2 题:

Find the sum of all the even-valued terms in Fibonacci which do not exceed four million.

>>> euler2 = fib() | where(lambda x: x % 2 == 0) | take_while(lambda x: x < 4000000) | add>>> assert euler2 == 4613732

怎么样?可读性强吧?漂亮不?

最后,我们来学习一下如何利用 @Pipe decorator 创建一个新的 pipeable 函数:

假定要创建一个函数 yield 它的输入的前 x 个元素

假定要创建一个函数能够用以 (1, 2, 3, 4, 5) | take(2) 语句来获取前两个元素

那么最初的实现可能是这样的:

def take(iterable, qte):    for item in iterable:        if qte > 0:            qte -= 1            yield item        else:            return

现在,你只要把 @Pipe 盖在这个函数上头,这货就是 pipeable 函数了!

====================

鸣谢:

感谢 @yinhm 在 Twitter 上分享《Pipe: Infix syntax for Python》一文,让我知道还有这等神器。

感谢 @kyhpudding 在 Twitter 上分享他的 solo 模块,一个比 pipe 更奇幻的模块,希望我能理解清楚,能够跟大家介绍之。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米5指纹坏了怎么办 苹果5s指纹失灵怎么办 学生赌博输了3万怎么办 电脑录屏没有声音怎么办 别人说你没有他美怎么办 没有你我怎么办歌词是什么意思 要是没有他我怎么办啊歌词 用喀秋莎保存的视频黑屏怎么办 电脑杀毒之后开不了机怎么办 夫妻离婚分房分车怎么办 请的护身符丢了怎么办 老车轻微烧机油怎么办 电脑下软件变卡怎么办 机械表日历偏了怎么办 子宫内膜异位痛经怎么办 凉着了坏肚子怎么办 昆虫叮咬后疼痛起水泡怎么办 每次来月经都痛经怎么办 人左肩的灯灭了怎么办 香港超过7天了怎么办? 手机拍完照图像是倒的怎么办 地下城金币邮寄卡了怎么办 wow7.3打团本卡怎么办 上古卷轴5出bug怎么办 苹果手机打游戏太卡怎么办 梦幻将军令换了怎么办 手机丢了将军令怎么办 大军之印放弃了怎么办 联想一体机进入界面就死机怎么办 nmd袜子鞋露脚趾怎么办 生意不顺意志崩溃了怎么办 笔记本突然卡住不动了怎么办 指定货代费用高怎么办 空运舱单上的收货人错了怎么办? 被诚信贷骗了怎么办 原户主不迁户口怎么办 二手房原房主没迁走怎么办 办退工没有就失业证怎么办 消防队教导员插手商场翘柜台怎么办 调动工作原单位领导不放人怎么办 脚碰了一下肿了怎么办