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。

原文发布于微信公众号 - 玄魂工作室(xuanhun521)

原文发表时间:2016-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java面试题:如何对HashMap按键值排序

Java中HashMap是一种用于存储“键”和“值”信息对的数据结构。不同于Array、ArrayList和LinkedLists,它不会维持插入元素的顺序。

762
来自专栏黑泽君的专栏

自定义异常的实现和测试以及异常的注意事项

/* * java不可能对所有的情况都考虑到,所以,在实际的开发中,我们可能需要自定义异常类。 * 而我们自己随意的写一个类,是不能作为自定义异常类来看待的...

4971
来自专栏深度学习与计算机视觉

算法-数字在排序数组中出现的次数

题目: 统计一个数字在排序数组中出现的次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现的次数就是3。 解题思路: 1.首先,遍历数组肯...

2095
来自专栏mwangblog

链表第一课

链表由节点(Node)组成,一个节点包含两个变量,一个变量存储我们需要保存的数据,另一个变量指向下一个节点,如下图所示:

1013
来自专栏desperate633

LintCode 最长上升连续子序列题目样例分析1(普通解法)分析2(使用队列)

给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列...

822
来自专栏Pythonista

Go 语言数据类型

数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

661
来自专栏和蔼的张星的图像处理专栏

76. 最长上升子序列动态规划+二分查找

给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能...

5461
来自专栏java学习

Java每日一练(2017/8/17)

每日一句 学的到东西的事情是锻炼,学不到的是磨练。 查看以前的所有练习题目以及答案:https://mp.weixin.qq.com/mp/homepage?_...

2889
来自专栏彭湖湾的编程世界

【数据结构】实现字典API:有序数组和无序链表

参考资料 《算法(java)》                           — — Robert Sedgewick, Kevin Wayne 《数据结...

3315
来自专栏Phoenix的Android之旅

Java面试的基础中的基础

面试时经常从Java的基础知识开始,最基础的部分莫过于Java的集合类型。我们知道Java的集合类型有三种,Set,List,Map,那这三种有什么区别呢。

981

扫码关注云+社区

领取腾讯云代金券