今天继续分享第五章内容:数字,可以关注我的微信公众号【Python Dao】,也可以扫描下方二维码关注我,我们一起学习交流。
5.1 数字类型
数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象。
Python 支持多种数字类型:整型、长整型(Python3 为整型)、布尔型、双精度浮点型、十进制浮点型和复数。
在学习编程的过程中, 我们一直接受这样的教育, 变量就像一个盒子, 里面装着变量的值。 在 Python 中, 变量更像一个指针指向装变量值的盒子。 对不可改变类型来说, 你无法改变盒子的内容, 但你可以将指针指向一个新盒子。
按照 Python 的法则, 你无法真正删除一个数值对象, 你仅仅是不再使用它而已。如果你实际上想删除一个数值对象的引用, 使用 del 语句 。
5.2 整型
- 布尔型
- 整数类型
八进制整数以数字“0”开始, 十六进制整数则以“0x” 或“0X” 开始。
5.3 双精度浮点数
Python 中的浮点数类似 C 语言中的 double 类型, 是双精度浮点数,可以用直接用十进制或科学计数法表示。
5.4 复数
Python 语言中有关复数的几个概念:
- 虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。
- 复数由实数部分和虚数部分构成
- 表示虚数的语法: real + imag * j
- 实数部分和虚数部分都是浮点数
- 虚数部分必须有后缀 j 或 J。
复数的内建属性 :
属性 | 说明 |
---|---|
num.real | 该复数的实部 |
num.imag | 该复数的虚部 |
num.conjugate() | 返回该复数的共轭复数 |
>>> aComplex = -8.333-1.47j
>>> aComplex
(-8.333-1.47j)
>>> aComplex.real
-8.333
>>> aComplex.imag
-1.47
>>> aComplex.conjugate()
(-8.333+1.47j)
5.5 运算符
标准运算符都可以用于数值类型。
Python 支持单目运算符正号(+)和负号(-), 双目运算符, +,-,*,/,%, **(幂运算) ,//(地板除)
浮点数取余 :
商取小于等于精确值的最大整数的乘积之差.
即: x - math.floor(x/y) * y
或者
复数取余 :
类似于浮点数,不同之处在于商仅取其实数部分,
即: x - (math.floor((x/y).real) * y)
幂运算操作符和一元操作符之间的优先级关系比较特别: 幂运算操作符比其左侧操作数的一元操作符优先级高,比起右侧操作数的一元操作符的优先级低:
>>> 3 ** 2
9
>>> -3 ** 2 # ** 优先级高于左侧的 -
-9
>>> (-3) ** 2 # 加括号提高 - 的优先级
9
>>> 4.0 ** -1.0 # ** 优先级低于右侧的 -
0.25
位运算符(只适用于整数) :
Python 整数支持标准位运算:取反(~),按位 与(&), 或(|) 及 异或(^) 及左移(<<)和右移(>>)。Python 这样处理位运算:
- 负数会被当成正数的二进制补码处理。
- 左移和右移 N 位等同于无溢出检查的 2 的 N 次幂运算: 2**N。
- 对长整数来说, 位运算符使用一种经修改的 2 进制补码形式,使得符号位可以无限的向左扩展。
取反(~)运算的优先级与数字单目运算符相同, 是所有位操作符中优先级最高的一个。 左移和右移运算的优先级次之,但低于加减法运算。与, 或, 异或 运算优先级最低。
位运算符 | 功能 |
---|---|
~num | 单目运算,对数的每一位取反。 |
num1 << num2 | Num1 左移 num2 位 |
num1 >> num2 | Num1 右移 num2 位 |
num1 & num2 | num1 与 num2 按位 与 |
num1 ^ num2 | num1 异或 num2 |
num1 | num2 | num1 与 num2 按位 或 |
>>> 30 & 45
12
>>> 30 | 45
63
>>> 45 & 60
44
>>> 45 | 60
61
>>> ~30
-31
>>> ~45
-46
>>> 45 << 1
90
>>> 60 >> 2
15
>>> 30 ^ 45
51
5.6 内建函数与工厂函数
转换工厂函数
函数 int(), long(), float() 和 complex() 用来将其它数值类型转换为相应的数值类型。从 Python 1.5 版本开始, 这些函数也接受字符串参数, 返回字符串所表示的数值。 从 Python1.6 版开始,int() 和 long() 在转换字符串时,接受一个进制参数。如果是数字类型之间的转换,则这个进制参数不能使用。 bool()。它用来将整数值 1 和 0 转换为标准布尔值 True 和 False.
所谓工厂函数就是指这些内建函数都是类对象, 当你调用它们时, 实际上是创建了一个类实例。
类(工厂函数) | 操作 |
---|---|
bool(obj) | 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值 |
int(obj, base=10) | 返回一个字符串或数值对象的整数表示, 类似string.atoi();从Python 1.6起,引入了可选的进制参数。 |
long(obj, base=10) | 返回一个字符或数据对象的长整数表示,类似string.atol(), 从Python1.6起,引入了可选的进制参数 |
float(obj) | 返回一个字符串或数据对象的浮点数表示,类似string.atof() |
complex(str) 或complex(real, imag=0.0) | 返回一个字符串的复数表示,或者根据给定的实数(及一个可选的虚数部分)生成一个复数对象。 |
功能函数
函数 | 功能 |
---|---|
abs(num) | 返回 num 的绝对值 |
coerce(num1, num2) | 将num1和num2转换为同一类型,然后以一个 元组的形式返回。 |
divmod(num1, num2) | 除法-取余运算的结合。 返回一个元组(num1/num2,num1 %num2)。对浮点数和复数的商进行下舍入(复数仅取实数部分的商) |
pow(num1, num2, mod=1) | 取 num1 的 num2次方,如果提供 mod参数,则计算结果再对mod进行取余运算 |
round(flt, ndig=0) | 接受一个浮点数 flt 并对其四舍五入,保存 ndig位小数。若不提供ndig 参数,则默认小数点后0位。 |
round()仅用于浮点数。(整数也可以, 不过并没有什么实际意义)
仅用于整数的函数 :
函数 | 操作 |
---|---|
hex(num) | 将数字转换成十六进制数并以字符串形式返回 |
oct(num) | 将数字转换成八进制数并以字符串形式返回 |
chr(num) | 将ASCII值的数字转换成ASCII字符,范围只能是0 <= num <= 255。 |
ord(chr) | 接受一个 ASCII 或 Unicode 字符(长度为1的字符串),返回相应的ASCII或Unicode 值。 |
unichr(num) | 接受Unicode码值,返回 其对应的Unicode字符。所接受的码值范围依赖于你的Python是构建于UCS‐2还是UCS‐4。 |
>>> ord('a')
97
>>> ord('A')
65
>>> ord('0')
48
>>> chr(97)
'a'
>>> chr(65L)
'A'
>>> chr(48)
'0'
5.7 其他数字类型
从 Python2.3 开始,布尔类型添加到了 Python 中来。尽管布尔值看上去是“True” 和“False,但是事实上是整型的子类,对应与整数的 1 和 0。下面是有关布尔类型的主要概念:
- 有两个永不改变的值 True 或 False。
- 布尔型是整型的子类,但是不能再被继承而生成它的子类。
- 没有__nonzero__()方法的对象的默认值是 True。
- 对于值为零的任何数字或空集(空列表、空元组和空字典等)在 Python 中的布尔值都是 False。
- 在数学运算中,Boolean 值的 True 和 False 分别对应于 1 和 0。
- 以前返回整数的大部分标准库函数和内建布尔型函数现在返回布尔型。
- True 和 False 现在都不是关键字,但是在 Python 将来的版本中会是。
十进制浮点数
使用时导入 decimal 模块以便使用 Decimal 类
5.8 相关模块
在 Python 标准库中有不少专门用于处理数值类型对象的模块, 它们增强并扩展了内建函数的功能和数值运算的功能。
模块 | 介绍 |
---|---|
decimal | 十进制浮点运算类 Decimal |
array | 高效数值数组(字符,整数,浮点数等等) |
math/cmath | 标准C库数学运算函数。常规数学运算在match模块,复数运算在cmath模块 |
operator | 数字运算符的函数实现。比如 tor.sub(m,n)等价于 m - n |
random | 多种伪随机数生成器 |
当你的程序需要随机数功能时,random 模块就能派上用场。该模块包含多个伪随机数发生器,它们均以当前的时间戳为随机数种子。这样只要载入这个模块就能随时开始工作。下面列出了该模块中最常用的函数:
两个整数参数,返回二者之间的随机整数
函数 | 作用 |
---|---|
randrange() | 随机返回range( [start,] stop[,step] )结果的一项 ,参数同range() |
uniform() | 类似 randint(), 返回二者之间的一个浮点数(不包括范围上限)。 |
random() | 类似 uniform() 只不过下限恒等于 0.0,上限恒等于 1.0 |
choice() | 随机返回给定序列的一个元素 |
总结:
数值类型的所有内建函数和运算符
运算符/内建函数 | 描述 | 整型 | 长整型 | 浮点型 | 复数 | 结果 |
---|---|---|---|---|---|---|
abs() | 绝对值 | · | · | · | 数字注 | |
chr() | · | · | str | |||
coerce() | · | · | · | · | tuple | |
complex() | 复数工厂函数 | · | · | · | · | complex |
divmod() | · | · | · | · | tuple | |
float() | float工厂函数 | · | · | · | · | float |
hex() | 十六进制字符串 | · | · | str | ||
oct() | 八进制字符串 | · | · | str | ||
int() | · | · | · | · | int | |
long() | · | · | · | · | long | |
ord() | int | |||||
pow() | · | · | · | · | 数字 | |
round() | float | |||||
**注 | 幂 | · | · | · | · | 数字 |
+ | 正 | · | · | · | · | 数字 |
- | 负 | · | · | · | · | 数字 |
~ | 按位取反 | · | · | int/long | ||
* | 乘 | · | · | · | · | 数字 |
/ | 除 | · | · | · | · | 数字 |
// | 地板除 | · | · | · | · | 数字 |
% | 取余 | · | · | · | · | 数字 |
+ | 加 | · | · | · | · | 数字 |
- | 减 | · | · | · | · | 数字 |
<< | 按位左移 | · | · | int/long | ||
>> | 按位右移 | · | · | int/long | ||
& | 按位与 | · | · | int/long | ||
^ | 按位异或 | · | · | int/long | ||
| | 按位或 | · | · | int/long |
注:优先级与单目运算符有关系
结果为 数字表示可以为所有四种数值类型,可能与操作数相同
网友评论