Python核心编程(2)—— 数字
1.数字类型
数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象。Python 支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。
如何创建数值对象并用其赋值(数字对象)?创建数值对象和给变量赋值一样同样简单:ex:anInt = 1。
通过给数字对象(重新)赋值, 您可以“更新”一个数值对象。我们之所以给更新这两个字加上引号, 是因为实际上你并没有更新该对象的原始数值。这是因为数值对象是不可改变对象。Python 的对象模型与常规对象模型有些不同。你所认为的更新实际上是生成了一个新的数值对象,并得到它的引用。
在学习编程的过程中, 变量就像一个盒子, 里面装着变量的值。在Python 中, 变量更像一个指针指向装变量值的盒子。 对不可改变类型来说, 是无法改变盒子的内容, 但可以将指针指向一个新盒子。每次将另外的数字赋给变量的时候,实际上创建了一个新的对象并把它赋给变量(不仅仅是数字,对于所有的不可变类型,都是这么回事)。
按照Python 的法则, 你无法真正删除一个数值对象, 仅仅是不再使用它而已。若想删除一个数值对象的引用, 使用 del 语句,删除引用之后,即不能再使用此变量名。
2.整型
布尔类型是只有两个值的整型。Python 的标准整数类型是最通用的数字类型。Python也支持八进制或十六进制来表示整数。若八进制整数以数字“0”开始, 十六进制整数则以“0x” 或“0X” 开始
3.双精度浮点数
浮点数值通常都有一个小数点和一个可选的后缀e(大写或小写,表示科学计数法)。在e和指数之间可以用正(+)或负(-)表示指数的正负(正数的话可以省略符号)。
4.复数
Python 语言中有关复数的几个概念:
虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。
复数由实数部分和虚数部分构成
表示虚数的语法: real+imagj
实数部分和虚数部分都是浮点数
虚数部分必须有后缀j 或J。
复数属性 | |
属性 | 描述 |
num.real | 该复数的实部 |
num num.imag | 该复数的虚部 |
num.conjugate() | 返回该复数的共轭复数 |
5.运算符
在Python 中,支持不同的数字类型相加。它会强制将一个操作数转换为同另一个操作数相同的数据类型。它遵循以下基本规则。首先,如果两个操作数都是同一种数据类型,没有必要进行类型转换。仅当两个操作数类型不一致时, Python 才会去检查一个操作数是否可以转换为另一类型的操作数。如果可以,转换它并返回转换结果。由于某些转换是不可能的,比如果将一个复数转换为非复数类型, 将一个浮点数转换为整数等等,因此转换过程必须遵守几个规则。
在Python 语言参考中这样描述 coerce() 方法:
如果有一个操作数是复数, 另一个操作数被转换为复数。
否则,如果有一个操作数是浮点数, 另一个操作数被转换为浮点数。
否则, 如果有一个操作数是长整数,则另一个操作数被转换为长整数;
否则,两者必然都是普通整数,无须类型转换。
数值类型转换
数字类型之间的转换是自动进行的,程序员无须自己编码处理类型转换。不过在确实需要明确指定对某种数据类型进行特殊类型转换的场合,Python 提供了 coerce() 内建函数来帮助你实现这种转换。
Python 支持单目运算符正号(+)和负号(-), 双目运算符, +,-,*,/,%,还有 ** ,分别表示加法,减法, 乘法, 除法, 取余, 和幂运算。
注:对整数操作数,会执行“地板除”(floor,取比商小的最大整数。例如5 除以2 等于2.5,其中“2”就称为商的“地板”,即“地板除”的结果。执行“地板除”的运算符 //。// 除法不管操作数何种数值类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
对于复数,取余的定义类似于浮点数,不同之处在于商仅取其实数部分,即:x - (math.floor((x/y).real) * y)。
幂运算操作符和一元操作符之间的优先级关系比较特别: 幂运算操作符比其左侧操作数的一元操作符优先级低,比起右侧操作数的一元操作符的优先级高。ex:
>>> -3 ** 2 # ** 优先级高于左侧的 -
-9
>>> 4.0 ** -1.0 # ** 优先级低于右侧的 -
0.25
算术运算符 | ||||
算术去处符 | 功能 |
从上 到下 计算 优先 级依 次降 低。 |
||
表达式1 | 表达式2 | 结果 | ||
+expr | 结果符号不变 | |||
-expr | 对结果符号取负 | |||
表达式1 | 表达式2 | 结果 | ||
expr1 | * | expr2 | 表达式1 乘表达式2 | |
expr1 | / | expr2 |
表达式1 除以表达式2 |
|
expr1 | // | expr2 | 表达式1 地板除以表达式2 | |
expr1 | % | expr2 | 表达式1 对表达式2 取余 | |
expr1 | + | expr2 | 表达式1 加表达式2 | |
expr1 | - | expr2 | 表达式1 减表达式2 |
注:** 运算符优先级高于单目运算符,指数运算符的优先级高于连接实部和虚部的+号运算符。
位运算符(只适用于整数)。Python 整数支持标准位运算:取反(~),按位 与(&), 或(|) 及 异或(^) 及左移(<<)和右移(>>)。Python 这样处理位运算:
负数会被当成正数的 2 进制补码处理。
左移和右移 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 按位或 |
6.内建函数与工厂函数
cmp(), str() 和 type() 内建函数。 这些函数可以用于所有的标准类型。对数字对象来说, 这些函数分别比较两个数的大小, 将数字转换为字符串, 以及返回数字对象的类型。
函数 int(), float() 和 complex() 用来将其它数值类型转换为相应的数值类型。内建函数 bool()。它用来将整数值1 和0 转换为标准布尔值 True 和False。
所谓工厂函数就是指这些内建函数都是类对象, 当你调用它们时,实际上是创建了一个类实例。
数值工厂函数 | |
类(工厂函数) | 操作 |
bool(obj) |
返回obj对象的布尔值,也就是 |
int(obj,base=10) |
返回一个字符串或数值对象的整数表 |
long(obj,base=10) |
返回一个字符或数据对象的长整数表 |
float(obj) |
返回一个字符串或数据对象的浮点数 |
complex(str) or complex(real,imag=0.0) |
返回一个字符串的复数表示,或 |
功能函数:Python 有五个运算内建函数用于数值运算: abs(), coerce(), divmod(), pow()和 round()。
abs()返回给定参数的绝对值。如果参数是一个复数, 那么就返回math.sqrt(num.real2 +num.imag2)。
函数coerce()为程序员提供了不依赖Python 解释器, 而是自定义两个数值类型转换的方法。函数coerce()仅回一个包含类型转换完毕的两个数值元素的元组。
divmod()内建函数把除法和取余运算结合起来, 返回一个包含商和余数的元组。对整数来说, 它的返回值就是地板除和取余操作的结果。对浮点数来说, 返回的商部分是math.floor(num1/num2),对复数来说, 商部分是ath.floor((num1/num2).real)。
函数 pow() 和双星号 (**) 运算符都可以进行指数运算。不过二者的区别并不仅仅在于一个是运算符,一个是内建函数。内建函数pow()可接受第三个可选的参数,一个余数参数。如果有这个参数的, pow() 先进行指数运算,然后将运算结果和第三个参数进行取余运算。这个特性主要用于密码运算,并且比 pow(x,y) % z 性能更好, 这是因为这个函数的实现类似于C 函数 pow(x,y,z)。
内建函数round()用于对浮点数进行四舍五入运算(按四舍五入的规则进行取整)。它有一个可选的小数位数参数。如果不提供小数位参数, 它返回与第一个参数最接近的整数(但仍然是浮点类型)。第二个参数告诉round 函数将结果精确到小数点后指定位数。
int(), round(), math.floor()它们之间的不同之处:
函数 int()直接截去小数部分。(返回值为整数)
函数 floor()得到最接近原数但小于原数的整数。(返回值为浮点数)
函数 round()得到最接近原数的整数。(返回值为浮点数,仅用于浮点数)
数值运算内建函数 | |
函数 | 功能 |
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位。 |
仅用于整数的函数:Python 提供一些仅适用于整数的内建函数(标准整数和长整数)。这些函数分为两类,一类用于进制转换,另一类用于ASCII 转换。
Python 提供了两个内建函数来返回字符串表示的8 进制和16 进制整数。它们分别是 oct()和 hex()。它们都接受一个整数(任意进制的)对象,并返回一个对应值的字符串对象。
Python 也提供了ASCII(美国标准信息交换码)码与其序列值之间的转换函数。每个字符对应一个唯一的整数(0-255)。对所有使用ASCII 表的计算机来说, 这个数值是不变的。函数chr()接受一个单字节整数值,返回一个字符串,其值为对应的字符。函数ord()则相反,它接受一个字符,返回其对应的整数值。
仅适用于整数的内建函数 | |
函数 | 操作 |
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。 |
7.其他数字类型
有关布尔类型的主要概念:
有两个永不改变的值 True 或False。
布尔型是整型的子类,但是不能再被继承而生成它的子类。
没有__nonzero__()方法的对象的默认值是 True。
对于值为零的任何数字或空集(空列表、空元组和空字典等)在Python 中的布尔值都是False。
在数学运算中,Boolean 值的True 和False 分别对应于1 和 0。
以前返回整数的大部分标准库函数和内建布尔型函数现在返回布尔型。
True 和False 现在都不是关键字,但是在Python 将来的版本中会是。
# 无 __nonzero__()
>>> class C: pass
>>> c = C()
>>>
>>> bool(c) True
>>> bool(C) True
# 重载 __nonzero__() 使它返回 False
>>> class C:
... def __nonzero__(self):
... return False
...
>>> c = C()
>>> bool(c) False
>>> bool(C) True
注意:不能混用十进制浮点数和普通的浮点数。你可以通过字符串或其它十进制数创建十进制数浮点数。你必须导入 decimal 模块以便使用 Decimal 类。
8.相关模块
数字类型相关模块 | |
模块 | 介绍 |
decimal | 十进制浮点运算类 Decimal |
array | 高效数值数组(字符,整数,浮点数等等) |
math/cmatch | 标准C库数学运算函数。常规数学运算在match模块,复数运算在cmath模块 |
operator | 数字运算符的函数实现。比如 tor.sub(m,n)等价于 m - n |
random | 多种伪随机数生成器 |
核心模块: random
当你的程序需要随机数功能时,random 模块就能派上用场。该模块包含多个伪随机数发生器,它们均以当前的时间戳为随机数种子。这样只要载入这个模块就能随时开始工作。下面列出了该模块中最常用的函数:
两个整数参数,返回二者之间的随机整数randrange() 它接受和 range() 函数一样的参数, 随机返回range([start,]stop[,step])结果的一项。
uniform() 几乎和 randint()一样,不过它返回的是二者之间的一个浮点数(不包括范围上限)。
random() 类似 uniform() 只不过下限恒等于0.0,上限恒等于1.0。
choice() 随机返回给定序列的一个元素。
注:最好不要在函数内使用 print 语句输出信息,而是通过 return 语句返回必要的值。这样调用函数的代码就可以自己处理显示方式。