Python基础手册9——数字类型

Number(数字)

Python的数字由字面值生成或者由算术操作符和内建的算术函数作为结果返回。数字提供了标量贮存和直接访问,它是不可更改类型,也就是说变更数字的值会生成新的对象。Python数字分为整型、布尔类型、浮点型、复数等。

如何更新数字对象:

通过给数字对象(重新)赋值, 您可以“更新”一个数值对象。实际上你并没有更新该对象的原始数值,因为数值对象是不可改变对象,所以更新实际上是生成了一个新的数值对象,并得到它的引用。

在学习其他编程语言时我们通常认为,变量就像一个盒子,里面装着变量的值。在 Python 中,变量更像是一个指针指向了装变量值的盒子(可以结合上一章Python对象,动态类型一节中的图示和例子来帮助理解)。对不可改变类型来说,你无法改变盒子的内容,但你可以将指针指向一个新盒子。每次将另外的数字赋给变量的时候,实际上创建了一个新的对象并把它赋给变量(不仅仅是数字,对于所有的不可变类型,都是这么回事)。



如何删除数字对象:

按照 Python 的法则,你无法主动删除一个数字对象, 你只能是不再引用它(引用计数为0的对象会被Python解释器自动回收)。如果你想删除一个对数字对象的引用(变量名),使用 del 语句。 删除对象的引用之后, 你就不能再使用这个引用(变量名), 除非你给它赋一个新值(新的对象)。如果试图使用一个已经被删除的对象引用, 会引发 NameError 异常。




一、整数

表示来自整数的数学集合(正和负)的元素。有两种类型的整数:整型和布尔类型。

1、 整型(int)

Python 的标准整数类型,也是最通用的数字类型。它们表示的数值范围没有限制,只受限于可用的(虚拟内存)内存大小。

整数常以十进制数字常量表示,但是Python还允许我们使用十六进制、八进制和二进制计数法来编写整数。所有这些常量在程序代码中都产生一个整数对象(硬盘上和内存中保存的都是数字对应的二进制格式),他们仅仅是特定值的不同语法表示而已。Python默认的使用十进制来显示整数,但是也提供了内置函数把整数转换成其他进制的数字字符串格式。内置函数 hex()oct()bin() 把一个整数转换为这三种进制表示的字符串,并且 int() 内置函数根据每个给定的进制把字符串转换为一个整数,并可以通过定义的第二个参数来确定变换后的数字的进制。

十六进制数以 0x0X 开头,后面接十六进制的数字0~9和A~F,八进制数常量以数字 0o0O 开头,后面接八进制数字0~7,二进制常量以 0b0B 开头,后面跟二进制数字0~1。


2、 布尔类型(bool)

布尔值是特殊的整数,它们表示真值 TrueFalse 。True和False是预先定义的内置的变量名,他们是bool的实例,bool 实际上是普通整数的子类型。如果将布尔值放到一个数值上下文环境中(比方将 True 与一个数字相加), True 会被当成整数值 1,而 False则会被当成整数值 0。他们只是有特定的显示逻辑:他们是作为关键字True和False显示的,而不是数字(实际上,bool为它的两个对象重新定义了str和repr的字符串格式)。

所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布尔 True 或 False 值。空对象、值为零的任何数字或者 Null 对象 None 的布尔值都是 False。使用内置语句 bool() 可以判断一个对象的bool值。

下列对象的布尔值是 False:

  • None
  • False (布尔类型)
  • 所有的值为零的数:
    • 0 (整型)
    • (浮点型)
    • 0.0+0.0j (复数)
    • "" (空字符串)
    • [] (空列表)
    • () (空元组)
    • {} (空字典)




二、浮点型(float)

Python 中的浮点数类似 C 语言中的 double 类型, 是双精度浮点数,可以用直接的十进制或科学计数法表示,用来表示数学概念中的有理数小数。

接受的范围受底层的机器体系结构(和C或者Java的实现)控制,你需要做溢出处理。Python不支持单精度浮点数,使用单精度浮点数的原因通常是节省处理器和内存的使用,但是相比Python中对象使用的开销是微不足道的,因此没有必要支持两种浮点数使语言变的复杂。




三、复数(complex)

Python的复数常量写成实部+虚部的写法,这里虚部是以 j 或 J 结尾。实部从技术上讲可有可无,所以可能会单独表示虚部。从内部来看,复数都是通过一堆浮点数来表示的,但是对复数的所有数字操作都会按照复数的运算法则进行。也可以通过内置函数complex(real, imag)来创建复数。

这表示作为一对机器级双精度浮点数的复数。复数 z 的实部和虚部可以通过只读属性 z.real 和 z.imag 获得。

下面是 Python 语言中有关复数的几个概念:

  • 虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。
  • 复数由实数部分和虚数部分构成
  • 表示虚数的语法: real+imagj
  • 实数部分和虚数部分都是浮点数
  • 虚数部分必须有后缀 j 或 J。



四、混合模式运算问题

当两个整数相加时, + 号表示整数加法, 当两个浮点数相加时, + 表示浮点数加法, 依此类推。在 Python 中, 甚至非数字类型也可以使用 + 运算符。举例来说, 字符串 A + 字符串 B 并不表示加法操作, 它表示的是把这两个字符串连接起来, 生成一个新的字符串。关键之处在于支持 + 运算符的每种数据类型, 必须告诉 Python, + 运算符应该如何去工作。 这也体现了重载概念的具体应用(我们会在Python进阶手册的运算符重载一章具体介绍Python中运算符重载的概念)。

虽然我们不能让一个数字和一个字符串相加, 但 Python 确实支持不同的数字类型相加。当一个整数和一个浮点数相加时,系统会决定使用整数加法还是浮点数加法(实际上并不存在混合运算)。Python 使用数字类型强制转换的方法来解决数字类型不一致的问题, 也就是说它会强制将一个操作数转换为同另一个操作数相同的数据类型。

首先,如果两个操作数都是同一种数据类型,没有必要进行类型转换。仅当两个操作数类型不一致时, Python 才会去检查一个操作数是否可以转换为另一类型的操作数。如果可以,转换它并返回转换结果。由于某些转换是不可能的,比如果将一个复数转换为非复数类型, 将一个浮点数转换为整数等等,因此转换过程必须遵守几个规则。

在 Python 语言参考中这样描述 coerce() 方法:

  1. 如果有一个操作数是复数, 另一个操作数被转换为复数。
  2. 否则,如果有一个操作数是浮点数, 另一个操作数被转换为浮点数。
  3. 否则,两者必然都是整数,无须类型转换。

下面的流程图阐释了强制转换的规则。数字类型之间的转换是自动进行的,程序员无须自己编码处理类型转换。不过在确实需要明确指定对某种数据类型进行特殊类型转换的场合,Python 提供了 coerce() 内建函数来帮助你实现这种转换。




五、内建函数

1、int()、float() 、complex() 和 bool()

函数 int()float()complex() 用来将其它数值类型转换为相应的数值类型。这些函数也接受字符串参数, 返回字符串所表示的数值。bool() 用来将数值转换为标准布尔值 True 和 False。


2、 abs()、divmod()、 pow() 和 round()

abs() 返回给定参数的绝对值。如果参数是一个复数, 那么就返回 math.sqrt(num.real2 +num.imag2)。

divmod() 内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组。对整数来说,它 的 返 回 值 就 是 地 板 除 和 取 余 操 作 的 结 果。对 浮 点 数 来 说,返 回 的 商 部 分 是math.floor(num1/num2),对复数来说,商部分是 ath.floor((num1/num2).real)。

函数 pow() 和双星号 ** 运算符都可以进行指数运算。不过二者的区别并不仅仅在于一个是内建函数,一个是运算符。

内建函数 round() 用于对浮点数进行四舍五入运算。它有一个可选的小数位数参数。如果不提供小数位参数, 它返回与第一个参数最接近的整数。第二个参数告诉 round() 函数将结果精确到小数点后指定位数。


3、进制转换函数 hex() 和 oct()

除了十进制标准,Python 整数也支持八进制和 16 进制整数。 除此之外, Python还提供了两个内建函数来返回字符串表示的 8进制和 16进制整数。它们分别是 oct()hex() 。它们都接受一个整数(任意进制的)对象,并返回一个对应值的字符串对象。


4、ASCII 转换函数 chr() 和 ord()

Python 也提供了 ASCII(美国标准信息交换码)码与其序列值之间的转换函数。每个字符对应一个唯一的整数(0-255)。对所有使用 ASCII 表的计算机来说, 这个数值是不变的。这保证了不同系统之间程序行为的一致性。 函数 chr() 接受一个单字节整数值, 返回一个字符串,其值为对应的字符。函数 ord() 则相反,它接受一个字符,返回其对应的整数值。


《Python基础手册》系列:

Python基础手册 1 —— Python语言介绍
Python基础手册 2 —— Python 环境搭建(Linux)
Python基础手册 3 —— Python解释器
Python基础手册 4 —— 文本结构
Python基础手册 5 —— 标识符和关键字
Python基础手册 6 —— 操作符
Python基础手册 7 —— 内建函数
Python基础手册 8 —— Python对象
Python基础手册 9 —— 数字类型
Python基础手册10 —— 序列(字符串)
Python基础手册11 —— 序列(元组&列表)
Python基础手册12 —— 序列(类型操作)
Python基础手册13 —— 映射(字典)
Python基础手册14 —— 集合
Python基础手册15 —— 解析
Python基础手册16 —— 文件
Python基础手册17 —— 简单语句
Python基础手册18 —— 复合语句(流程控制语句)
Python基础手册19 —— 迭代器
Python基础手册20 —— 生成器
Python基础手册21 —— 函数的定义
Python基础手册22 —— 函数的参数
Python基础手册23 —— 函数的调用
Python基础手册24 —— 函数中变量的作用域
Python基础手册25 —— 装饰器
Python基础手册26 —— 错误 & 异常
Python基础手册27 —— 模块
Python基础手册28 —— 模块的高级概念
Python基础手册29 —— 包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343