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

news/2024/7/7 21:44:08

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()


http://lihuaxi.xjx100.cn/news/293694.html

相关文章

idea log 不输出error_还在使用console.log()吗?Bunyan:一个简单易用的JS日志框架

Bunyan是一个简单易用的JS日志框架&#xff0c;可以工作在多种环境下&#xff0c;这里以Nodejs为例说明Bunyan的基本用法。是时候替换console.log的写法了。安装npm install --save bunyan使用// hi.jsvar bunyan require(bunyan);var log bunyan.createLogger({name: myapp}…

在Sun Enterprise Server上配置SCSI磁带机

在Sun Enterprise Server上配置SCSI磁带机 不是每一个运行 Solaris Operating System 的地方都拥有备份解决方案的资源&#xff0c;它们甚至不需要这些资源&#xff0c;这些备份解决方案如价格昂贵的磁带自动更换机、磁带库或 Tape Silo。通常所需要的只是根文件系统、重要数据…

使用python对学生表的查询_多表组合查询——Python操作Mysql数据库

前面我们介绍了单张表的查询&#xff0c;包括模糊查询、分组、排序、各种筛选条件等等操作&#xff0c;在实际应用中&#xff0c;查询的数据往往不止局限在一张表里&#xff0c;通常需要多张表在一起进行组合查询&#xff0c;今天我们将会对Mysql当中的多张有关联的表进行组合查…

hive币涨幅空间大吗_空间大、油耗低,家用MPV领域的三款全能好车,你心动了吗?...

汽车行业一直有“金九银十”的说法&#xff0c;眼下正值10月购车黄金季&#xff0c;很多朋友都在考虑入手一辆爱车。对于已经成家立业的小伙伴来说&#xff0c;买车时自然会更关注家庭的用车需求。而汽车作为大宗消费品&#xff0c;置换率低&#xff0c;使用率高&#xff0c;所…

检查当前ORACLE连接数

检查当前ORACLE连接数并写入文件 [oraclerac1 shell]$ cat ip.sh #!/bin/sh date1date %Y%m%d date2"date %Y-%m-%d_%R" ipnumnetstat -antp|grep :1521|awk {print $5}|awk -F":" {print $1}|grep ^[^0]|sort |uniq -c|sort|awk -v a" ${date2…

python tqdm_Python基础 | 一个被忽视的神器tqdm

欢迎点击「算法与编程之美」↑关注我们&#xff01;本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列文章。首先来看一段视频&#xff0c;是不是很酷&#xff1f;日常工作和学习中&#xff0c;经常需要观察当前…

input框选中时如何不出灰框_如何建立学习目标:这个SMART原则,你要了解,家长看懂教给孩子...

作者 | 好看的 原创来川学习方法&#xff0c;学出幸福感点击标题下方“来川学习方法”蓝字关注我经常跟学生们说一句话&#xff1a;学霸都是赢在起跑线上的。这个起跑线指的是什么&#xff1f;早点启蒙、多上补习班、提前把老师要教的内容学一遍&#xff1f;不是。我说的起跑线…

lingo变量无限制版本_java变量必看知识点

点击蓝字关注我们Java 语言是强类型(Strongly Typed)语言&#xff0c;强类型包含以下两方面的含义&#xff1a;所有的变量必须先声明、后使用。指定类型的变量只能接受类型与之匹配的值。这意味着每个变量和每个表达式都有一个在编译时就确定的类型。类型限制了一个变量能被赋的…