Python黑帽编程2.2 数值类型
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 数值类型的更多相关文章
- Python 黑帽编程大纲(变化中)
Python 黑帽编程大纲(预览版) 教程说明: 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and Defense with Pytho ...
- Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)
Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上) 网络嗅探,是监听流经本机网卡数据包的一种技术,嗅探器就是利用这种技术进行数据捕获和分析的软件. 编写嗅探器,捕获数据是前置功能, ...
- Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016
Python黑帽编程1.1虚拟机安装和配置 Kali Linux 2016 0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Att ...
- Python黑帽编程1.2 基于VS Code构建Python开发环境
Python黑帽编程1.2 基于VS Code构建Python开发环境 0.1 本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- Python黑帽编程2.3 字符串、列表、元组、字典和集合
Python黑帽编程2.3 字符串.列表.元组.字典和集合 本节要介绍的是Python里面常用的几种数据结构.通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储.查询 ...
- Python黑帽编程2.5 函数
Python黑帽编程2.5 函数 写了几节的基础知识,真心感觉有点力不从心.这块的内容说实话,看文档是最好的方式,本人的写作水平,真的是找不出更好的写法,头疼.简单带过和没写一样,写详细了和本系列教程 ...
- Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- Python黑帽编程2.9 面向对象编程
Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...
随机推荐
- 【Java EE 学习 82 上】【MAVEN基本安装和使用方法】
一.Maven概述 1.什么是Maven? Maven中文意思是"行家"."专家",它是一种跨平台的项目管理工具. 2.Maven有什么作用? Maven能够实 ...
- Linux IPTABLES端口转发
之前在Linux上用普通用户部署了一个Tomcat,然后将其server.xml中的端口配置为80端口,用普通用户运行就提示绑定端口失败(permission denied),google了一下,原来 ...
- 【Android】一种提高Android应用进程存活率新方法
[Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...
- winform快速开发平台->让有限的资源创造无限的价值!
最近一直在维护一套自己的快速开发平台. 主要应对针对C/S架构下的项目.然而对winform这快,还真没有看到过相对好的快速开发平台, 何为快速,在博客园逛了了好久, 预览了很多通用权限管理系统. 确 ...
- Spring MVC初次相见
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
- Beginning Scala study note(2) Basics of Scala
1. Variables (1) Three ways to define variables: 1) val refers to define an immutable variable; scal ...
- 常用的sublime text插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
- Linux学习笔记(16)-多线程
什么是多线程?或者说,什么是线程? 按照书本上的描述,所谓线程,便是包含在进程内部的顺序执行流,是进程中实际运作的单位,也是操作系统能够进行调度的最小单位. 一个进程中可以并发多条线程,每条线程并行执 ...
- 1、Spring In Action 4th笔记(1)
Spring In Action 4th笔记(1) 2016-12-28 1.Spring是一个框架,致力于减轻JEE的开发,它有4个特点: 1.1 基于POJO(Plain Ordinary Jav ...
- 【Telerik】<telerik:RadComboBox>导出列表数据
近来在做项目,做到导出功能.使用<telerik:RadComboBox>的下拉框来实现导出部分或导出所有数据的功能.