专栏首页Python无止境如何在 Python 中用中文做数学运算?

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

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

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

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

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

首先我们定义一个类 Num:

class Num(object):
    def __init__(self, n):
        self.n = n

    def __repr__(self):
        return self.n

    def __str__(self):
        return str(self.n)

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

一 = Num(1)
五 = Num(5)
八 = Num(8)

运行效果如下图所示:

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

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

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

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

class Num(object):
    def __init__(self, n):
        self.n = n

    def __repr__(self):
        return str(self.n)

    def __str__(self):
        return str(self.n)

    def __add__(self, x):
        return self.n + x

运行效果如下图所示:

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

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

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

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

class Num(object):
    def __init__(self, n):
        self.n = n

    def __repr__(self):
        return str(self.n)

    def __str__(self):
        return str(self.n)

    def __add__(self, x):
        return self.n + x

    def __radd__(self, x):
        return self.n + x

运行效果如下图所示:

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


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

本文分享自微信公众号 - Python猫(python_cat)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​Python 之父的解析器系列之三:生成一个 PEG 解析器

    声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议。为便于阅读,内容略有改动。

    Python猫
  • Python 之父再发文:构建一个 PEG 解析器

    花下猫语:Python 之父在 Medium 上开了博客,现在写了两篇文章,本文是第二篇的译文。前一篇的译文 在此 ,宣布了将要用 PEG 解析器来替换当前的 ...

    Python猫
  • 用 Python 实现简易 Web 服务器

    花下猫语:上篇文章推荐了一本神书《500 Lines or Less》(点此阅读),有几位读者留言问是否有中文版。很遗憾,还没有。不过我在文中也说了,Githu...

    Python猫
  • 使用ReactiveCocoa开发RSS阅读器

    目前已经完成的功能有对RSS的解析和Atom解析,RSS内容本地数据库存储和读取,抓取中状态进度展示,标记阅读状态,标记全部已读等。这些功能里我对一些异步操作产...

    用户7451029
  • python:爬取百度贴吧内容

    用户1215343
  • 一日一技:在Python中实现阿拉伯数字加上中文数字

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

    青南
  • 使用PyQt5实现图片查看器的示例代码

    在学习 PyQt5 的过程中我会不断地做一些小的 Demo,用于让自己能够更好地理解和学习,这次要做的就是一个图片查看器,主要功能包括打开图片、拖动图片、放大和...

    砸漏
  • day23 03 组合的例子

    对象=类名()----实例化过程:创建了一个self对象,执行_init_方法初始化,返回self对象给外部

    py3study
  • 用 Python 写个坦克大战

    坦克大战是一款策略类的平面射击游戏,于 1985 年由 Namco 游戏公司发布,尽管时至今日已经有了很多衍生类的游戏,但这款游戏仍然受到了相当一部分人的欢迎,...

    纯洁的微笑
  • python 爬虫示例--基金查询demo

    这两天试着学了一下爬虫,刚学会了爬取静态网页,就趁热现学现卖,做了一个基金查询的demo。

    用户6021899

扫码关注云+社区

领取腾讯云代金券