003.数值类型

本系列文章是我个人学习《python学习手册(第五版)》的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展。

非商业用途转载请注明作者和出处;商业用途请联系本人(gaoyang1019@hotmail.com)获取许可。

「这不是演习!」

好了,从本章开始,我们就要正式进入python的学习.所涉及的内容深度会有所提升,但是还到不了学习完1+1=2之后就开始微积分推导的陡峭程度. 相关的补充内容我会以知识点补充或者外链的方式添加进来.

数值类型的基本知识

Python中的数值类型主要包括以下三类:

**整数:**也就是我们所熟悉的int类型. 在python3之中,不再区分整数和长整数.也就是说允许整数具备无限的精度. 当然,这个精度取决于我们计算机的内存大小.

「浮点数:」 浮点数在标准的CPython中,采用的是C语言的双精度浮点数. 其精度和构建python解释器的C语言编译器的双精度一致.具体的精度信息可以在sys.float_info中查看,如下图,详细解释请参考文档

「复数:」 复数由实部和虚部构成,字面量的写法可以写成a+bj的形式或者直接通过complex(real,imag)来构建

In [2]: import sys

# 双精度浮点数相关信息

In [3]: sys.float_info

Out[3]: sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

# 虚数的表示

In [4]: cmplx = complex(1,2)

In [5]: cmplx

Out[5]: (1+2j)

In [6]: type(cmplx)

Out[6]: complex

除了以上三种类型之外,python的数字类型还包括布尔类型.

字面量

相关的解释

1234,-24,0

整数类型,无大小限制

1.23,3.1415

浮点数类型

0o177,0x9ff,0b10011100

python3中的十六进制,八进制和十进制

3+4j,3.0+4.0J

复数

set("spam"),{1,2,3,4}

集合

Decimal('1.0'),Fraction(1,3)

小数和分数(有理数)

bool(X),True,False

布尔类型

各种进制的表示

python的整数默认采用十进制进行表示. 同样,也支持二进制,八进制,十六进制的表示.

**二进制:**0b或者0B开头表示

**八进制:**0o或者0O开头表示(注意第二个字符是字母o)

**十六进制:**0x或者0X开头表示

可以使用内置函数bin(I),oct(I),hex(I)来进行进制转换. 同时也支持int(str,base)将字符串转换为对应的十进制整数.

In [12]: a =11

In [13]: hex(a)

Out[13]: '0xb'

In [14]: oct(a)

Out[14]: '0o13'

In [15]: bin(a)

Out[15]: '0b1011'

# 将10按二进制转换为十进制

In [18]: int('10',base=2)

Out[18]: 2

# 将16进制ff转换为十进制

In [19]: int('ff',base=16)

Out[19]: 255

python的运算符

运算符

描述

yield x

生成器函数send协议

lambda args:expression

匿名函数

x if y else z

三元表达式

x or y

逻辑或

x and y

逻辑与

not x

逻辑非

x in y, x not in y

成员关系,用于可迭代对象和集合

x is y,x is not y

对象同一性测试

xy,x>=y

大小比较,集合的超集和子集

x==y,x!=y

值的等价运算

x|y

按位或,集合的并集

x^y

按位异或,集合的对称差集

x&y

按位与,集合的交集

x<>y

将x左移y位,将x右移y位

x+y

加法,拼接

x-y

减法,集合的差集

x*y

乘法,重复

x%y

求余数,格式化

x/y

真除法

x//y

向上去整

-x,+x

取负,取正

~x

按位取非

x**y

幂运算

x[i]

索引

x[i:j:k]

分片

x(...)

函数,方法,类,其他可调用对象的调用

x.attr

属性索引

(...)

元组,表达式,生成器表达式

[....]

列表,列表推导表达式

{....}

字典,集合,集合与字典的推导

上表中基本把python中的运算符表达式全部列举出来了. 而且是按照运算优先级从低到高的顺序列举出来的.

对于混合类型的运算,永远向着精度更高的方向进行.当然也可以通过内置函数来进行强制类型转换

In [4]: 40+3.14

Out[4]: 43.14

In [5]: int(3.14)

Out[5]: 3

In [6]: float(5)

Out[6]: 5.0

python的数值比较

数值的比较会输出一个布尔值,比如:

In [10]: 1<2

Out[10]: True

In [11]: 2.0>3

Out[11]: False

In [13]: 2.0!=2.0

Out[13]: False

看第三项可以知道,python是支持混合类型的数值比较的.如前面所说,python在进行混合类型的数值运算的时候,会先将其转换为精度更高的类型,然后再进行计算.

所谓链式比较如下例所示:

In [16]: 1<2<3

Out[16]: True

In [17]: 1==2<3

Out[17]: False

其中第一个等效于1<2 and 2<3,第二个等效于1==2 and 2<3

数值的比较是基于数值大小进行的,对于整型的比较是没问题的,但是对于浮点数的比较,就可能出现不可预知的错误. 比如以下的例子:

In [14]: 1.1+2.2 == 3.3

Out[14]: False

In [15]: 1.1+2.2

Out[15]: 3.3000000000000003

这个例子就有点让人匪夷所思了,1.1+2.2凭什么不等于3.3...

这是由于浮点数是有限的比特位数,导致无法精确的表示某些数值.这个问题不仅在python中存在,在其他语言中同样存在. 不过python有分数和小数,可以很好的规避这些问题. 毕竟python适合科学计算的特性不是白来的.

python中的除法

python中有三种风格的除法和两种除法运算符.

「X/Y」

这个是所谓的经典除法和真除法.在python2中,对于整数而言,会省略小数的部分,对于浮点数则会保留小数部分. 在python3中,无论整数还是浮点数,真除法都会保留小数部分.

In [18]: 4/2

Out[18]: 2.0

In [19]: 10/3

Out[19]: 3.3333333333333335

「X//Y」

向下取整除法,注意这个叫法,叫「向下」取整,也就是比真正结果小的那个最接近的整数.

In [20]: 10//4

Out[20]: 2

In [21]: 10//3

Out[21]: 3

向下取整除法(floor division)和截断除法的区别:

//操作符严格来说应该叫做向下取整除法,其获取的结果是「真正结果之下」的最接近的整数.这个对于正数来说比较好理解,舍弃小数的部分.对于负数而言,就是比其结果小的最接近的负数.

In [25]: 10//4,10//-4

Out[25]: (2, -3)

In [26]: 10//9,10//-9

Out[26]: (1, -2)

通过这两个例子就可以很好的看出来了.

那么python中的截断,可以通过math模块中的trunc方法实现

In [28]: import math

In [29]: math.floor(2.5)

Out[29]: 2

In [30]: math.floor(-2.5)

Out[30]: -3

In [31]: math.trunc(2.5)

Out[31]: 2

In [32]: math.trunc(-2.5)

Out[32]: -2

那对于所谓的截断除法,我们可以使用一种特殊的方式.

In [33]: 5//-2

Out[33]: -3

In [34]: math.trunc(5/-2)

Out[34]: -2

按位操作

按位操作在处理网络数据包,串行程序等二进制数据的时候十分方便,所以python中如C语言一样,也支持位移操作.

In [1]: x=1

# 左移两位

In [2]: x<<2

Out[2]: 4

# 按位或

In [3]: x|2

Out[3]: 3

# 按位与

In [4]: x&1

Out[4]: 1

# 按位异或

In [5]: x ^ 1

Out[5]: 0

其他的就不多说了,不难. 用到时候查下文档就完事儿了.

其他内置数值工具

数值处理相关的方法除了pow,abs这些内置方法之外,大部分的方法都在内置模块math之中. 这里举一些例子:

In [6]: import math

In [7]: math.pi

Out[7]: 3.141592653589793

In [8]: math.e

Out[8]: 2.718281828459045

In [9]: math.sin(90)

Out[9]: 0.8939966636005579

In [10]: math.sqrt(144)

Out[10]: 12.0

In [11]: pow(2,4)

Out[11]: 16

In [12]: abs(-42.1)

Out[12]: 42.1

In [13]: min(3,2,1)

Out[13]: 1

In [14]: max(1,3,4,9)

Out[14]: 9

# 四舍五入

In [15]: round(3.123),round(2,512),round(-3.123),round(-2.512)

Out[15]: (3, 2, -3, -3)

其他数值类型

复数

说实话,复数是个啥我都快忘了...但是python支持这玩意儿. 复数主要可以用在工程计算和科学计算中,当然作为一个数学学渣,心有余而力不足. 所以这一块不多说了. 简单说一下复数的表达形式.

python中的复数是由两个浮点数组成,分别表示复数的实部和虚部.可以写成 X+Yj的形式. 复数相关的处理方法主要集中在cmath模块中.

用到的时候再说吧,估计也用不到...

小数

python2.4之后引入了小数这种数据类型,正式名称叫做Decimal. 需要注意的是python中的Decimal类型和浮点数不是一个东西. 小数很像浮点数,但是小数有固定的位数和小数点.比如,我们可以使用小数对象实现一个只有两位小数位精度的浮点数.

根据之前的介绍我们已经了解了浮点数中一个诡异的现象,比如:

In [16]: 0.1+0.1+0.1-0.3

Out[16]: 5.551115123125783e-17

前文说过,这是由于浮点数存储位数有限造成的.那么python作为科学计算领域的老大,这么不严谨的事情,肯定是不允许发生的.所以python中定义了一中新的数据类型Decimal来解决这个问题.

In [18]: Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')

Out[18]: Decimal('0.0')

这里需要注意一点的是,上面我们是从字符串创建的小数对象.如果我们直接从浮点数创建小数对象呢?

In [19]: Decimal(0.1)+Decimal(0.1)+Decimal(0.1)-Decimal(0.3)

Out[19]: Decimal('2.775557561565156540423631668E-17')

完了,饶了一圈又回来了...

这是python处理的问题.直接从浮点数创建小数对象的话,这个转换是精确的,也就说浮点数会按照其存储的内容完完整整的被创建为小数.(感觉这一篇写完了是不是可以写一篇浮点数相关的文章...)

我们可以通过设置小数数值精度,舍入模式等方法来解决这个问题.(回头用到的时候再写吧,我现在也有点懵逼...)

分数

分数类型在python中称之为Fraction,实现了一个有理数对象.实质上就是显式的保持一个分子和一个分母,从而避免浮点数的精度问题. 分数的实现不像浮点数一样依靠底层硬件,所以,分数在性能上比浮点数要弱.

In [2]: from fractions import Fraction

# 1/3

In [3]: x=Fraction(1,3)

In [4]: y=Fraction(4,6)

In [5]: x

Out[5]: Fraction(1, 3)

In [6]: y

Out[6]: Fraction(2, 3)

In [7]: print(y)

2/3

In [8]: x+y

Out[8]: Fraction(1, 1)

集合

集合,就是数学上的那个集合.按照集合的定义,一个元素在集合中无论添加多少次,在集合中也都会表示为1次,也就说集合不能有重复的元素(初中数学好像是这么教的...) 所以集合这个类型在涉及数值和数据库的操作中是有着广泛应用的.

集合有着列表和字典的一些共同特性,比如集合是可迭代的对象,可以按需增长或者缩短,可以包含多种数据类型. 另外,集合中需要注意的,集合的元素是无序的.

集合的创建比较简单:

In [9]: x=set('abcde')

In [10]: y=set('abcfg')

In [11]: x

Out[11]: {'a', 'b', 'c', 'd', 'e'}

In [12]: y

Out[12]: {'a', 'b', 'c', 'f', 'g'}

集合支持数学上集合的那些操作:

# 差集

In [13]: x-y

Out[13]: {'d', 'e'}

# 并集

In [14]: x|y

Out[14]: {'a', 'b', 'c', 'd', 'e', 'f', 'g'}

# 交集

In [15]: x&y

Out[15]: {'a', 'b', 'c'}

# 异或(这个叫什么集啊...没学过呢...)

In [16]: x^y

Out[16]: {'d', 'e', 'f', 'g'}

# x是否为y的超集,y是否为x的超集

In [17]: x>y,x

Out[17]: (False, False)

集合也支持成员测试:

In [19]: 'a' in x

Out[19]: True

集合的修改:

In [20]: x.add('w')

In [21]: x

Out[21]: {'a', 'b', 'c', 'd', 'e', 'w'}

# 求并集

In [24]: x.update(set('awq'))

In [25]: x

Out[25]: {'a', 'b', 'c', 'd', 'e', 'q', 'w'}

In [26]: x.remove('q')

In [27]: x

Out[27]: {'a', 'b', 'c', 'd', 'e', 'w'}

集合作为一个可迭代对象,也支持len()方法和for循环以及列表表达式:

In [29]: for item in set('abc'):print(item*3)

bbb

ccc

aaa

「集合的另外一种创建方法」

# 可以直接使用{}来创建集合

In [30]: x={1,2,3,4}

In [31]: x

Out[31]: {1, 2, 3, 4}

In [32]: type(x)

Out[32]: set

这里需要注意的是,对于{}空的内容python依旧会认为其是一个字典,所以要创建空的集合还是要使用set()方法

In [34]: type({})

Out[34]: dict

作为一种可迭代对象,集合也支持推导表达式:

In [35]: {x for x in 'spam'}

Out[35]: {'a', 'm', 'p', 's'}

最后需要注意一点,python的集合有一个限制. 那就是集合中只能包含不可变的(可哈希化的)对象类型. 像列表,字典这样的玩意儿不能作为集合的元素.而像字符串,数字常量,元组这样的类型是可以作为集合的元素的.

「集合的优势」

上文中已经讲过,集合中的元素只能出现一次.除了实现集合的数学特性之外. 集合还可以用来过滤重复性数据,提取列表,字符串以及其他可迭代类型中的差异,也可以用来进行一些顺序无关的等价性测试.

# 使用集合进行重复项过滤

In [36]: L = [1,2,2,3,4,5,2,1]

In [37]: set(L)

Out[37]: {1, 2, 3, 4, 5}

In [38]: L=list(set(L))

In [39]: L

Out[39]: [1, 2, 3, 4, 5]

「差异数据的提取」

In [40]: set('while')-set('what')

Out[40]: {'e', 'i', 'l'}

In [41]: set(dir(bytes))-set(dir(bytearray))

Out[41]: {'__getnewargs__'}

「进行顺序无关性的两组数据的等价性测试」

In [45]: L1 = [1,2,3,4,5]

In [46]: L2 = [5,4,1,2,3]

In [47]: L1 == L2

Out[47]: False

In [48]: set(L1)==set(L2)

Out[48]: True

布尔类型

python的布尔型的定义和C语言有一点相似,本质上是int类型的子类. 有True和Flase两个实例.其实就是整数1和0的定制版. 布尔类型提高了python代码的可读性. 这让我们在设置flag的时候,更加形象. 我们可以写while True而不用写while 1

In [49]: type(True)

Out[49]: bool

In [50]: True+4

Out[50]: 5

In [51]: True ==1

Out[51]: True

In [52]: True is 1

Out[52]: False

卧槽,这章终于写完了...就这样...

python数值类型不包含复数_[python学习手册-笔记]003.数值类型相关推荐

  1. 语句与语法笔记:学会python中_doc_和pydoc——python学习手册笔记之3

    标题## 语句与语法:学会python中的_doc_和pydoc--python学习手册笔记之3 光看书不练习很难学好python,光看书不做点学习笔记,恐怕连书本的东西也是半知半解,不知所云.这手册 ...

  2. python 科学计数法转字符_转换科学计数法的数值字符串为decimal类型的方法

    转换科学计数法的数值字符串为decimal类型的方法 在操作数据库时,需要将字符串转换成decimal类型. 代码如下: select cast('0.12' as decimal(18,2)); s ...

  3. python中脚本是指什么_【学习猿地】初识python脚本 #千万别看,我怕你控制不住...

    >编写python程序的文件,称为python的脚本或程序 >要求当前的python脚本的文件后缀名必须是.py #### pycharm使用注意 > 需要明确的知道你当前pycha ...

  4. python内存回收垃圾有哪些_[Python之路] 内存管理垃圾回收

    一.python源码 1.准备源码 解压得到文件夹: 我们主要关注Include中的".h"文件以及Objects目录中的".c"文件. 我们从Include和 ...

  5. python import request 不报错_爬虫学习路径整理及安装环境遇到的坑

    学习路径是我自己提炼和精选的,只适合我个人,因为虽然有技术基础但是我刚入门爬虫视野很窄不专业,为避免误导你们,你们最好参考知乎上大牛已经回答的好答案.我发这篇文章,目的是给自己看的.ps,专栏下每篇文 ...

  6. python都能做什么图_如何学习数据分析

    展开全部 第1本<谁说菜鸟不会数据分析入门篇> 很有趣的数据分析书!基本看62616964757a686964616fe58685e5aeb931333365663539过就能明白,以小说 ...

  7. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  8. python打开excel执行vba代码_“Python替代Excel Vba”系列(终):vba中调用Python

    请关注本号,后续会有更多相关教程. 系列文章 学Python还不会处理Excel数据?带你用pandas玩转各种数据处理"Python替代Excel Vba"系列(二):panda ...

  9. python c++情侣网名含义_#python和C/C++#让python和C/C++联姻

    让python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/ ...

最新文章

  1. 量子物理学家:如果宇宙中所有物体突然消失,会剩下一个「空宇宙」吗?
  2. The CLR’s Execution Model(Chapter 1 of CLR via C#)
  3. 跨平台SSE、AVX指令测试
  4. 获取标签的src属性兼容性
  5. Oracle自动性能统计
  6. android studio:aar文件出现问号,导入不生效解决
  7. 基于图像处理技术的柑橘病害自动检测与分类
  8. 画面测试时,图片显示时,0件与N件的意义!
  9. Bailian4107 19岁生日礼物-Birthday Gift【进制】
  10. Java性能优化全攻略
  11. pandas groupby 数据丢失问题
  12. JS操作word文档
  13. KST-51单片机利用HC138芯片驱动数码管显示
  14. Java job interview:项目开发小组成员网站数据访问层设计
  15. 微生物和微生物组的定义以及发展史
  16. chrome浏览器跨域Cookie的SameSite问题导致访问iframe内嵌页面异常
  17. 关于QT跨平台和编译器的理解
  18. 亚马逊、Facebook在印度遭遇的最大阻力竟是中国!
  19. 黑客入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
  20. eps倾斜摄影矢量化采集毕业设计_eps倾斜摄影矢量化dlg采集#知识参考

热门文章

  1. android手机无法进行remount
  2. 【附源码】计算机毕业设计SSM宿舍供电管理系统
  3. 933计算机大纲,2017年北京航空航天大学933控制工程综合硕士研究生考试大纲
  4. 2021年9月11日-9月17日(抄写鬼火引擎每天300行+ue4视频教程每天1个,本周10小时。合计888小时,剩9112小时。)
  5. 百度编辑器umeditor字体字号设置无效的解决办法
  6. 车头车尾识别(有待完善)
  7. oracle触发器语句
  8. OpenStack 网络总结之:理解GRE隧道的工作流程
  9. springboot项目集成log4j2打成jar包 ,引入外边的log4j2文件,运行日志无法打印
  10. common.js 通用方法封装