查看原文
其他

如何在 Python 中用中文做数学运算?

Python猫 2019-10-30

以下文章来源于未闻Code ,作者kingname

👆 点击上方蓝字“Python猫”,免费获得一个公众号

花下猫语:在 Python 中是否可以实现中文数字的四则运算呢?答案是肯定的。今天分享的文章,会对这个问题给出令人满意的解答。这个操作可能不会被大家用于实际的项目中,它的意义并不在此。之所以分享这篇文章,一方面是我觉得这个问题有点意思,另一方面则是因为它的实现过程很好地讲解了几个魔术方法的用途。

本文转载自“未闻Code”,这是个少有的坚持优质原创的公众号,它的“一日一技”系列,写了很多体量小却有意思的话题,推荐一读。

图 | 宫崎骏电影《侧耳倾听》

在Python 3里面,中文是可以作为变量名的,而运算符又可以重载,基于这两个特性,我们可以实现阿拉伯数字与中文数字的四则运算。

首先我们定义一个类 Num:

  1. class Num(object):

  2. def __init__(self, n):

  3. self.n = n


  4. def __repr__(self):

  5. return self.n


  6. def __str__(self):

  7. return str(self.n)

然后把这个类初始化为各个中文数字:

  1. 一 = Num(1)

  2. 五 = Num(5)

  3. 八 = Num(8)

运行效果如下图所示:

代码里面,通过实现 __repr__,能实现在 Jupyter 或者Python命令行交互环境里面输入变量名回车就显示变量的值。

通过实现 __str__,能实现在Python 里面 print(变量)的时候打印出具体的值。

但现在还不够,当我们进行四则运算的时候,会报错:

为了能够正常实现 +1,我们需要实现 __add__方法:

  1. class Num(object):

  2. def __init__(self, n):

  3. self.n = n


  4. def __repr__(self):

  5. return str(self.n)


  6. def __str__(self):

  7. return str(self.n)


  8. def __add__(self, x):

  9. return self.n + x

运行效果如下图所示:

但是,如果我们把加号两侧的数字兑换一下,代码又报错了,如下图所示:

这是由于,当我们执行 a+b的时候,Python会调用 a对象里面的 __add__方法,所以当我们执行 +1的时候,调用的是 里面的 __add__方法,这是我们自己写的,所以能够正常运行。

但是当我们执行 1+的时候,调用的是 1里面的 __add__方法。在Python里面,数字对象里面的 __add__方法只能实现数字加数字。

但是我们不能修改Python 内置数字的 __add__方法,所以我们需要使用 __radd__方法。它的作用是,在 1+执行的时候,如果 1里面的 __add__运行失败了,那么就会调用 里面的 __radd__

  1. class Num(object):

  2. def __init__(self, n):

  3. self.n = n


  4. def __repr__(self):

  5. return str(self.n)


  6. def __str__(self):

  7. return str(self.n)


  8. def __add__(self, x):

  9. return self.n + x


  10. def __radd__(self, x):

  11. return self.n + x

运行效果如下图所示:

同样的原理,你可以自己实现减法 __sub__/__rsub__、乘法 __mul__/__rmul__和除法 __truediv__/__rtruediv__


文章分享完了,最后是随机荐书环节。我会根据文章内容,提出一个关键词(这篇是“数学”)来搜索,随机选择一本技术书推荐给大家,如果你感兴趣的话,可以点击链接进行了解。希望能给大家带来不经意的收获~~

推荐下面的精选文章

1

为什么 C 语言仍然占据统治地位?

2

当谈论迭代器时,我谈些什么?

3

GIL 已经被杀死了么?

4

Python 工匠:使用装饰器的技巧

大方告诉朋友们,我在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存