受这位小哥(https://github.com/czheo/syntax_sugar_python)的启发,我照着它的 Usage 实现了一部分语法糖。

1. compose

实现compose函数,满足如下操作:

f = lambda x: x**2 + 1
g = lambda x: 2*x - 1
h = lambda x: -2 * x**3 + 3fgh = compose(f, g, h)
# equivalent to `f(g(h(n)))`
print fgh(5) # 245026

我们可以让compose返回一个函数,这个函数倒序遍历compose中的参数,并对输入参数调用该参数。

def compose(*args):def retFunc(x):i = len(args) - 1while i >= 0:func = args[i]assert(func.__call__)x = func(x)i -= 1return xreturn retFunc

2. composable

实现composable函数,满足如下操作:

@composable
def add2(x):return x + 2@composable
def mul3(x):return x * 3@composable
def pow2(x):return x ** 2fn = add2 * mul3 * pow2
# equivalent to `add2(mul3(pow2(n)))`
print fn(5) # 77

composable函数接受一个函数,返回一个封装后的东西让其可以通过*来复合。那我们就创建一个类来封装这些东西好了。

class Composable(object):def __init__(self, *args):object.__init__(self)for f in args:assert(f.__call__)self.func = argsdef __call__(self, x):i = len(self.func) - 1while i >= 0:func = self.func[i]assert(func.__call__)x = func(x)i -= 1return xdef __mul__(self, rv):assert(isinstance(rv, Composable))return Composable(*(self.func + rv.func))composable = Composable

3.infix

实现infix,满足:

@infix
def plus(a, b):return a + bprint 1 /plus/ 2
# equivalent to `plus(1, 2)`
print 1 /of/ int
# equivalent to `isinstance(1, int)`
print 1 /to/ 10
# equivalent to `range(1, 11)`

我们可以看到,infix函数接受一个函数,并把这个函数变成中缀。of可以看做isinstance的中缀,to可以看做range的中缀(需要微调)。

我们先把后两个定义出来:

of = infix(isinstance)
to = infix(lambda x, y: range(x, y + 1))

然后实现infix

class Infix(object):def __init__(self, f):object.__init__(self)assert(f.__call__)self.func = fself.set = Falsedef __rdiv__(self, i):assert(not self.set)r = Infix(self.func)r.set = Truer.left = ireturn rdef __div__(self, t):assert(self.set)r = self.func(self.left, t)self.set = Falsereturn rdef __call__(self, *args, **kwargs):return self.f(*args, **kwargs)infix = Infix

几个 Python 语法糖的实现相关推荐

  1. python语法糖是什么_Python语法糖Syntactic Sugar

    语法糖(Syntactic sugar): 计算机语言中特殊的某种语法 这种语法对语言的功能并没有影响 对于程序员有更好的易用性 能够增加程序的可读性 简而言之,语法糖就是程序语言中提供[奇技淫巧]的 ...

  2. python语法糖怎么用_Python中语法糖及带参语法糖

    在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的. def d(f): print('d...') k=f #此处保留了传进来的原函数 f ...

  3. 黄哥通过代码来说明:python语法糖

    2019独角兽企业重金招聘Python工程师标准>>> 下面用一个例子来说明: #coding:utf-8 """ foo = decorator(fo ...

  4. python语法糖是什么意思_python语法糖是什么

    语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添 ...

  5. 【Python】一道题吃够Python语法糖

    题目如下: 大郎,吃糖~ class Solution:def nextGreatestLetter(self, letters: List[str], target: str) -> str: ...

  6. Python语法糖——遍历列表时删除元素

    Python的for可以遍历一个List,但是在遍历的过程中删除元素常常会得到意想不到的结果甚至程序出现异常,例如: lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0 ...

  7. Python语法糖之:列表解析、集合解析和字典解析

    ☆ NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞测序分析 (重磅综述:三万字长 ...

  8. python语法糖 -- 列表正负数的排序

    有这样一个列表: lst = [1, -2, 10, -12, -4, -5, 9, 2] 现在要求:将列表进行排序,正数在前,负数在后,并且分别按绝对值从小到大,要求的输出结果是: [1, 2, 9 ...

  9. python语法糖的本质_科学网—Python语法糖之:列表解析、集合解析和字典解析 - 陈同的博文...

    Python的列表解析 (list comprehensions)是在Python 2.0以来一直都有的功能,特别简洁.实用.而字典解析虽然曾经在Python 2.3版本中引入过,但后来因为与dict ...

最新文章

  1. 媒体行业注册什么企业邮箱比较好?
  2. 不同包下,相同数据结构的两个类进行转换
  3. Redhat5虚拟系统安装VmwareTools
  4. Linux磁盘怎么备份,Linux的硬盘分区表备份与还原
  5. android 模拟器
  6. Code Snippets
  7. CSDN编程挑战——《-3+1》
  8. lightbox自定义图片大小的实现
  9. 《CATIA V5 从入门到精通(第二版)》——2.5 草绘可视化设置(Visualization)
  10. 『总结』CSS/CSS3常用样式与web移动端资源
  11. 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径1...
  12. .NET Core 获取 Request/Headers 等信息
  13. linux服务之irqbalance
  14. word表头宽行重复
  15. 财务系统 定制开发案例
  16. .强力卸载或者删除文件
  17. ubuntu16.04编译ORBSLAM2问题解决
  18. origin作统计图(两个x正轴,一个y轴效果)
  19. 笔记——51控制DS18B20温度控制篇章之终章温度报警
  20. 计算机属性显示缩略图 桌面样式变了,Win7任务栏缩略图预览变成列表预览怎么解决?...

热门文章

  1. java stream 多个filter_恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑...
  2. cv2 orb 图像拼接_OpenCV 实现多张图像拼接
  3. 现在好用的mysql客户端_还在用 Navicat 的,可以试试这几款免费且好用的 MySQL 客户端...
  4. 【百家稷学】深度学习与计算机视觉核心理论与实践(中国地质大学实训)
  5. 【NLP】如何利用BERT来做基于阅读理解的信息抽取
  6. 【知识星球】有没有网络模型是动态变化的,每次用的时候都不一样?
  7. 全球及中国凝胶植入物市场专项调研与供需现状分析报告2022年
  8. 中国K12教育行业运营动向及未来发展战略分析报告2022年版
  9. 全球及中国矢量超导磁体行业“十四五”竞争状况及投资前景策略分析报告2021-2027年版
  10. how to fix error 25007 : loadlibraryshim()