首页 > 编程问答 >Python:__add__ 和 +,浮点数和整数的不同行为

Python:__add__ 和 +,浮点数和整数的不同行为

时间:2024-07-25 14:18:17浏览次数:14  
标签:python floating-point integer addition

当将整数值添加到浮点值时,我意识到如果在浮点上调用该方法可以正常工作,例如: __add__ 但如果在整数上调用则不行:

>>> n = 2.0
>>> m = 1
>>> n.__add__(m)
3.0

起初我认为|| | 只是对

>>> m.__add__(n)
NotImplemented

__add__ 类型的实现方式不同(例如 float 类型接受添加到 int 类型,但反之则不然)。然后我注意到,如果我使用 + 运算符,一切都会正常工作: int 有人知道为什么会发生这种情况吗? float

>>> n + m
3.0
>>> m + n
3.0

彼此之间的关系不是很深吗? __add__ and + not deeply related to each other?


你观察到的行为是因为 Python 如何处理不同类型操作数的加法。让我们来分析一下:

  1. __add__ +

你说得对, + 运算符与 __add__ 方法密切相关。当你在表达式 a + b 中使用 + 时,Python 会在内部调用 a.__add__(b)

  1. 浮点数和整数的加法行为

  2. 当你调用 n.__add__(m) ,其中 n 是一个浮点数而 m 是一个整数时,Python 的浮点数类型会执行加法并将结果作为浮点数返回,这符合预期。

  3. 当你调用 m.__add__(n) ,其中 m 是一个整数而 n 是一个浮点数时,Python 的整数类型并“不知道”如何直接与浮点数相加。它会返回 NotImplemented 来表示这一点。

  4. + 运算符的魔法

这也就是 + 运算符的亮点所在。当 Python 遇到 m + n m.__add__(n) 返回 NotImplemented 时,它不会就此止步。相反,它会尝试调用 n.__radd__(m) ,即 反向加法

  1. __radd__ 来拯救

浮点数类型实现了 __radd__ 方法,该方法实质上与 __add__ 方法相同,允许以“反向”顺序进行加法。因此, m + n 会调用 n.__radd__(m) ,它会按预期返回所需的浮点结果。

总而言之:

Python 的 + 运算符提供了 __add__ __radd__ 方法之间的巧妙交互,以处理不同数字类型的混合类型算术。这种机制确保了在可能的情况下加法都能正常工作,即使一个操作数没有实现处理另一操作数类型的加法也是如此。

这种行为不仅限于整数和浮点数;它还适用于其他 Python 类型,从而可以实现灵活且一致的混合类型算术运算。

标签:python,floating-point,integer,addition
From: 38624450

相关文章

  • python中scrapy爬取数据get()与getall()区别
    在使用scrapy进行爬取数据的时候,有些时候需要爬取的是一段文本,或者一个div里面有很多内容,这时候我们就要使用到get()或者getall()来获取数据: get():是获取的满足条件的第一个数据。getall():是获取的满足条件的所有数据。scrapyget()getall()原理在Scrapy中,get(......
  • python—NumPy基础(3)
    文章目录算术函数算术函数的使用算术函数中out参数的使用mod()函数的使用统计函数power()函数的使用median()函数的使用mean()函数的使用函数的使用其他常用函数tile()和repeat()函数的使用roll()函数的使用resize()函数的使用replace()和put()函数的使savetxt()和lo......
  • Python爬虫:代理ip电商数据实战
    引言:数据访问管理引发的烦恼作为一名Python博主,爬虫技能对于获取和分析数据至关重要,经常爬一下,有益身心健康嘛。爬虫技术对很多人来说,不仅仅是一种工具,更像是一种艺术,帮助我们从互联网中,捕捉到有价值的信息。我经常就会用爬虫来爬取一些所需的数据,用来进行数据分析和模型训......
  • python科学计算:加速库numba —— 安装和试用
    安装(anaconda环境下)condainstallnumbaDemo代码:fromnumbaimportjitfromnumpyimportarangeimportnumpyimporttime@jitdefsum2d(arr):M,N=arr.shaperesult=0.0foriinrange(M):forjinrange(N):result+=a......
  • Python - Selenium抓取淘宝直播间评论(可使用无头模式)
    Python-Selenium抓取淘宝直播间评论(可使用无头模式)下面介绍如何使用python中的selenium简单抓取淘宝直播间实时评论。友情提醒,仅供学习交流使用,请勿用于非法用途!一、创建python项目1.在目录下新建main.py和venv虚拟环境:创建虚拟环境:python-mvenvvenv激活虚拟环......
  • 需要帮助来提取此 XML 节点 - Python 中的 Excel 连接字符串
    我有一个Python程序,打开Excel(XLSX)文件,并尝试查找<connection>节点。这是connections.xml文件中的完整XML。<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><connectionsxmlns="http://schemas.op......
  • 【python】Python中采集Prometheus数据,进行数据分析和可视化展示
    ✨✨欢迎大家来到景天科技苑✨✨......
  • 使用python3拼接rgb.txt与depth.txt为associate.txt(适用于GCNV2_SLAM中TUM数据集的运
    这里以GCNV2_SLAM中TUM数据集的运行为例子:安装gnv2_slam可以参考:GCNv2_SLAM-CPU详细安装教程(ubuntu18.04)-CSDN博客首先下载数据集ComputerVisionGroup-DatasetDownload下载后通过该命令解压:tar-xvfrgbd_dataset_freiburg1_desk.tgz打开后,你可以发现:在该数据集......
  • 【Python】到底什么是字符串格式化?
    字符串格式化的目的:在字符串中动态地插入数据或表达式。字符串格式化的对象:要插入到字符串中的数据。在详细解释之前,先引入第一种字符串格式化的方法name=input('请输入你的名字:')gender=input('请输入你的性别:')age=input('请输入你的年龄:')print(f'你的名字是{......
  • Python PDF 编辑器
    我将制作一个PDF编辑器,它可以更改PDF中的单词,而无需更改文本的来源。这是我的代码,到目前为止,它所做的一切都是正确的,但我可以获得文本颜色和文本大小。importpymupdfimportos#OpenthePDFdocumentdoc=pymupdf.open('input.pdf')#Loadthecustomfontfi......