我们分别对Python2和Python3所支持的除法运算进行分析,浅析其内部实现除法操作的特殊方法。

  • python2
>>> 1 / 2
0

从以上代码运行结果来看,我们发现一个整数(无小数部分的数)被另外一个整数除,计算结果的小数部分被截除了,只留下整数部分。有时,这个功能很实用,但通常人们只需要计算普通的除法。那么要怎么做呢?有三个有效的解决方案:

1、用实数(包含小数点的数)而不是整数进行运算

>>> 1.0 / 2.0
0.5
>>> 1 / 2.0
0.5

2、让Python改变除法的执行方式

如果希望Python2只执行普通的除法,那么可以在程序前或者直接在解释器里面执行:

>>> from __future__ import division
# 左右皆是双下划线

3、如果通过命令行(比如在Linux系统上)运行Python,可以使用命令开关-Qnew:

python -Qnew
>>> 1 / 2
0.5

当然,单斜线不再用作前面提到的整除,但Python提供了另外一个用于实现整除的操作符–双斜线

>>> 1 // 2
0

就算是浮点数,双斜线也会执行整除:

>>> 1.0 // 2.0
0.0
  • python3

Python3改变了除法的执行方式

>>> 1 / 2
0.5

当然,实现整除的操作符–双斜线没有发生变化:

>>> 1 // 2
0
  • 初探特殊方法

首先明确一点,特殊方法的存在是为了被Python解释器调用的,你自己并不需要调用它们。
也就是说没有my_object._len_()这种写法,而应该使用len(my_object)。在执行len(my_object)的时候,如果my_object是一个自定义的类的对象,那么Python会自己去调用其中由你实现的__len__方法。

下面举例说明,其中跟运算符相关的特殊方法中,__truediv__表示/,__floordiv__表示//

class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
    
    def __repr__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)
    
    def __truediv__(self, scalar):
        return Vector(self.x / scalar, self.y / scalar)
    
    def __floordiv__(self, scalar):
        return Vector(self.x // scalar, self.y // scalar)
    
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
>>> v1 = Vector(2, 4)
>>> print(v1 * 3)
Vector(6, 12)
>>> print(v1 / 2)
Vector(1.0, 2.0)
>>> print(v1 // 2)
Vector(1, 2)
  • 参考文献
  1. Python基础教程(第2版·修订版). Copyright 2017 Magnus Lie Hetland著,司维 曾军崴 谭颖华译
  2. Fluent Python by Luciano Ramalho (O’Reilly). Copyright 2015 Luciano Ramalho, 978-1-491-94600-8.

更多推荐

浅析Python除法及特殊方法