Python编程基础——数字

一、简介

       Python主要的数字类型:整型、浮点型和复数,了解对数字有效的操作符、内建函数以及工厂函数对合理处理数字有很好的指导作用。

二、详解

1、数字类型

        数字提供了标量贮存和直接访问。它是不可更改类型,也就是说变更数字的值会生成新的对象。当然,这个过程无论对程序员还是对用户都是透明的,并不会影响软件的开发方式。
        Python 支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。
        数字对象:创建数值对象即给变量赋值。
        更新数字对象:通过给数字对象(重新)赋值,您可以“更新”一个数值对象。我们之所以给更新这两个字加上引号, 是因为实际上你并没有更新该对象的原始数值。这是因为数值对象是不可改变对象。Python 的对象模型与常规对象模型有些不同。你所认为的更新实际上是生成了一个新的数值对象,并得到它的引用。
         删除数字对象:按照Python的法则,你无法真正删除一个数值对象,你仅仅是不再使用它而已。如果你实际上想删除一个数值对象的引用,使用 del语句删除对象的引用之后,你就不能再使用这个引用(变量名), 除非你给它赋一个新值。如果试图使用一个已经被删除的对象引用, 会引发NameError异常。

2、整型

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

(2)标准整数类型
        Python的标准整数类型是最通用的数字类型。在大多数 32 位机器上,标准整数类型的取值范围是-2的31次方到2的31次方减1,也就是-2,147,483,648到2,147,483,647。如果在64位机器上使用64位编译器编译Python,那么在这个系统上的整数将是 64 位。一些 Python 标准整数类型对象的例子:0101 84 -237 0x80 017 -680 -0X92,Python标准整数类型等价于 C的(有符号)长整型。整数一般以十进制表示,但是Python也支持八进制或十六进制来表示整数。八进制整数以数字“0”开始,十六进制整数则以“0x” 或“0X” 开始。
(3)长整型

        Python长整数类型不能将它和C或其它编译型语言的长整数类型混淆,C语言的长整数典型的取值范围是 32 位或 64 位。Python 的长整数类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python 能轻松表达很大很大很大的整数。

        长整数类型是标准整数类型的超集,当你的程序需要使用比标准整数类型更大的整数时,长整数类型就有用武之地了。在一个整数值后面加个 L(大写或小写都可以),表示这个整数是长整数。这个整数可以是十进制、八进制、或十六进制。一些长整数的例子:16384L -0x4E8L 017L -2147483648l 052144364L 299792458l 0xDECADEDEADBEEFBADFEEDDEAL -5432101234L。
(4)整型和长整型的统一

       这两种整数类型正在逐渐统一为一种。不远的将来,至少普通用户会几乎感觉不到长整型的存在。必要时整型会悄悄自动转换为
长整型。当然,那些要调用 C 的人仍然可以继续使用这两种整数类型,因为C代码必须区分不同的整数类型。

3、双精度浮点数

        Python中的浮点数类似C语言中的double类型,是双精度浮点数,可以用直接的十进制或科学计数法表示。每个浮点数占 8 个字节(64 比特)完全遵守 IEEE754 号规范,(52M/11E/1S),其中52个比特用于表示底,11个比特用于表示指数(可表示的范围大约是正负10的308.25次方) 剩下的一个比特表示符号。这看上去相当完美,然而实际精度依赖于机器架构和创建 Python 解释器的编译器。
        浮点数值通常都有一个小数点和一个可选的后缀 e(大写或小写,表示科学计数法)。在e和指数之间可以用正(+)或负(-)表示指数的正负(正数的话可以省略符号)。一些典型的浮点数值的例子:0.0 4.3e25 3.1416 -777. 1.6 -5.555567119 9.384e-23 -2.172818 float(12) 4.2E-10 -90. 6.022e23 96e3 * 1.0 1.000000001 -1.609E-19。

4、复数

        一个实数和一个虚数的组合构成一个复数。一个复数是一对有序浮点数(x, y)。表示为 x + yj, 其中 x 是实数部分,y 是虚数部分。
        Python语言中有关复数的几个概念:一、虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数。二、复数由实数部分和虚数部分构成。三、表示虚数的语法:real+imagj。四、实数部分和虚数部分都是浮点数。五、虚数部分必须有后缀 j或J。一些复数的例子:64.375+1j 4.23-8.5j。
        复数对象拥有数据属性分别为该复数的实部和虚部。复数还拥有conjugate方法,调用它可以返回该复数的共轭复数对象。(两头牛背上的架子称为轭,轭使两头牛同步行走。共轭即为按一定的规律相配的一对)。
        复数属性:
属性                                   描述
num.real                            该复数的实部
num num.imag                 该复数的虚部
num.conjugate()               返回该复数的共轭复数

5、运算符

数值类型可进行多种运算。从标准运算符到数值运算符,甚至还有专门的整数运算符。
(1)混合模式运算符

        当两个整数相加时,+号表示整数加法,当两个浮点数相加时,+ 表示浮点数加法。依此类推,在 Python 中,甚至非数字类型也可以使用+运算符。举例来说,字符串A+字符串B并不表示加法操作,它表示的是把这两个字符串连接起来, 生成一个新的字符串。关键之处在于支持+运算符的每种数据类型, 必须告诉 Python,+运算符应该如何去工作。 这也体现了重载概念的具体应用。
        虽然我们不能让一个数字和一个字符串相加,但Python确实支持不同的数字类型相加。当一个整数和一个浮点数相加时,系统会决定使用整数加法还是浮点数加法(实际上并不存在混合运算)。Python使用数字类型强制转换的方法来解决数字类型不一致的问题,也就是说它会强制将一个操作数转换为同另一个操作数相同的数据类型。这种操作不是随意进行的,它遵循基本规则。
        首先,如果两个操作数都是同一种数据类型,没有必要进行类型转换。仅当两个操作数类型不一致时,Python 才会去检查一个操作数是否可以转换为另一类型的操作数。如果可以,转换它并返回转换结果。由于某些转换是不可能的,比如将一个复数转换为非复数类型,将一个浮点数转换为整数等等,因此转换过程必须遵守几个规则。
        要将一个整数转换为浮点数,只要在整数后面加个 .0 就可以了。 要将一个非复数转换为复数,则只需要要加上一个 “0j” 的虚数部分。这些类型转换的基本原则是:整数转换为浮点数,非复数转换为复数。 在Python语言参考中这样描述 coerce() 方法:如果有一个操作数是复数,另一个操作数被转换为复数。否则,如果有一个操作数是浮点数,另一个操作数被转换为浮点数。否则, 如果有一个操作数是长整数,则另一个操作数被转换为长整数。否则,两者必然都是普通整数,无须类型转换

(2)标准类型运算符

标准运算符都可以用于数值类型,包括<、>、<=、>=、==、!=、<>、is、is not、not、and、or。

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

        除法: 对整数操作数,会执行“地板除”(floor,取比商小的最大整数。例如5除以2等于2.5,其中“2”就称为商的“地板”,即“地板除”的结果)。对浮点操作数会执行真正的除法。在未来的Python版本中,Python开发小组已经决定改变/运算符的行为,/ 的行为将变更为真正的除法, 会增加一种新的运算来表示地板除。 下面总结一下Python现在的除法规则,以及未来的除法规则:一、传统除法,如果是整数除法,传统除法会舍去小数部分,返回一个整数(地板除)。如果操作数之一是浮点数,则执行真正的除法。二、真正的除法,总是返回真实的商,不管操作数是整数还是浮点数。在未来版本的 Python 中,这将是除法运算的标准行为。现阶段通过执行 from __future__ import division 指令,也可以做到这一点。三、地板除从Python 2.2开始,一个新的运算符//已经被增加进来,以执行地板除: // 除法不管操作数何种数值类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
        取余:整数取余相当容易理解,对于复数取余的定义类似于浮点数,不同之处在于商仅取其实数部分。
        幂运算:幂运算操作符和一元操作符之间的优先级关系比较特别,幂运算操作符比其左侧操作数的一元操作符优先级低,比起右侧操作数的一元操作符的优先级高,由于这个特性你会在算术运算符表中找到两个**。
(4)算术运算符的优先级依次是:**、正号(+)负号(-)*、/、//、%、+、-。
(5)位运算符(只适用于整数)  

        Python整数支持标准位运算:取反(~),按位与(&),或(|) 及异或(^) 及左移(<<)和右移(>>)。
        Python这样处理位运算:负数会被当成正数的 2 进制补码处理。左移和右移N位等同于无溢出检查的2的N次幂运算:2**N。对长整数来说, 位运算符使用一种经修改的2进制补码形式,使得符号位可以无限的向左扩展。取反(~)运算的优先级与数字单目运算符相同,是所有位操作符中优先级最高的一个。 左移和右移运算的优先级次之,但低于加减法运算。与、或、异或运算优先级最低。

6、内建函数与工厂函数

(1)标准类型函数
        cmp()、str()和type()内建函数,可以用于所有的标准类型。对数字对象来说,这些函数分别比较两个数的大小,将数字转换为字符串,,以及返回数字对象的类型。
(2)数字类型函数

      Python现在拥有一系列针对数字类型的内建函数。一些函数用于数字类型转换,另一些则执行一些常用运算。

转换工厂函数:函数 int(), long(), float() 和 complex() 、bool()用来将其它数值类型转换为相应的数值类型。
数值工厂函数总结:



功能函数:Python有五个运算内建函数用于数值运算: abs(), coerce(), divmod(), pow(), pow()和 round()。
数值运算内建函数总结:


(3)仅用于整数的函数
       除了适应于所有数值类型的内建函数之外,Python还提供一些仅适用于整数的内建函数(标准整数和长整数)。这些函数分为两类:一类用于进制转换,另一类用于 ASCII 转换。

       进制转换函数:Python整数支持十进制,也支持八进制和16进制整数。 除此之外,Python还提供了两个内建函数来返回字符串表示的8进制和16进制整数。它们分别是 oct()和hex()。它们都接受一个整数(任意进制的)对象,并返回一个对应值的字符串对象。
       ASCII 转换函数:Python也提供了ASCII(美国标准信息交换码)码与其序列值之间的转换函数。每个字符对应一个唯一的整数(0-255)。对所有使用ASCII表的计算机来说, 这个数值是不变的。这保证了不同系统之间程序行为的一致性。函数chr()接受一个单字节整数值,返回一个字符串,其值为对应的字符。函数ord()则相反,它接受一个字符,返回其对应的整数值。

[html]  view plain  copy
  1. >>> ord('a')  
  2. 97  
  3. >>> ord('A')  
  4. 65  
  5. >>> chr(97)  
  6. 'a'  
  7. >>> chr(65L)  
  8. 'A'  
仅适用于整数的内建函数:


7、其他数字类型

(1)布尔“数”
       从 Python2.3 开始,布尔类型添加到了Python中来。尽管布尔值看上去是“True”和“False”,但是事实上是整型的子类,对应与整数的 1 和 0。
(2)十进制浮点数
        十进制数和其它数值类型一样,可以使用同样的算术运算符。十进制数本质上是一种用于数值计算的特殊类。可以通过字符串或其它十进制数创建十进制数浮点数,但必须导入decimal模块。

8、相关模块

       在Python标准库中有不少专门用于处理数值类型对象的模块,它们增强并扩展了内建函数的功能和数值运算的功能。 
数字类型相关模块:

模块                                            介绍
decimal                 十进制浮点运算类 Decimal 
array                      高效数值数组(字符,整数,浮点数等等) 
math/cmath           标准C库数学运算函数,常规数学运算在match模块,复数运算在cmath模块 
operator                 数字运算符的函数实现,比如 tor.sub(m,n)等价于m - n
random                  多种伪随机数生成器
    

三、总结

(1)数字的处理比较繁琐复杂,先有个整体了解,以后进一步加强。
(2)数字类型的相关模块还有很多,可根据实际项目的需求参考网上第三方的包。

(3)random模块包括多个伪随机数发生器,可以当前的时间戳为随机数种子。


#############################################3

转自:http://blog.csdn.net/taiyang1987912/article/details/44037389

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值