Python 黑帽编程 2.2 数值类型

数值类型,说白了就是处理各类各样的数字,Python中的数值类型包括整型、长整型、布尔、双精度浮点、十进制浮点和复数,这些类型在不少方面与传统的C类型有很大的区别。javascript

Python中的数值类型都是不可变类型,意味着建立、修改数字的值,都会产生新的对象,固然这是幕后的操做,编程过程当中大可没必要理会。java

2.2.1 标准整型和长整型

标准整型等价于C中的有符号长整型(long),与系统的最大整型一致(如32位机器上的整型是32位,64位机器上的整型是64位),能够表示的整数范围在[-sys.maxint-1, sys.maxint]之间。整型字面值的表示方法有3种:十进制(经常使用)、八进制(以数字“0”开头)和十六进制(以“0x”或“0X”开头)。程序员

# -*- coding:utf-8 -*-



a = 0101

print 'a='+str(a)



b=64

print 'b='+str(b)

c=-237

print 'c='+str(c)

d=0x80

print 'd='+str(d)

e=-0x92

print 'e='+str(e)复制代码

上面的代码输出结果为:编程

图2安全

长整型是整型的超集,能够表示无限大的整数(实际上只受限于机器的虚拟内存大小)。长整型字面值的后面带有字母“L”或“l”(推荐使用大写的“L”)。微信

长整型和标准整型,目前已经基本统一,当数学运算遇到整型异常的状况,在Python2.2之后的版本,会自动转换为长整型。例如:网络

图3函数

2.2.2 布尔型和布尔对象

布尔型实际上是整型的子类型,布尔型数据只有两个取值:True和False,分别对应整型的1和0。测试

每个Python对象都天生具备布尔值(True或False),进而可用于布尔测试(如用在if、while中)。编码

如下对象的布尔值都是False,除此以外是True:

None

False(布尔型)

0(整型0)

0L(长整型0)

0.0(浮点型0)

0.0+0.0j(复数0)

''(空字符串)

[](空列表)

()(空元组)

{}(空字典)

用户自定义的 类实例,该类定义了方法 nonzero() 或 len(),而且这些方法返回0或False

下面咱们经过几段代理来加深对布尔类型的认识。

# -*- coding:utf-8 -*-

#基本测试

print bool(1)

print bool(True)

print bool('0')

print bool([])

pring bool((1,))复制代码

结果以下:


图4

下面咱们看看bool类型做为只有0和1取值的特殊整型的特性。

# -*- coding:utf-8 -*-



#使用bool数

foo = 42

bar = foo<42

print bar



print bar+10

print '%s' %bar

print '%d' %bar复制代码

运行结果以下:

图5

再来验证下没有nonzero()方法的对象,默认是True。

#无_nozero_()

class C:pass



c=C()

print bool(c)复制代码

运行结果以下:

图6

2.2.3 双精度浮点型
Python里的浮点型数字都是双精度,相似C语言的double类型。能够用十进制或者科学计数法表示。下面咱们看一些典型的浮点型数字。

# -*- coding:utf-8 -*-

print 0.0

print -777.

print -5.555567119

print 96e3 * 1.0

print -1.609E-19复制代码

运行结果以下:


图7

2.2.4 复数

在Python中,有关复数的概念以下:

. 虚数不能单独存在,它们老是和一个值为0.0的实数部分一块儿来构成一个复数。

. 复数由实数部分和虚数部分组成。

. 表示虚数的语法:real+imagj.

. 实数部分和虚数部分都是浮点型。

. 虚数部分必须有后缀j或J。

下面是几个复数的例子:

print 64.375+1j

print 1.23e-045+6.7e+089j复制代码

运行结果以下:

图8

2.2.5 十进制浮点型
十进制浮点一般称为decimal类型,主要应用于金融计算。双精度浮点型使用的是底和指数的表示方法,在小数表示上精度有限,会致使计算不许确,decimal采用十进制表示方法,看上去能够表示任意精度。

下面咱们看一下十进制浮点的例子。

from decimal import *



dec=Decimal('.1')

print dec

print Decimal(.1)

print dec +Decimal(.1)复制代码

使用decimal类型,首先要引入decimal模块,而后经过Decimal类来初始化一个Decimal对象。

运行结果以下:


图9

2.2.6 操做符

下表是主要的操做类型,供参考。

在Python中同时支持不一样数值类型的数字进行混合运算,数字类型不一致怎么作运算?这个时候就涉及到强制类型转换问题。这种操做不是随意进行的,它遵循如下基本规则:

首先,若是两个操做数都是同一种数据类型,没有必要进行类型转换。仅当两个操做数类型不一致时, Python才会去检查一个操做数是否能够转换为另外一类型的操做数。若是能够,转换它并返回转换结果。

因为某些转换是不可能的,好比果将一个复数转换为非复数类型,将一个浮点数转换为整数等等,所以转换过程必须遵照几个规则。要将一个整数转换为浮点数,只要在整数后面加个.0就能够了。要将一个非复数转换为复数,则只须要要加上一个“0j”的虚数部分。

这些类型转换的基本原则是:整数转换为浮点数,非复数转换为复数。在 Python 语言参考中这样描述coerce()方法:

若是有一个操做数是复数,另外一个操做数被转换为复数。

不然,若是有一个操做数是浮点数,另外一个操做数被转换为浮点数。

不然, 若是有一个操做数是长整数,则另外一个操做数被转换为长整数;

不然,二者必然都是普通整数,无须类型转换。

数字类型之间的转换是自动进行的,程序员无须本身编码处理类型转换。Python 提供了 coerce() 内建函数来帮助你实现这种转换。

转换流程图以下图所示:


图10

2.2.7 转换工厂

函数 int(), long(), float() 和 complex() 用来将其它数值类型转换为相应的数值类型。从Python2.3开始,Python 的标准数据类型添加了一个新成员:布尔(Boolean)类型。今后 true 和 false 如今有了常量值即 True 和 False(再也不是1和0)。

下面是使用工厂函数的简单例子。


图11

2.2.8 进制转换

目前咱们已经看到Python支持8进制、十进制和十六进制整型,同时还提供了oct()和hex()内建函数来返回八进制和十六进制字符串。


图12

2.2.9 ASII 转换

chr函数和ord函数分别用来将数字转换为字符,和字符转换为数字。


图13

2.2.10 小结

本节对Python数值类型作个比较全面的讲解,网络编程过程当中会有大量的数值运算。

更高级的科学计算,推荐你们了解下两个著名的第三方包,NumPy和SciPy。

第2.3节《字符串、列表和元组》已经在微信订阅号抢先发布,心急的同窗进入订阅号(二维码在下方),从菜单“网络安全”—>”Python黑帽编程”进入便可。

本节视频教程获取方法,请扫描二维码,在菜单“网络安全”——>”Python黑帽编程”中找到对应的本文2.2.10节,有详细方法。

因为教程仍在创做过程当中,在整套教程完结前,感兴趣的同窗请关注个人微信订阅号(xuanhun521,下方二维码),我会第一时间在订阅号推送图文教程和视频教程。问题讨论请加qq群:Hacking (1群):303242737 Hacking (2群):147098303。

关注以后,回复请回复“Python”,获取更多内容。
相关文章
相关标签/搜索