1.偏函数partial
偏函数的作用类似装饰器,它可以在不改变原有函数的基础上,扩展函数的功能。在频繁调用某个函数时,某些参数是已知的固定值,如果不想每次都传入,可以利用partial来扩展这个函数。例如我们想要对一些数字求和,在求和的结果上再加100,那么常用的办法可以这么写:
def add(*args): |
但是如果我们想要修改固定值100,那么就得改变add
这个函数,下面使用partial实现:
from functools import partial |
可以看到我们使用以原函数add
、固定值
作为参数,传入parital类,返回了一个新函数,这样在调用新函数时,就不需要再传入固定值了。偏函数接收三个参数,它们可以扩展和覆盖原函数的参数:func
需要被扩展的函数*args
需要被固定的位置参数**kwargs
需要被固定的关键字参数
类func = functools.partial(func, *args, **keywords) |
2.管道符 |
python中的管道符 | 用于逻辑运算或
,它是通过内置魔法方法__ror__
来实现的,因此我们可以重写这个方法来实现想要的效果。下面的例子中,我们重写的类A的__ror__
方法,返回的是它接收的参数other
和100的和,
可以看到,在执行1 | A()
时,实际上是以1作为参数传入了A()实例的__ror__
方法,这个语句的返回值就是__ror__
方法的返回值
class A: |
3.用Python实现shell命令中的管道
python中的管道符通常使用在逻辑或的运算,如果要实现类似shell命令中的管道,就可以利用上面提到的偏函数以及重写__ror__
方法,这个思路来自于v2ex
上网友的分享,原贴地址:
https://www.v2ex.com/t/743574#reply112
下面是代码示例:
from functools import partial |
可以看到,这里是继承了python的partial类,并重写了其__ror__
方法,那么在执行(1, 2, 3, 4) | F(filter)
时,就会以(1,2,3,4)为参数传入__ror__
方法,在这个方法里面,self
指向的是F(filter)
这个对象。那么这个对象是什么呢,在第一节中我们知道,它实际上是一个扩展了filter
函数的新函数,只不过这里没有额外传入其他参数也就没有进行扩展,因此self(*other)
实际上是执行了filter(*other)
, 其结果就是[2, 4],这个结果又会作为参数传入F(add)
中,最终执行了add(*[2, 4])
。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!