python笔记之中缀语法和管道实现
python笔记之中缀语法和管道实现
你知道什么是中缀语法吗?你知道python中的中缀操作是什么吗?那你知道操作python也是可以像unix的管道符一样方便吗?那么,废话不说了,直接上代码。
class Pipe(object):
def __init__(self, function):
self.function = function
def __ror__(self, other):
return self.function(other)
def __call__(self, *args, **kwargs):
return Pipe(lambda x: self.function(x, *args, **kwargs))
Julien Palard 大神十分的抱歉,直接附上了您的代码,希望您不要介意。
在上面的代码中__ror__就是我们python中看到的或操作符,在这里代码重载了或操作符,然后把它变成我们梦寐以求的管道操作符,十分的犀利,我很喜欢。我实在是忍不住想发表一下我的见解,谈谈我对这段代码的认识,如有错误,请扔鸡蛋。
一个例子
@Pipe
def take(iterable, qte):
"Yield qte of elements in the given iterable."
for item in iterable:
if qte > 0:
qte -= 1
yield item
else:
return
@Pipe
def add(x):
return sum(x)
这是大神代码中一个take函数的实现,意思是得到一个序列的前qte个值的迭代器,add函数我就不废话了。然后我们来运行一个栗子吧。
一个参数的情况
print [1,2,3,4] | add #10,答案是毫无疑问. 但是,为什么呢?Pipe作为add的装饰器,被装饰过add实际上返回的是Pipe的对象,只不过是对象中拥有了这个add方法。那么,列表在执行管道操作的时候,实际上是Pipe对象调用了__ror__方法,列表参数传给了__ror__.返回值也就是__ror__函数的返回值.
那么请看多参数情况是怎样的吧?
[1,2,3,4] | take(2) #答案返回的是包含1,2的迭代器。那么,带参数和不带参数到底有什么不一样的呢?上面我说过,add函数实际上就是一个Pipe的实例,而在这里也不例外,take函数也是Pipe的一个实例,既然take是一个对象,那么它为什么可以在后面加上一个括号呢?哈哈,很简单,因为__call__函数重载了括号操作符,如果一个类中实现了这个方法,那么该类的对象可以像函数那样使用,然后调用__call__方法,所以take(2)实际上是调用了Pipe的__call__方法,然后又返回了一个新的Pipe实例,接下来就和上面的add一样了。
最后附上Julien Palard大神的github吧
python笔记之中缀语法和管道实现的更多相关文章
- Python:笔记(1)——基础语法
Python:笔记(1)——基础语法 我很抱歉有半年没有在博客园写过笔记了,客观因素有一些,但主观原因居多,再多的谴责和批判也都于事无补,我们能做的就是重振旗鼓,继续出发! ——写在Python之前 ...
- python笔记1,语法,函数,类和实例,异常
>>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23) '1.23' >>& ...
- Python笔记_初级语法
1.标识符与变量 1.1 标识符 规范 只能由数字,字母,_(下划线)组成 不能以数字开头 不能是关键字 区分大小写 命名约束 下划线分隔法(推荐): 多个单词组成的名称,使用全小写字母书写,中间使用 ...
- python学习笔记——multiprocessing 多进程组件 Pipe管道
进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- python笔记 - day7
python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...
- python笔记 - day3
python笔记 - day3 参考:http://www.cnblogs.com/wupeiqi/articles/5453708.html set特性: 1.无序 2.不重复 3.可嵌套 函数: ...
- python笔记之调用系统命令
python笔记之调用系统命令 目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数, ...
随机推荐
- 安装完Apache和PHP之后访问PHP文件页面提示下载而没有解析 解决办法
装好LAMP环境后,还要做下整合Apache与PHP相关配置,在apache配置文件里找到:AddType application/x-gzip .gz .tgz在该行下面添加AddType appl ...
- 【好程序员笔记分享】——Cocoapods集成
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ Xcode集成POD教程 准备工作: 首先我们要在我们的电脑中安装POD,进入命令行,输入如下指令 sudo ...
- 递归实现全排列序列C语言实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用递归回溯的办法,采用C语言实现了全排列序列,用以某些优化方案的原始方案的给定 #incl ...
- [Codeforces Round #186 (Div. 2)] B. Ilya and Queries
B. Ilya and Queries time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Winform(C#)限制程序只运行一个实例
C#控制只运行开启一个程序 在这个例子中不需要调用ReleaseMutex,mutex会在程序结束时自动释放.为了防止mutex过早释放,在程序的最后调用下GC.KeepAlive (mutex). ...
- logstash 防止实际处理时间跟事件产生时间略有偏差
"message" => " 10.168.255.134 [12/Sep/2016:16:30:40 +0800] \"GET /resources/p ...
- 【转】【Android】HAL分析
原文网址:http://www.cnblogs.com/lcw/p/3335505.html HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. An ...
- 【转】Android 4.0.3 CTS 测试
原文网址:http://blog.csdn.net/zxm317122667/article/details/8508013 Android-CTS 4.0.3测试基本配置 1. Download C ...
- mysql 中文配置(转)
Dos下连接mysql后,运行一下几项就可以插入中文了: SET character_set_client = gbk; SET character_set_connection = gbk; SET ...
- Roman to Integer && Integer to Roman 解答
Roman Numeral Chart V:5 X:10 L:50 C:100 D:500 M:1000 规则: 1. 重复次数表示该数的倍数2. 右加左减:较大的罗马数字右边记上较小的罗马数字,表示 ...