章节
问答
课签
笔记
评论
占位
占位

Python类的数学运算

事实上,Python很多的操作都是通过内建函数来实现的,比如最熟悉的加减乘除,都是通过内建函数来实现的,分别是__add____sub____mul____truediv__。因此,只要我们的自定义类实现了相关的内建函数,我们的类对象,也可以做到加减乘除。
对于有理数,我们可以使用Rational类来表示:

​class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q

其中,p、q 都是整数,表示有理数 p/q。
如果要让Rational进行加法运算,需要正确实现__add__:

class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q
    def __add__(self, r):
        return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
    def __str__(self):
        return '{}/{}'.format(self.p, self.q)

定义好后,就可以尝试一下有理数的加法了:

>>> r1 = Rational(1, 2)
>>> r2 = Rational(2, 3)
>>> print(r1 + r2)
7/6

需要注意__add__()函数,它有一个参数,表示的是运算的第二个操作数,比如:r1 + r2,那么在__add__()方法中的参数,r指的就是r2,这个参数是运算符重载的时候传递的。
另外,细心的同学可能注意到了,相比加减乘的特殊方法,除法的特殊方法名字较长
__truediv__,并且含有true这样的描述,这其实和Python除法是有关系的。
Python的除法可以分为地板除(你没看错,就是地板)和普通除法,地板除的特殊方法是
__floordiv__,普通除法是__truediv__
地板除法和普通除法不一样,地板除法的结果只会向下取整数

>>> num = 5
>>> num.__truediv__(3)
1.6666666666666667
>>> num.__floordiv__(3)
1 # 向下取整
>>> num = 7
>>> num.__floordiv__(3)
2

在运算中,普通除法使用/表示,而地板除使用//表示。

>>> 5 / 3
1.6666666666666667
>>> 5 // 3
1

任务

Rational类虽然可以做加法,但无法做减法、乘法和除法,请继续完善Rational类,实现四则运算。

 

?不会了怎么办

请在本地编写代码练习

参考答案:

def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)

class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q
    def __add__(self, r):
        return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
    def __sub__(self, r):
        return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
    def __mul__(self, r):
        return Rational(self.p * r.p, self.q * r.q)
    def __truediv__(self, r):
        return Rational(self.p * r.q, self.q * r.p)
    def __str__(self):
        g = gcd(self.p, self.q)
        return '{}/{}'.format(int(self.p/g), int(self.q/g))

r1 = Rational(1, 2)
r2 = Rational(1, 5)
print(r1 + r2)
print(r1 - r2)
print(r1 * r2)
print(r1 / r2)
||
1
2
# Enter a code
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
提交
重置代码
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布

最新回答 / 時頌望見
7/103/101/105/2[Done] exited with code=0 in 0.069 seconds没问题啊,可以正常运行,你复制的时候漏了啥吧

最赞回答 / 土斤土斤
 r1 = Rational(1, 2) 这里是调用了Rational类的__init__方法创建了一个实例,然后将这个实例赋予给了r1;<...code...>这是调用了r1这个实例的__add__方法,self是指实例本身也就是r1,而r这个参数就是指代r2,下文两个语句是等价的<...code...>从这地方引申出来,假设还有一个r3,那程序是怎么跑的呢<...code...>程序会先算r1+r2,然后再用这个算出的结果x去+r3

最赞回答 / 慕函数7599421
假如<...code...>你可以推算def gcd(a, b)的过程(类似于for循环),得到两个数的最大公约数为3,这个3会在最终的结果中作为分母被除掉。没有没有def gcd(a, b)函数,那么我们得到的最终结果会有3/6,4/8这样的结果。

最新回答 / 不惧亢龙
r是另一个有理数

最新回答 / 慕妹6092760
第二个参数r2的分子。两个分数a/b和c/d相加等于(a*d+b*c)/b*d,r.p、r.q就相等于前面的c和d

最新回答 / 棹孤舟
懂了懂了,是用来对最后结果进行化简的

最新回答 / 慕丝8731815
不会。当你执行r1 = Rational(1, 2)时,只是创建了一个Rational类的实例,并将其赋值给变量r1。这行代码并不会直接调用__add__方法。__add__方法只有在你使用+运算符来对r1和另一个Rational对象进行相加时才会被调用。例如,当你执行r1 + r2时,__add__方法会被自动调用来执行加法操作。

最新回答 / wwbbyy
就是化简啊,比如 4/6 ,化简就是 2/3 。打印的时候你说是 4/6还是打印2/3好?

最新回答 / ChaosYX
import sysprint(sys.version)可以查看python版本不是3.X哦下载视频          

最新回答 / 慕哥2041944
意思是返回的是一个Rational对象

最新回答 / isBlackNico
外部自定义了一个函数, 类里面再调用的

最新回答 / 不做实力派的型男不改昵称
add,sub,mul,truediv这几个缩写单词的中文了解下就知道为啥了,起名不是没依据的

已采纳回答 / Zobeltitz
首先调用add函数实在创建Rational类之后的,所以在调用这个函数的时候Rational已经创建完了,不会出现问题Rational()是创建一个Rational类型的对象,调用的是__init__构造方法,这个函数返回一个Rational类型的对象,这个对象是运算结果
全部 我要发布
最热 最新
只看我的

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

账号登录 验证码登录

遇到问题
忘记密码

代码语言