引言
大家好,又是我,你们的莉莉丝。这次我们研究的是,如何用Python实现,形如:
log[a](b)
这样的式子。看过我之前发的几篇文章的读者可能已经开始思考魔术方法了。虽然的确可以用魔术方法解决,不过,这次的问题有一个更加合乎常理的方法。大家可以看一下这个式子的形式。在Python中,这个的意思是对一个函数列表log的索引为a的值调用函数,参数为b。没错,这也就是最基本的原理。接下来是第一种实现方法
函数列表
import math
log = [lambda x, b=b: math.log(x, b) for b in range(11)]
实现起来并不困难,就是用列表推导式写一个表达式列表而已。这里向math借了一个log函数,所以要import一下。要说明的是,之所以用lambda表达式而不用def函数是因为lambda可以“批量生产”。不然定义这么多个函数然后全写在数组里还是有点麻烦的。
当然,这个东西是不全面的。聪明的读者已经发现了,这个数组也只是实现了整数基数而已。完全不够用嘛!
当然,你可以使用字典和lambda表达式来定义特定的小数,但是这还是不够用啊!所以,笔者又回归了她的老本行——魔术方法。
魔术方法 索引和调用
这次我们要用到的是索引__getitem__和调用__call__这俩个魔术方法,getitem可以让我们重构[]运算符,而call可以让我们重构调用函数的运算符,具体原理就是通过getitem获得索引保存到实例中,然后用call调用即可。以下是代码:
class Log:
log = 10
def __getitem__(self, other):
self.log = other
return self
def __call__(self, other):
return math.log(other, self.log)
log = Log()
print(log[2](2))
基于这个思路,我们可以实现其他的诸如pow[2](2)之类的方法。读者可以自己尝试一下。我们下期再见~