58

博客园Logo
首页
新闻
博问
专区
闪存
班级

代码改变世界
搜索
注册
登录
返回主页
吾码
喜欢诗和代码…
还有一条狗和老二…
P.S.一条狗和老二是两只猫
博客园
首页
新随笔
管理
[python学习手册-笔记]003.数值类型

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 对象同一性测试
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*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]: 12<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<y
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
卧槽,这章终于写完了…就这样…

更多精彩内容,敬请关注公众号"吾码2016"

wmcoding

分类: python
好文要顶 关注我 收藏该文
不愿透露姓名的高杨
关注 - 2
粉丝 - 5
+加关注
0 0
« 上一篇: [python学习手册-笔记]002.python核心数据类型
posted @ 2020-11-26 21:24 不愿透露姓名的高杨 阅读(54) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
博客园派送云上免费午餐,AWS注册立享12个月免费套餐
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】阿里云钜惠返场,奖励继续赢5万现金,错过再等一年
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券

相关博文:
· HTML003元素
· (尚003).Vue_模板语法
· 003:Virtualenvwrapper使用
· 003设置JDK的环境变量
· 003-官网安装openstack之-keystone身份认证服务
» 更多推荐…
AWS免费套餐
最新 IT 新闻:
· 一文速览SpaceX首次载人商业发射 四名宇航员在太空生活半年
· 任正非:华为和荣耀不要藕断丝连 荣耀要做华为最强的竞争对手
· 复活有望!力帆重整计划草案获通过
· 中国降价海外疯涨!特斯拉全系欧洲多国大涨价 最高涨3.9万
· 悬崖边的傅盛,看猎豹坠落
» 更多新闻…
我的标签
python(6)
基础知识(4)
HTTP(1)
jsp(1)
随笔分类 (57)
java(21)
python(15)
常用工具(6)
零零散散(5)
网工十年(5)
网络与协议基础(5)
随笔档案 (71)
2020年11月(3)
2020年10月(1)
2020年6月(3)
2020年4月(1)
2020年3月(15)
2020年2月(8)
2018年6月(2)
2017年3月(2)
2016年12月(4)
2016年10月(1)
2016年9月(16)
2016年8月(9)
2016年7月(5)
2011年6月(1)
最新评论

  1. Re:FRP+WoL实现远程开机+远程桌面
    @KurtNiu IPV6还要解决下4to6的隧道问题…
    –不愿透露姓名的高杨
  2. Re:FRP+WoL实现远程开机+远程桌面
    直接上IPV6,就不用FRP了
    –KurtNiu
  3. Re:阿里云加Picgo或MPic搭建最豪横的图床
    楼主行文风格真舒服
    –春告鳥
  4. Re:FRP+WoL实现远程开机+远程桌面

    –黄树超
  5. Re:我的效率工具分享
    学习。。。
    –民工也Coding
    Copyright © 2020 不愿透露姓名的高杨
    Powered by .NET 5.0.0 on Kubernetes
上一篇:LeetCode 58 最后一个单词的长度


下一篇:剑指 Offer 58 - I. 翻转单词顺序