Python数值类型
数值类型
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语言的双精度浮点数精度相同
- 整数除了十进制整数外,还可以写成二进制、八进制、十六进制甚至是其它进制的整数,它们的转换方式见后文
- 当一个整数以
0b
或0B
开头,其后都是0、1时,默认识别为二进制整数 - 当一个整数以
0o
或0O
开头(数值零和大、小写的字母o),其后都是0-7之间的数值时,默认识别为8进制整数 - 当一个整数以
0x
或0X
开始,其后都是[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**10000
,3**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数值类型的更多相关文章
- Python 数值类型
1.数值类型分为整形(二进制(0b),八进制(0o),十进制,十六进制(0x) ),浮点型,long,complex(复合行) 当我们说十进制数的时候,是逢10进1,就是说到达10的时候就要向前一位进 ...
- python数值类型与序列类型
基本运算符 / 浮点除法 //整除 x**y x的y次方 python中严格区分大小写 type(xx)/内置函数,查看变量xx的类型 id(xx)/内置函数,查看变量xx的内存地址 //----- ...
- 12.Python数值类型(整形、浮点型和复数)及其用法
实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...
- Python数值类型和序列类型
int.float.bool这三个数值类型和常用序列类型的定义和使用 数值类型的基本计算 序列类型的索引取值.切片.成员运算等序列类型的通用操作 complex(复数).decimal(定点数).ma ...
- Python黑帽编程2.2 数值类型
Python黑帽编程2.2 数值类型 数值类型,说白了就是处理各种各样的数字,Python中的数值类型包括整型.长整型.布尔.双精度浮点.十进制浮点和复数,这些类型在很多方面与传统的C类型有很大的区 ...
- Python数值
一.python数值类型 python数值类型有以下四种: int(整数) float(浮点数) complex(复数) bool(布尔型) 注意:python3取消了long型. 二.python ...
- 简明python教程 --C++程序员的视角(一):数值类型、字符串、运算符和控制流
最初的步骤 Python是大小写敏感的 任何在#符号右面的内容都是注释 >>> help('print')在“print”上使用引号,那样Python就可以理解我是希望获取关于“pr ...
- 005 Python的数值类型
005 Python的数值类型 BIF 指的是内置函数,一般不作为变量命名.如 input,while,if,else,float,等等.整型:整数.(python3.0版本把整型和长整型结合在 ...
- python基础之数据类型和数值类型
python3的六大数据类型: 1.tuple元组 2.number数字 3.string字符串 4.set集合 5.list列表 6.dictionary字典 其中不可变数据3个:tuple.num ...
随机推荐
- Notes : <Hands-on ML with Sklearn & TF> Chapter 3
Chapter 3-Classification .caret, .dropup > .btn > .caret { border-top-color: #000 !important; ...
- [swarthmore cs75] Lab 0 Warmup & Basic OCaml
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第1次大作业. 什么是编译 编译就是执行Program->Program'转换的过程,如下 ...
- 移动端布局:视口viewport的理解
移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...
- 关于n维和n-1维欧式空间
我们从小就说,"点动成线,线动成面,面动成体",其中的空间的概念到底是啥?之前没有好好想过,在机器学习中多次遇到"空间"."超平面",&qu ...
- linux vg lv pv
= pv由物理卷或者分区组成 pv可以组成一个或者多个vg vg可以分成多个lv 方便扩展 pvs vgs lvs 可以查看当前存在的pv vg lv 我的centos硬盘20g 使用了一 ...
- winform窗体退出
winform主窗体退出需要在FormClosing事件里写入程序退出代码,防止程序明明退出了,而程序进程还没杀掉: private void FormMain_FormClosing(object ...
- 如何高效地写CSS--等以后有空多加总结一下
CSS写的并不多,如果从零开始的项目,自己一定想搬砖来得容易点.CSS编写一定有其工程化的方法,来时编写更加有效率. 考虑将CSS的预处理LESS.Sass或Stylus引入,或者将CSS的后处理Po ...
- C#分部类型解析
等待着元宵节的到来,过完元宵,这个年也算是过完了,也得开始出去挣钱了,过年回家感觉每个人都觉得很牛,只有自己太渣,为了避免年底再出现这样尴尬的局面,还是需要努力干活.争取当上CEO,赢取白富美,走上人 ...
- BCrypt加密算法
用户表的密码通常使用MD5等不可逆算法加密后存储,为防止彩虹表破解更会先使用一个特定的字符串(如域名)加密,然后再使用一个随机的salt(盐值)加密. 特定字符串是程序代码中固定的,salt是每个密码 ...
- Java核心技术卷一基础知识-第2章-Java程序设计环境-读书笔记
第2章 Java程序设计环境 本章内容: 安装Java开发工具箱 使用集成开发环境 选择开发环境 运行图形化应用程序 使用命令行工具 建立并运行applet本章主要介绍如何安装Java开发工具箱(JD ...