- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
除法:传统除法、Floor 除法和真除法
X/Y
传统除法和真除法。在Python 2.6或之前的版本中,这个操作对于整数会省去小数部分,对于浮点数会保持小数部分。在Python 3.0版本中将会变成真除法(无论任何类型都会保持小数部分)。
X//Y
Floor除法。在Python 2.2中新增的操作,在Python2.6和Python3.0中均能使用。这个操作不考虑操作对象的类型,总会省略掉结果的小数部分,剩下最小的能整除的整数部分。
添加真除法是为了解决最初的传统除法的结果依赖于操作数类型(因此,其结果在Python这样的动态类型语言中很难预料)这一现象。由于这一限制,Python 3.0取消了传统除法:/和//操作符在Python 3.0中分别实现真除法和Floor除法。
概括来讲:
·在Python 3.0中,/现在总是执行真除法,不管操作数的类型,都返回包含任何余数的一个浮点结果。//执行Floor除法,它截除掉余数并且针对整数操作数返回一个整数,如果有任何一个操作数是浮点类型,则返回一个浮点数。
·在Python 2.6中,/表示传统除法,如果两个操作数都是整数的话,执行截断的整数除法;否则,执行浮点除法(保留余数)。//执行Floor除法,并且像在Python 3.0中一样工作,对于整数执行截断除法,对于浮点数执行浮点除法。
下面是两个操作符在Python 3.0和Python 2.6中的用法:
注意,在Python 3.0中,//的结果的数据类型总是依赖于操作数的类型:如果操作数中有一个是浮点数,结果就是浮点数;否则,结果是一个整数。尽管这可能与Python 2.X中类型依赖行为类似(正是该因素引发了在Python 3.0中的变化),但返回值类型的差异比返回值本身的差异要轻微很多。此外,对于依赖截断整数除法的程序(这种程序可能比你所意识到的要更为常见),//作为向后兼容工具的一部分而提供,对于整数类型,它必须返回整数。
支持两个Python版本
尽管/的行为在Python 2.6和Python 3.0中不同,我们仍然能够在自己的代码中支持这两个版本。如果你的程序依赖于截断整数除法,在Python 2.6和Python 3.0中都使用//。如果你的程序对于整数需要带有余数的浮点数结果,使用浮点数,从而确保代码在Python 2.6中运行的时候/的一个操作数是浮点数:
作为替代方法,我们可以使用一个__future__import在Python 2.6中打开Python 3.0的/,而不是用浮点转换来强制它:
Floor除法VS截断除法
一个细微之处在于://操作符通常叫做截断除法,但是,更准确的说法是floor除法,它把结果向下截断到它的下层,即真正结果之下的最近的整数。其直接效果是向下舍入,并不是严格地截断,并且这对负数也有效。你可以使用Python的math模块来自己查看其中的区别(在使用模块中的内容之前,必须先导入模块;随后将更详细地介绍这些内容):
在执行除法操作的时候,只是真正地截断了正的结果,因此截断除法和floor除法是相同的;对于负数,它就是一个floor结果(实际上,它们都是floor,但是对于正数来说,floor和截断是相同的)。下面是在Python 3.0中的情况:
Python 2.6中的情况类似,但是/的结果再次有所不同:
如果你真的想要截断而不管符号,可以总是通过math.trunc来得到一个浮点除法结果,而不管是什么Python版本(请查看内置的round函数以了解相关的功能):
为什么截断很重要
如果使用Python 3.0,这里有一个关于除法操作符的简短故事:
对于Python 2.6的用户,除法像下面这样工作:
尽管还是得出来了结果,但是,Python 3.0中/的非截断行为还是可能会影响到大量的程序。可能是因为C语言的遗留原因,很多程序员依赖于整数的截断除法,因此他们必须学习在这样的环境中使用//。查看第13章中的一个简单的素数while循环的示例,以及第四部分末尾的一个相应的练习,它们说明这一/修改可能会影响到的代码的种类。还要更多地关注本小节中的特殊的from命令,第24章将更深入地讨论它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论