[python学习手册-笔记]003.数值类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[python学习手册-笔记]003.数值类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10449字,纯文字阅读大概需要15分钟。
内容图文
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]:?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<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
卧槽,这章终于写完了...就这样...
内容总结
以上是互联网集市为您收集整理的[python学习手册-笔记]003.数值类型全部内容,希望文章能够帮你解决[python学习手册-笔记]003.数值类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。