Python中对象的行为是由它的类型 (Type) 决定的。所谓类型就是支持某些特定的操作。数字对象在任何编程语言中都是基础元素,支持加、减、乘、除等数学操作。

Python的数字对象有整数和浮点数,支持各种数学操作,比如+, -,*, /等。 没有这些操作符,程序中只能使用函数调用的方式进行数学运算,比如add(2, 3), sub(5, 2)。

程序中操作符的作用与普通数学操作的用法是一致的,使用中更加简便直观。Python中,这些操作符实现是通过定义一些object的特殊方法实现的,比如object.__add__()和object.__sub__()。如果用户在自己定义类时实现上述特殊方法,可以使自定义类的对象支持相应的数学操作,从而模拟数字对象的行为。这其实是达到了操作符重载的效果。

这里通过实现一个具有支持加法运算的中文数字类说明如何在Python中实现一个支持常见的数学操作。ChineseNumber类的基本定义如下。

1

2

3

4

5

6

7

8

9

10

11

12

class ChineseNumber:

def __init__(self, n):

self.num= n

self.alphabet= [u'零', u'一', u'二', u'三', u'四',

u'五', u'六', u'七', u'八', u'九', u'十']

def __str__(self):

sign= '负' if self.num <0 else ''

return sign+ ''.join([self.alphabet[int(s)]for sin str(abs(self.num))])

def __repr__(self):

return self.__str__()

目前,实现的效果是这样的:

1

2

3

4

5

6

>>> a= ChineseNumber(2)

>>> a#调用a.__repr__()

>>>print(a)#调用a.__str__()

一般数学操作符

定义类时,实现__add__()方法,可以给这个类增加+操作符。给ChineseNumber增加如下方法:

1

2

3

4

5

6

7

def __add__(self, other):

if type(other)is ChineseNumber:

return ChineseNumber(self.num+ other.num)

elif type(other)is int:

return ChineseNumber(self.num+ other)

else:

return NotImplemented

这时ChineseNumber的对象就可以使用+了。

1

2

3

4

5

6

7

>>> a, b= ChineseNumber(2), ChineseNumber(10)

>>> a+ b

十二

>>> a+ 5

>>> a+ 3.7

TypeError: unsupported operandtype(s)for +:'ChineseNumber' and 'float'

对于+,a + b相当于调用a.__add__(b). 类似地,可以定义其他数学操作符,见下表。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

object.__add__(self, other):+

object.__sub__(self, other):-

object.__mul__(self, other):*

object.__matmul__(self, other): @

object.__truediv__(self, other):/

object.__floordiv__(self, other)://

object.__mod__(self, other):%

object.__divmod__(self, other):divmod,divmod(a, b)= (a/b, a%b)

object.__pow__(self, other[,modulo]):**,pow()

object.__lshift__(self, other): <<

object.__rshift__(self, other): >>

object.__and__(self, other): &

object.__xor__(self, other): ^

object.__or__(self, other): |

操作数反转的数学操作符 (Reflected/Swapped Operand)

1

2

>>>2 + a

TypeError: unsupported operandtype(s)for +:'int' and 'ChineseNumber'

2是整数类型,它的__add__()方法不支持ChineseNumber类的对象,所以出现了上述错误。定义操作数反转的数学操作符可以解决这个问题。给ChineseNumber类添加__radd__()方法,实现操作数反转的+运算。

1

2

def __radd__(self, other):

return self.__add__(other)

对于a + b,如果a没有定义__add__()方法,Python尝试调用b的__radd__()方法。此时,a + b相当于调用b.__radd__(a)。

1

2

3

>>> a= ChineseNumber(2)

>>>2 + a

类似地,可以定义其他操作数反转的数学操作符,见下表。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

object.__radd__(self, other): +

object.__rsub__(self, other): -

object.__rmul__(self, other): *

object.__rmatmul__(self, other): @

object.__rtruediv__(self, other): /

object.__rfloordiv__(self, other): //

object.__rmod__(self, other): %

object.__rdivmod__(self, other): divmod, divmod(a, b) = (b/a, b%a)

object.__rpow__(self, other[,modulo]): **, pow()

object.__rlshift__(self, other): <<

object.__rrshift__(self, other): >>

object.__rand__(self, other): &

object.__rxor__(self, other): ^

object.__ror__(self, other): |

运算赋值操作符

运算赋值操作符使用单个操作符完成运算和赋值操作,比如a += b相当于调用a = a + b。为ChineseNumber增加__iadd__()方法,可以实现+=操作符。

1

2

3

4

5

6

7

8

9

def __iadd__(self, other):

if type(other)is ChineseNumber:

self.num+= other.num

return self

elif type(other)is int:

self.num+= other

return self

else:

return NotImplemented

此时,

1

2

3

4

5

6

7

>>> a, b= ChineseNumber(2), ChineseNumber(10)

>>> a+= b

>>> a

十二

>>> a+ 7

>>> a

十九

类似地,可以定义其他运算赋值操作符,见下表。

1

2

3

4

5

6

7

8

9

10

11

12

13

object.__iadd__(self, other):+=

object.__isub__(self, other):-=

object.__imul__(self, other):*=

object.__imatmul__(self, other): @=

object.__itruediv__(self, other):/=

object.__ifloordiv__(self, other)://=

object.__imod__(self, other):%=

object.__ipow__(self, other[,modulo]):**=

object.__ilshift__(self, other): <<=

object.__irshift__(self, other): >>=

object.__iand__(self, other): &=

object.__ixor__(self, other): ^=

object.__ior__(self, other): |=

一元数学操作符

一元数学操作符是只有一个操作数的运算,比如取负数的操作符-。-对应的特殊函数是__neg__()。为ChineseNumber添加__neg__()方法,

1

2

def __neg__(self):

return ChineseNumber(-self.num)

此时,ChineseNumber对象就支持-操作了。

1

2

3

>>> a= ChineseNumber(5)

>>>-a

负五

其他一元运算符见下表。

1

2

3

4

5

6

7

8

9

object.__neg__(self): -

object.__pos__(self): +

object.__abs__(self): abs()

object.__invert__(self): ~

object.__complex__(self): complex()

object.__int__(self): int()

object.__float__(self): float()

object.__round__(self): round()

object.__index__(self): operator.index()

python中mod运算符_Python中的数学运算操作符使用进阶相关推荐

  1. python中mod运算符_Python中的取模运算方法

    所谓取模运算,就是计算两个数相除之后的余数,符号是%.如a % b就是计算a除以b的余数.用数学语言来描述,就是如果存在整数n和m,其中0 <= m < b,使得a = n * b + m ...

  2. Python中的数学运算操作符使用进阶

    原文链接:https://www.jb51.net/article/86988.htm 这篇文章主要介绍了Python中的数学运算操作符使用进阶,也包括运算赋值操作符等基本知识的小结 Python中对 ...

  3. python中的运算符_Python中的运算符

    说完常用的数据类型,再来说下运算符.运算符用于将各种类型的数据进行运算,让静态的数据跑起来. 编程语言中的运算大致分为以下几个大类: 算术运算, 用于加减乘除等数学运算 赋值运算,用于接收运算符或方法 ...

  4. python中的运算符_Python 中的神秘运算符

    今天我们来讲讲 Python 里一个不为众人所知的运算符.你可能会觉得疑惑:还有我不知道的运算符?别急着下结论,先往下看看再说. 在 Python3.5 中通过 PEP465https://www.p ...

  5. python中基本运算符_Python中的基本运算符及示例

    python中基本运算符 Operators are symbols which tells the interpreter to do a specific operation such as ar ...

  6. python中mod运算符_Python语言中mod指的是什么

    Python语言中mod指的是什么 发布时间:2020-07-17 11:21:21 来源:亿速云 阅读:255 作者:清晨 小编给大家分享一下Python语言中mod指的是什么,希望大家阅读完这篇文 ...

  7. python中算术运算符_python中的基本算术运算符有哪些

    python中的基本算术运算符有哪些 发布时间:2020-11-16 14:54:33 来源:亿速云 阅读:74 今天就跟大家聊聊有关python中的基本算术运算符有哪些,可能很多人都不太了解,为了让 ...

  8. python中math函数_Python math模块 数学函数教程

    在Python基础教程中,大家都已经了解了Python有很多运算符可以进行一些数学运算,但是要处理复杂的问题是不是所有代码都要自己一行一行的来编写呢? 玩蛇网提醒大家,这个时候,最先想到的就应该是py ...

  9. python中的乘方_python中的乘方

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一,算术运算python中的乘方运算符号为 **,比较特殊. 作为运算符,%表示 ...

最新文章

  1. Go 语言编程 — go-restful RESTful 框架
  2. 对python的认识作文500字_对阅读新认识作文500字
  3. spring自动装配依赖包_解决Spring自动装配中的循环依赖
  4. 萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第四节 PCA与梯度上升 (上)理解篇...
  5. 基于GPT2的中文闲聊机器人/GPT2 for Chinese chitchat
  6. 完整的微服务系统应该包括哪些功能?
  7. 生成xml_freemarker快速生成xml文件
  8. 简易旋转倒立摆设计报告
  9. 用计算机模拟演示样本均值的抽样,计算机模拟演示文稿.ppt
  10. python合并excel工作簿_使用python将excel工作簿工作表合并为一个工作表
  11. macbook linux 双系统,MacBook Air (13-inch, 2017)(8+128G)安装Ubuntu18.04双系统
  12. 【深浅拷贝的实现方式】
  13. java learn 日期
  14. 机器学习(二)——基本术语
  15. 基于Springboot的电商系统开题报告
  16. 单目影像3D化与立体匹配
  17. 一个简单检索系统的实现思想
  18. teamspeak3服务器搭建_搭建TeamSpeak语音服务器
  19. 端午节安康--诸佬在我心里越来越粽要了
  20. 艾媒报告-2020H1中国宠物经济运行现状与发展趋势研究报告深度行业报告

热门文章

  1. android 虚线
  2. Android 手机卫士--自定义组合控件构件布局结构
  3. 局部内部类访问方法中的局部变量为什么加final
  4. 网络故障排除连载之一:常用排除方法综述
  5. js 设计模式与继承学习
  6. C# 中的委托和事件(1)
  7. C#下如何实现服务器+客户端的聊天程序
  8. ASP.NET虚拟主机安全漏洞解决方案
  9. linux统计文件的个数
  10. 树莓派python3_树莓派4没有python3怎么办