我们分别对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)
- 参考文献
- Python基础教程(第2版·修订版). Copyright 2017 Magnus Lie Hetland著,司维 曾军崴 谭颖华译
- Fluent Python by Luciano Ramalho (O’Reilly). Copyright 2015 Luciano Ramalho, 978-1-491-94600-8.
更多推荐
浅析Python除法及特殊方法
发布评论