Python黑帽编程2.2  数值类型

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

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

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中,有关复数的概念如下:

l  虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数。

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

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

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

l  虚数部分必须有后缀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 操作符

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

操作

说明

bool

int

long

float

complex

x ** y

指数运算

+x

符号不变

-x

符号取反

~x

按位取反

   

x * y

乘法

x / y

除法

x // y

地板除

x % y

取余

x + y

加法

x - y

减法

x << y

位左移

   

x >> y

位右移

   

x & y

按位与

   

x ^ y

按位异或

   

x | y

按位或

   

abs(x)

取绝对值

bin(x)

整型->二进制字符串

   

bool(x)

布尔型转换

chr(x)

ASCII码->单字符串

   

complex(re, im)

实部为re,虚部为im的复数

divmod(x, y)

除法及取余

float(x)

浮点转换函数

 

hex(x)

整型->十六进制字符串

   

int(x)

整型转换

 

long(x)

长整型转换

 

pow(x)

指数运算

oct(x)

整型->八进制字符串

   

round(x[, n])

保留n位小数并四舍五入

 

unichr(x)

ASCII码->Unicode单字符串

 

在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”,获取更多内容。

Python黑帽编程2.2 数值类型的更多相关文章

  1. Python 黑帽编程大纲(变化中)

    Python 黑帽编程大纲(预览版) 教程说明: 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and Defense with Pytho ...

  2. Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)

    Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上) 网络嗅探,是监听流经本机网卡数据包的一种技术,嗅探器就是利用这种技术进行数据捕获和分析的软件. 编写嗅探器,捕获数据是前置功能, ...

  3. Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016

    Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Att ...

  4. Python黑帽编程1.2 基于VS Code构建Python开发环境

    Python黑帽编程1.2  基于VS Code构建Python开发环境 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...

  5. Python黑帽编程 2.0 第二章概述

    Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...

  6. Python黑帽编程2.3 字符串、列表、元组、字典和集合

    Python黑帽编程2.3  字符串.列表.元组.字典和集合 本节要介绍的是Python里面常用的几种数据结构.通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储.查询 ...

  7. Python黑帽编程2.5 函数

    Python黑帽编程2.5 函数 写了几节的基础知识,真心感觉有点力不从心.这块的内容说实话,看文档是最好的方式,本人的写作水平,真的是找不出更好的写法,头疼.简单带过和没写一样,写详细了和本系列教程 ...

  8. Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  9. Python黑帽编程2.9 面向对象编程

    Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...

随机推荐

  1. Python 创建本地服务器环境生成二维码

    一. 需求 公司要做一个H5手机端适配页面,因技术问题所以H5是外包的,每次前端给我们源码,我们把源码传到服务器让其他人访问看是否存在bug,这个不是很麻烦吗?有人说,可以让前端在他们的服务器上先托管 ...

  2. 【Java EE 学习 76 下】【数据采集系统第八天】【通过AOP实现日志管理】【日志管理功能分析和初步实现】

    一.日志管理相关分析 1.日志管理是一种典型的系统级别的应用,非常适合使用spring AOP实现. 2.使用日志管理的目的:对系统修改的动作进行记录,比如对权限.角色.用户的写操作.修改操作.删除操 ...

  3. 【转】Android 底层开发的几点

    我干了3年Android sdk开发,觉得到了瓶劲没法更进一步,于是花了一年多点时间,大概摸到点门径.根据前辈的经验,Android底层完全入门需要两年. 先说下我的入门过程:第零步,下载源码,我下的 ...

  4. C#运算符号

    double x=5.1e3;// 5.1乘以10 的3次方. x就是 5100 //注 :  5.1e+3=5.1e3=5.1e03=5.1e+03 double y=5.1e-3;// 5.1乘以 ...

  5. java中包的命令行(cmd)操作详解

    一.什么是包? 为了更好地组织类,防止在一个空间下出现类重名,Java提供了包机制.包是类的容器,用于分隔类名空间(类型于C++中的命名空间).如果没有指定包名,所有的示例都属于一个默认的无名包(又称 ...

  6. asterisk 通话噪音,自动挂断,回声等情况

    打开配置文件:cd /etc/asterisk/ vim chan_dahdi.conf 1: busydetect:忙音检测,如果开启,Asterisk会拨号尝试或通话中分析在线的音频,从而尝试识别 ...

  7. Spring MVC重定向和转发及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  8. 四则运算app代码上传GITHUB

    团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...

  9. 【NEUQACM OJ】1018: A+B again

    1018: A+B again 题目描述 谷学长有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B. 输入 输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T ...

  10. 【BZOJ】4144: [AMPPZ2014]Petrol

    题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...