数值类型

python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。

   类型           示例
---------------------------------------
整数 1234, -24, 0
浮点数 1.23, 1., .2, 3.14e-10
八进制 0o177, 0O177
十六进制 0x9ff, 0X9ff
二进制 0b1010, 0B1010

需要说明的几点事项:

  • python 3.x中的整数不区分一般整数和长整型整数,3.x版本中的整数支持无穷精度
  • 任何时候浮点数都是不精确的。当带有小数点或科学计数的标记符号e或E,就表示这是浮点数
    • 当浮点数参与表达式的运算时,会以浮点数的规则进行运算,也就是整数会转换成浮点数类型
    • python中的浮点数精度和C语言的双精度浮点数精度相同
  • 整数除了十进制整数外,还可以写成二进制、八进制、十六进制甚至是其它进制的整数,它们的转换方式见后文
    • 当一个整数以0b0B开头,其后都是0、1时,默认识别为二进制整数
    • 当一个整数以0o0O开头(数值零和大、小写的字母o),其后都是0-7之间的数值时,默认识别为8进制整数
    • 当一个整数以0x0X开始,其后都是[0-9a-fA-F]之间的字符时,默认识别为十六进制

python中的数值类型是不可变对象,不可变意味着不可原处修改。假如a = 3333,那么现在内存中会有一个内存块保存数值对象3333,如果修改它,比如对它加上1操作a += 1,python将创建一个新的内存块用来保存新的数值对象3334,而不是在3333那个内存块中直接修改为3334,所以那个原始的数值3333就被丢弃了,它会等待垃圾回收器去回收。关于可变、不可变对象,后面的文章将会经常提到,请先留意这两个词。

数值基本运算

支持最基本的数学运算符号:+ - * / % **、取正负+x -x,地板除法//,除法和取模divmod(x, y)

>>> 123 + 345
468
>>> 345 - 123
222
>>> 1.5 * 4
6.0
>>> 2/5
0.4
>>> 2 % 3
2
>>> 3 ** 2
9
>>> 3.00 ** 2
9.0
>>> 3 ** 100
515377520732011331036461129765621272702107522001 >>> a = 3; b = -3
>>> -a, -b
(-3, 3)
>>> divmod(5, 2)
(2, 1)

可见,python的数值计算方式非常直接,且python 3.x中会自动为整数提供无穷精度。正如上面最后一个计算表达式(3**100),它将所有数字都显示出来了。就算是计算3**100003**1000000,python也不会报错,不过3的100万次方,显然需要花上一段时间来计算。这和其它编程语言有所区别,例如java中计算Math.pow(3,10000)将返回Infinity,表示无穷大。

又是几个注意事项:

  • python中的除法运算/得到的结果总是浮点数(例如9/3=3.0),后面还有一种地板除法(floor)不一样。
  • 当数值部分有小数时,会自动转换为浮点数类型进行运算,而且会自动忽略参与运算的小数尾部的0
  • 加号+和乘号*也能处理字符串:
    • +可以连接字符串,例如"abc" + "def"得到abcdef
    • *可以重复字符串次数,例如"a"*3得到"aaa""ab"*3得到"ababab"

其它数学运算方法

除了上面的基础算术运算符,还支持很多数值类型的运算符,例如:取反(~)、位移(>>)、位与(&)、位异或(^)、逻辑与(and)、逻辑或(or)

除此之外,还有几个python的内置数学函数:

pow():求幂,如pow(2,3)=8
abs():求绝对值,如abs(-3)=3
round():四舍五入,如round(3.5)=4
int():取整(截去小数部分),如int(3.5)=3
float():转换成浮点数,如float(3)=3.0
oct():十进制整数转换成八进制
hex():十进制整数转换成十六进制整数
bin():十进制整数转换成二进制
...等等...

还有专门的数学模块math、取随机数的模块random等。

浮点数

由于硬件的原因,使得计算机对于浮点数的处理总是不精确的。

例如,按照数学运算时,1.1-0.9=0.2,但实际得到的结果为:

>>> 1.1-0.9
0.20000000000000007

它以高精度的极限趋近的值来显示。上面的趋近结果大于按照数学运算结果,但并不总是如此,例如下面的运算则是小于数学运算的结果:

>>> 3.3-3.2
0.09999999999999964

由于浮点数不精确,所以尽量不要对两个浮点数数进行等值==和不等值!=比较.如果非要比较,应该通过它们的减法求绝对值,再与一个足够小(不会影响结果)的值做不等比较。

例如:

>>> (3.2-2.8) == 0.4
False >>> abs((3.2-2.8)-0.4) < 0.0002
True

最后,浮点数并非总是输出很长精度的值。正如前面的运算:

>>> 3.2+3.2
6.4
>>> 3/10
0.3

浮点数有两个特殊方法,一个是is_integer(),用来测试这个浮点数是否是整数,另一个是as_integer_ratio(),可以将浮点数转换成分子分母组成的元组,不过这个方法并非总是如你所想的那样友好。例如:

>>> (3.0).is_integer()
True
>>> (3.2).is_integer()
False >>> (2.5).as_integer_ratio()
(5, 2)
>>> (2.6).as_integer_ratio()
(5854679515581645, 2251799813685248)

浮点数总是不精确的,而且不能指定小数位数。但在python中,有一个专门的小数模块decimal,它可以提供精确的小数运算,还有一个分数模块fractions,也能提供精确的小数运算。

真除法、Floor除法和小数位截断

  • /:实现的是真除法。在python中,它总是返回浮点数值
  • //:实现的是floor地板除法,它会去掉除法运算后的小数位,以便得到小于运算结果的最大整数。如果参与运算的有小数,则返回浮点数,否则返回整数
  • 在math模块中,有地板函数math.floor()和天花板函数math.ceil()。它们的意义可以根据现实中地板、空气、天花板的高低位置来考虑。地板位于空气之下,地板运算的返回值是比空气小的最大整数,天花板位于空气之上,天花板运算的的返回值是比空气大的最小整数
  • round(x, N)是四舍五入,可以指定四舍五入到哪个小数位
  • math.trunc()是直接截断小数
  • 实际上int()函数自身就是字节截断小数的

看下面的示例。

真除法总是返回浮点数。

>>> 9/3
3.0
>>> 10/4
2.5
>>> 10/4.0
2.5
>>> -9/2
-4.5
>>> -9/2.0
-4.5

floor除法返回浮点数还是整数取决于参与运算的数是否包含浮点数。

>>> 9 // 3
3
>>> 10 // 4
2
>>> 10 // 4.0
2.0

对于正数的运算结果,floor除法是直接去除小数位的。对于负数结果,它是取比运算结果更小的负整数。。

例如,负数结果的floor除法:

>>> -9 // 3
-3
>>> -10 // 4
-3
>>> -10 // 3
-4

-10 / 4的结果是-2.5,floor要取比它小的最大整数,也就是-3。-10 / 3的结果是-3.3,floor要取比它小的最大整数,也就是-4。

除了真除法和floor除法,还有四舍五入round()和math.trunc()两种截断小数的方式。例如:

>>> round(10/4)
2
>>> round(-5.2/2)
-3 >>> import math # import表示导入某个模块
>>> math.trunc(5/2)
2
>>> math.trunc(-5.2/2)
-2

int()也可以直接截断小数。

>>> int(3.6)
3
>>> int(-3.6)
-3

数值类型的转换

  • int()可以将字符串或浮点数转换成整数,也可以用于进制数转换
  • float()可以将字符串或整数转换成浮点数

实际上它们表示根据给定参数在内存中构造一个整数、浮点数对象,所以可以用来作为类型转换工具。而且,前面已经说过,int()可以用来截断小数位。

>>> int(3.5)   # 浮点数 -> 整数
3
>>> int(-3.6) # 浮点数 -> 整数
-3
>>> int('3') # 字符串 -> 整数
3 >>> float(3) # 整数 -> 浮点数
3.0
>>> float('3') # 字符串 -> 浮点数
3.0

int()还可用于进制数转换,见下文。

小数类型(Decimal)

小数模块decimal,它有一个函数Decimal(),它是精确的,是可以指定小数位数的。

如果没有python基础,这里能看懂多少算多少,反正小数用的也不多。

例如,使用浮点数计算

>>> 0.1 * 3 - 0.3
5.551115123125783e-17

它本该等于0,但结果却是无限接近于0,因为计算机硬件用于存储数值位数的空间有限。

使用decimal模块的Decimal()可以构造精确的小数。例如:

>>> import decimal
>>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.3')
Decimal('0.0')

注意,Decimal()的参数都是字符串,如果不加引号,它还是会解释成浮点数。

>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

Decimal()的运算的结果会取最长的小数位数。

>>> decimal.Decimal('0.1') * 3 - decimal.Decimal('0.300')
Decimal('0.000')

可以设置decimal的精度,也就是小数位数。有两种范围的精度:全局范围、局部范围。

例如,没有设置精度时,会保留很多位数的小数。

>>> import decimal
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')

设置全局范围的精度为4,即保留4位小数:

>>> import decimal
>>> decimal.getcontext().prec = 4
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')

全局范围的精度表示整个线程执行时,这个模块的精度都是4。

还可以设置局部范围的精度,局部表示退出了这个范围就失效了。使用with/as语句可以设置局部精度,所以退出with/as语句块精度的设置就失效了。

>>> with decimal.localcontext() as ctx:
... ctx.prec = 2
... decimal.Decimal(1) / decimal.Decimal(7)
...
Decimal('0.14') >>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429') # 因为前面设置了全局精度为4

分数(Fraction)

分数模块fractions,它有一个函数Fraction(),它可以构建分数。有了分数之后,可以参与运算。分数和浮点数不同,分数是精确的。

同样地,如果没有python基础,这里能看懂多少算多少,反正用的也不多。

例如,构建分数三分之一。

>>> import fractions
>>> fractions.Fraction(1,3)
Fraction(1, 3)

还可以根据浮点数的字符串格式构建分数。

>>> fractions.Fraction('0.3')
Fraction(3, 10)

然后可以用分数进行运算。

分数加整数:

>>> fractions.Fraction(1,3) + 1
Fraction(4, 3)

分数加、减、乘、除分数:

>>> fractions.Fraction(1,3) + fractions.Fraction(2,3)
Fraction(1, 1)
>>> fractions.Fraction(1,3) - fractions.Fraction(2,3)
Fraction(-1, 3)
>>> fractions.Fraction(1,3) * fractions.Fraction(2,3)
Fraction(2, 9)
>>> fractions.Fraction(1,3) / fractions.Fraction(2,3)
Fraction(1, 2)

实际上,float对象有一个as_integer_ratio()函数,可以将浮点数转换成整数的元组表示形式(元组后面的文章会介绍),然后根据这个元组就可以构造出分数来。

例如,将2.5转换成元组,并进而转换成分数。

>>> (2.5).as_integer_ratio()
(5, 2) # 得到元组 >>> fractions.Fraction(*(2.5).as_integer_ratio())
Fraction(5, 2)

进制整数的转换

  • oct():十进制整数转换成八进制
  • hex():十进制整数转换成十六进制整数
  • bin():十进制整数转换成二进制

例如,将十进制的64转换成二进制、八进制、十六进制整数。

>>> bin(64),oct(64),hex(64)
('0b1000000', '0o100', '0x40')

int()函数也能进行进制转换,它的用法格式为:

int(x, base=10)

base指定要将x解释成哪个进制位的数,然后转换成十进制数,也就是前面说的构造一个整数对象。不指定base时,默认解释成10进制。

base的值可以是0或2-36之间的任意一个数,base=0也表示解释成10进制。

例如,将二进制的数转换为十进制整数。

>>> int('0b11',base=2)
3
>>> int('11',base=2)
3

既然x要解释成某个进制的数,那么超出这个进制的数自然不能出现。例如:

  • 将x解释成二进制数的时候,x里就不能包含除0、1之外的数(当然,前缀0b除外);
  • 解释成7进制,就不能出现7、8、9;
  • 解释成8进制,就不能出现8、9;
  • 解释成11进制,就只能出现0-9、a/A这些字符;
  • 12进制就只能出现0-9、aAbB这几个字符;
  • 36进制就只能出现0-9、a-zA-Z这几个字符。

例如,将一个字符串解释为15进制,并转换成整数。15进制只能出现0-9、a-eA-E这几个字符。

>>> int('93E', base=15)
2084

Python数值类型的更多相关文章

  1. Python 数值类型

    1.数值类型分为整形(二进制(0b),八进制(0o),十进制,十六进制(0x) ),浮点型,long,complex(复合行) 当我们说十进制数的时候,是逢10进1,就是说到达10的时候就要向前一位进 ...

  2. python数值类型与序列类型

    基本运算符 / 浮点除法 //整除 x**y  x的y次方 python中严格区分大小写 type(xx)/内置函数,查看变量xx的类型 id(xx)/内置函数,查看变量xx的内存地址 //----- ...

  3. 12.Python数值类型(整形、浮点型和复数)及其用法

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

  4. Python数值类型和序列类型

    int.float.bool这三个数值类型和常用序列类型的定义和使用 数值类型的基本计算 序列类型的索引取值.切片.成员运算等序列类型的通用操作 complex(复数).decimal(定点数).ma ...

  5. Python黑帽编程2.2 数值类型

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

  6. Python数值

    一.python数值类型 python数值类型有以下四种: int(整数) float(浮点数) complex(复数) bool(布尔型) 注意:python3取消了long型.  二.python ...

  7. 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流

    最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...

  8. 005 Python的数值类型

    005 Python的数值类型 BIF    指的是内置函数,一般不作为变量命名.如 input,while,if,else,float,等等.整型:整数.(python3.0版本把整型和长整型结合在 ...

  9. python基础之数据类型和数值类型

    python3的六大数据类型: 1.tuple元组 2.number数字 3.string字符串 4.set集合 5.list列表 6.dictionary字典 其中不可变数据3个:tuple.num ...

随机推荐

  1. leetcode - valid number 正则表达式解法

    import java.util.regex.Pattern; public class Solution { Pattern p = Pattern.compile("^[\\+\\-]? ...

  2. mac 命令行安装软件

    第一步需要在mac上安装brew工具 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mas ...

  3. shell脚本颜色输出(实例未编辑)

    颜色输出通过echo 输出,需要加-e echo -e "\033[背景颜色;字体颜色\033[0m" 背景颜色 40 设置黑色背景 41 设置红色背景 42 设置绿色背景 43 ...

  4. .Net Trace->Listeners->Remove

    今天在调试一个别人写的ASP.NET老程序,log文件怎么都写不了.web.config里的trace->listeners里有这么一行: <remove type="Syste ...

  5. django 图书管理系统

    一.图书管理系统 单表的增删改查 1.创建项目 2.注释掉中间件 就可以提交post 请求 3.配置静态文件 并手动创建static 文件夹存放静态文件  二.具体的数据库配置 1.创建数据库  2. ...

  6. lua 使用中遇到的坑总结

    前言 竹子是 java 程序员一枚,最近在做一个登录的改造,用 lua 实现,现在基本算是告一段落,然后在此分享下在过程中遇到的坑吧. 一定要注意使用 lua 的版本,版本不同,可能有的函数就没有了, ...

  7. kafka学习笔记——基本概念与安装

    Kafka是一个开源的,轻量级的.分布式的.具有复制备份.基于zooKeeper协调管理的分布式消息系统. 它具备以下三个特性: 能够发布订阅流数据: 存储流数据时,提供相应的容错机制 当流数据到达时 ...

  8. 腾迅云获取免费SSL证书并布置

    上次申请了SSL证书一直没时间布置,今天重新再来操作一次 首先需要申请SSL证书,腾迅云买的域名有免费一年的SSL证书申请,网址:https://console.cloud.tencent.com/s ...

  9. JavaScript变量与数据类型详解

    变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过变量名访问. 变量的作用就是用于存储值. 语法: 声明变量时,总是以关键字var打头.任何情况下都应该这样做.然后给变 ...

  10. [Swift-2019力扣杯春季初赛]4. 从始点到终点的所有路径

    给定有向图的边 edges,以及该图的始点 source 和目标终点 destination,确定从始点 source 出发的所有路径是否最终结束于目标终点 destination,即: 从始点 so ...