`

Python之四(数字)

阅读更多

数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的
对象。当然,这个过程无论对程序员还是对用户都是透明的。

 

Python 支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。

 

声明一个数字:

anInt = 1

创建数值对象和给变量赋值一样

 

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

 

在学习编程的过程中, 我们一直接受这样的教育, 变量就像一个盒子, 里面装着变量的值。在Python 中, 变量更像一个指针指向装变量值的盒子。 对不可改变类型来说, 你无法改变盒子的内容, 但你可以将指针指向一个新盒子。每次将另外的数字赋给变量的时候,实际上创建了一个新的对象并把它赋给变量.(不仅仅是数字,对于所有的不可变类型,都是这么回事)

 

你无法真正删除一个数值对象,你仅仅是不再使用它而已。如果你实际上想删除一个数值对象的引用,使用 del 语句。 删除对象的引用之后,你就不能再使用这个引用(变量名),除非你给它赋一个新值。如果试图使用一个已经被删除的对象引用,会引发NameError 异常。

age = 18
del age
print age

 age被del语句回收了,再次使用age是报NameError

 

Python 有几种整数类型。布尔类型是只有两个值的整型。常规整型是绝大多数现代系统都能识别的整型。Python 也有长整数类型。然而,它表示的数值大小远超过C语言的长整数。

 

布尔值

该类型的取值范围只有两个值,也就是布尔值True和布尔值False。

 

标准整数类型

Python 的标准整数类型是最通用的数字类型。Python 标准整数类型等价于C 的(有符号)长整型。整数一般以十进制表示,但是Python也支持八进制或十六进制来表示整数。如果八进制整数以数字“0”开始,十六进制整数则以“0x” 或“0X”开始。

 

长整型

关于Python 长整数类型我们必须要提的是,请不要将它和C 或其它编译型语言的长整数类型混淆。那些语言的长整数典型的取值范围是32 位或64 位。Python 的长整数类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关。

在一个整数值后面加个L(大写或小写都可以,强烈推荐大写),表示这个整数是长整数。这个整数可以是十进制,八进制,或十六进制。

尽管 Python 也支持用小写字母 L 标记的长整型,但是我们郑重推荐您仅使用大写的 “L”,这样能有效避免数字1 和小写L 的混淆。Python 在显示长整数类型数值的时候总是用大写“L ”,目前整型和长整型正在逐渐缓慢的统一,您只有在对长整数调用repr()函数时才有机会看到“L”,如果对长整数对象调用str()函数就看不到 L 。

aaa = 999L
print repr(aaa)   #显示999L
print str(aaa)    #显示999

在Python 2.2 以前,标准整数类型对象超出取值范围会溢出,但是从Python2.2 以后就再也没有这样的错误了。不远的将来,至少普通用户会几乎感觉不到长整型的存在。必要时整型会悄悄自动转换为长整型(PEP237 )。

 

双精度浮点数

Python 中的浮点数类似C 语言中的double 类型,是双精度浮点数,可以用直接的十进制或科学计数法表示。每个浮点数占8 个字节(64 比特)。

 

混合模式运算的类型转换

Python 使用数字类型强制转换的方法来解决运算时数字类型不一致的问题,也就是说它会强制将一个操作数转换为同另一个操作数相同的数据类型。这种操作不是随意进行的,它遵循一个基本规则:整数转换为浮点数,非复数转换为复数。
如果有一个操作数是复数, 另一个操作数被转换为复数。
否则,如果有一个操作数是浮点数, 另一个操作数被转换为浮点数。
否则, 如果有一个操作数是长整数,则另一个操作数被转换为长整数;
否则,两者必然都是普通整数,无须类型转换。(参见下文中的示意图)


 

标准类型的算术运算符

Python 支持单目运算符正号(+)和负号(-), 双目运算符, +,-,*,/,%,还有 ** ,分别表示加法、减法、乘法、除法、取余和幂运算。从Python2.2 起,还增加了一种新的整除运算符 // 。

 

//除法运算

// 除法不管操作数何种数值类型,总是舍去小数部分,返回比真正的商小的最接近的数字,如:5//2(或者5//2.0)返回2,而不是2.5

 

/除法运算

如果是整数除法,返回一个整数(舍小数取整)。如果操作数之一是浮点数,则返回正确的除法结果。如:

5/2返回2,而不是2.5;

5/2.0返回2.5(因为操作数之一是浮点数)

 

如何让5/2返回2.5,而不是2呢?

方法一:在py文件的第一行新增from __future__ import division指令;

方法二:给python解释器新增-Qnew启动参数。默认值是-Qold

 

%取模运算

整数的模运算返回两个操作数相除后的余数,如:5%2返回1

浮点数取模就略复杂些,商取小于等于精确值的最大整数的乘积之差, 即: x - (math.floor(x/y) * y)

复数取模运算类似于浮点数,不同之处在于商仅取其实数部分,即:x - (math.floor((x/y).real) * y)

 

常用的处理数字类型的内建函数

int(), long(), float() ,bool()和 complex() 用来将其它数值类型转换为相应的数值类型。

所有这些内建函数现在都转变为工厂函数。所谓工厂函数就是指这些内建函数都是类对象,当你调用它们时,实际上是创建了一个类实例。不过,这些函数的使用方法并没有什么改变。如:

int('100')返回100;

int(4.2)返回4;

bool(1)返回True

 

类(工厂函数) 操作
bool(obj) 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值
int(obj, base=10) 返回一个字符串或数值对象的整数表示,类似string.atoi()方法
long(obj, base=10) 返回一个字符或数据对象的长整数表示,类似string.atol()方法
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位

 

仅用于整数的函数

函数 功能
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

 

布尔数

从Python2.3 开始,布尔类型添加到了Python 中来。尽管布尔值看上去是“True” 和“False,但是事实上是整型的子类,对应与整数的1 和0。下面是有关布尔类型的主要概念:

  • 有两个永不改变的值 True 或False。
  • 布尔型是整型的子类,但是不能再被继承而生成它的子类。
  • 没有__nonzero__()方法的对象的默认值是 True。
  • 对于值为零的任何数字或空集(空列表、空元组和空字典等)在Python 中的布尔值都是False。
  • 在数学运算中,Boolean 值的True 和False 分别对应于1 和 0。
  • 以前返回整数的大部分标准库函数和内建布尔型函数现在返回布尔型。
  • True 和False 现在都不是关键字,但是在Python 将来的版本中会是。

使用decimal 模块

from decimal import Decimal

aa = Decimal('0.1')
print aa + 2

 输出2.1

 

数字类型相关模块

模块 介绍
decimal 十进制浮点运算类 Decimal
array 高效数值数组(字符,整数,浮点数等等)
math/cmath 标准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()

随机返回给定序列的一个元素

 

参考资料:

Python核心编程(第二版) 人民邮电出版社

 

 

  • 大小: 45.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics