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位的二进制数, ...
随机推荐
- python安装——Windows平台
刚刚申请博客,第一次写随笔,记录下自己最近的学习情况,希望自己能够不断的学习,不断的丰富自己~ 最近刚开始学python,记录一下,希望大家相互学习,批评指正~ 1.下载python:https:// ...
- ACM ICPC Team
Link: https://www.hackerrank.com/challenges/acm-icpc-team/submissions/code/11617807 def count_max_to ...
- centos在安装apache2.4版本的时候遇到ARP not found解决办法
今日编译apache时出错: #./configure --prefix……检查编辑环境时出现: checking for APR... noconfigure: error: APR not fou ...
- c++第三天
今天完成的事情: [主线] 1.复习了一下昨天的内容 while(std::cin >> value) 扫描[标准输入] 2.在网上下载Sales_item.h 代码如下 #ifndef ...
- nodeclub 学习记录
源码地址:https://github.com/cnodejs/nodeclub 按照 它的步骤 在系统中跑没有出错,但是注册后没有发送邮件验证码,我将 controller层下面的sign.js 的 ...
- 开心菜鸟系列学习笔记------javascript(5)
一.this的关系 1)全局代码中的this 2)函数代码中的this在函数代码中使用this时很有趣,这种情况很难且会导致很多问题. 这种类型的代码中,this值的首要特点(或许是最主要 ...
- jquery 替换元素函数
1.replaceWith()使用括号内的内容替换所选择的内容.$("#div").replaceWith("<div id="div2"> ...
- JMXMP SSL
http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html http://docs.oracle.com/c ...
- 利用PartialView返回HTML模型视图
- syslog-ng-3.5.6把容器的单核cpu跑满
Question 最近,偶然,会有人说,其docker容器中syslog-ng把cpu跑满,使用perf,mpstat,strace工具看到是syslog-ng在内核态cpu使用率很高,怀疑是某个系统 ...