原题

| Unravelling binary arithmetic operations in Python

作者

| Brett Cannon

译者

| 豌豆花下猫(“Python猫”公众号作者)

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

大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章。在本文中,我想谈谈二元算术运算。

具体来说,我想解读减法的工作原理:a - b。我故意选择了减法,因为它是不可交换的。这可以强调出操作顺序的重要性,与加法操作相比,你可能会在实现时误将 a 和 b 翻转,但还是得到相同的结果。

查看 C 代码

按照惯例,我们从查看 CPython 解释器编译的字节码开始。

>>> def sub(): a - b

...

>>> import dis

>>> dis.dis(sub)

1           0 LOAD_GLOBAL              0 (a)

2 LOAD_GLOBAL              1 (b)

4 BINARY_SUBTRACT

6 POP_TOP

8 LOAD_CONST               0 (None)

10 RETURN_VALUE

看起来我们需要深入研究 BINARY_SUBTRACT  操作码。翻查 Python/ceval.c 文件,可以看到实现该操作码的 C 代码如下:

case TARGET(BINARY_SUBTRACT):{

PyObject *right = POP();

PyObject *left = TOP();

PyObject *diff = PyNumber_Subtract(left, right);

Py_DECREF(right);

Py_DECREF(left);

SET_TOP(diff);

if (diff == NULL)

goto error;

DISPATCH();

}

python中减法运算函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?...相关推荐

  1. python中index函数_详解python中的index函数用法

    1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...

  2. python中延时函数_详解python中实现延时回调普通函数

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...

  3. python中setattr用法_详解Python的hasattr() getattr() setattr() 函数使用方法

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

  4. python线程延时函数_详解Python 多线程 Timer定时器/延迟执行、Event事件

    Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...

  5. python中byte类型_详解python string类型 bytes类型 bytearray类型

    搜索热词 一.python3对文本和二进制数据做了区分.文本是Unicode编码,str类型,用于显示.二进制类型是bytes类型,用于存储和传输.bytes是byte的序列,而str是unicode ...

  6. python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  7. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  8. python中递归函数写法_详解python中递归函数

    函数执行流程 def foo1(b,b1=3): print("foo1 called",b,b1) def foo2(c): foo3(c) print("foo2 c ...

  9. 详解python中的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 def funa(d ...

最新文章

  1. 2014年百度之星程序设计大赛 - 初赛(第二轮)Chess
  2. 印象笔记终于支持Markdown了 !你还会再用其他笔记吗?
  3. python需要的数学基础训练答案_新编基础训练数学答案
  4. ARM Cortex-M0微控制器汇编语言之分支条件的典型用法
  5. 谈谈NiTE 2手部跟踪在彩色图像上的显示
  6. servle 3.0 新特性之一 对上传表单的支持
  7. Leetcode--113. 路径总和Ⅱ
  8. 信安教程第二版-第16章网络安全风险评估技术原理与应用
  9. 华为云摘得信息检索领域国际权威比赛金牌,实力全解析
  10. Mysql orangepi_SSH远程登录香橙派Orange Pi Zero2开发板的操作方法
  11. python主讲移动端自动化测试框架appium_Appium-移动端自动测试框架,如何入门?...
  12. js 对一个字段去重_js正则去重及(?=)的匹配规则
  13. [转]非极大值抑制(Non-Maximum Suppression)
  14. c语言给出太多参数,C语言中不定参数的实现
  15. 介绍谱聚类(spectral clustering)
  16. Android app 内存分配
  17. python实现Hangman游戏
  18. python图像识别依赖包安装和环境配置
  19. KVM虚拟化技术的-虚拟机配置文件
  20. 如果手机被偷了,里面的微信和支付宝绑定了银行卡,该怎么办?

热门文章

  1. vue 项目白屏解决方案
  2. Html5 冒泡排序演示
  3. CSS 盒模型与box-sizing
  4. DIV背景半透明,DIV中的字不半透明
  5. 爬格子呀9.17(图论)
  6. hello程序的运行过程-从计算机系统角度
  7. 图解 深入浅出 JavaWeb:Servlet 再说几句
  8. Mercurial hg web server的配置
  9. Android Activity类讲解(一)
  10. 生活GOOGLE,GOOGLE生活