第五章 数值类型
1、Python中的数值并不是一个对象类型,而是多个相似的类型。
2、一个完整的Python数值工具箱包括:
- 整数和浮点数
- 负数
- 固定精度的十进制小数
- 有理数(能写成分子分母同为整数的分数)
- 集合
- 逻辑值
- 不限长度的整数
- 各种数值的内置类型和模块
一、数值类型基础
1、基础的数值类型
2、内置数值工具
(1)运算符:+, -, *, /, >>, **, & ...
(2)内置数学函数:pow, abs, round, int, hex, bin ...
(3)模块:random, math, cmath ...
3、Python表达式的运算符
(1)运算符优先级规则:表5-2由上到下优先级依次降低,同一优先级的运算符由左向右依次执行,一个特例是乘方(**)由右向左执行。
(2)可以用( )改变运算符的优先级,而且为了保险和阅读代码的方便,在复杂的表达式中要合理的使用括号。来看一下乘方的特例:
>>> 3 ** 2 ** 4
4304672
>>> (3 ** 2) ** 4
6561
>>> 3 ** (2 ** 4)
43046721
(3)混合类型的数值在一起运算,Python会自动将它们转化为最复杂的类型,进行运算后输出。
>>> 2 + 0.5 #整数 + 浮点数,返回浮点数
2.5
二、数值的实战用法
1、变量和基础的表达式
>>> # 最基本的表达式就是数学的草稿演算一样直观
>>> # 但是有一点:任何变量必须先赋值再引用
>>> a = 4
>>> b = 3
>>> a + 1, a * 3, a / b
(5, 12, 1.3333333333333333)
>>> c # 没有赋值直接引用产生错误
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
c # 没有赋值直接引用产生错误
NameError: name 'c' is not defined
2、比较运算:正常表达和链式表达
>>> x = 4
>>> y = 5
>>> z = 6
>>> (x < y) and (y < z) # 普通表达,加上括号增加易读性
True
>>> x < y < z # Python的链式表达,更简洁
True
3、除法:经典除法,整数除法,真正的除法
(1)Python3.x不存在经典除法,只有真正的除法。(Python2.x中,/都是整数除法,又称经典除法)
(2)整数除法运算符( // )在2.x和3.x中都适用:整数除法对精确除法的结果向下取整。
4、整数精度:Python2.x区分长整数和普通整数,3.x不做区分
5、复数
>>> a = 2 + -3j # 用j表示复数部分,而不是i
>>> b = complex(2, -3) # 两种构建复数的方法
>>> a == b
True
6、十六进制,八进制和二进制
>>> oct(64), int('0o100', 8) # 8<->10
('0o100', 64)
>>> bin(4), int('0b100', 2) # 2<->10
('0b100', 4)
>>> hex(256), int('0x100', 16) # 2<->16
('0x100', 256)
7、位运算:一种C语言中的运算,很少在Python中使用,故略去
8、其它内置工具
(1)math模块与内置函数
>>> import math
>>> math.pi, math.e # 常数
(3.141592653589793, 2.718281828459045)
>>> math.sin(0.5 * math.pi) # 函数
1.0
>>> abs(-2), pow(2, 3) # 内置函数
(2, 8)
(2)random模块
>>> import random
>>> random.random() #产生0~1的随机数
0.8699091619178752
>>> random.random() #产生0~1的随机数0.5316977101773829
>>> random.randint(1, 5) #产生1~5的随机整数,包括5
2
>>> random.randint(1, 5) #产生1~5的随机整数,包括5
5
>>> random.randrange(1, 5) #产生1~5的随机整数,不包括5
2
三、其它数值类型
1、decimal — 十进制小数
(1)数值错误:由于计算机是二进制的,因此不可避免的出现数值错误,如下例:
>>> 0.1 + 0.1 + 0.1 - 0.3 # 应该为0
5.551115123125783e-17
(2)Decimal事实上是一种固定精度的浮点数
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') -Decimal('0.3')
Decimal('0.0')
(3)设定小数精度:全局设置和局部设置
>>> import decimal
>>> decimal.Decimal('1.0') / decimal.Decimal('3.0')
Decimal('0.3333333333333333333333333333')
>>> decimal.getcontext().prec = 4 # 设定为4位小数
>>> decimal.Decimal('1.0') / decimal.Decimal('3.0')
Decimal('0.3333')
>>> decimal.Decimal('1.0') / decimal.Decimal('7.0')
Decimal('0.1429')
>>> with decimal.localcontext() as ctx: # 局部设置
ctx.prec = 2 # 2位小数
decimal.Decimal('7.0') / decimal.Decimal('9.0')
Decimal('0.78')
>>> # 超出with的范围,局部设置2位精度失效,但全局的4位精度仍有效
>>> decimal.Decimal('7.0') / decimal.Decimal('9.0')
Decimal('0.7778')
2、fractions — 分数
(1)解决decimal中的数值问题
>>> from fractions import Fraction
>>> Fraction(1, 10) + Fraction(1, 10) + Fraction(1, 10) - Fraction(3, 10)
Fraction(0, 1)
>>> print(Fraction(1, 10) + Fraction(1, 10) + Fraction(1, 10) - Fraction(3, 10))
0
(2)自动简化
(3)浮点数与分数的转化>>> Fraction(6, 12) # 自动简化
Fraction(1, 2)
>>> (2.5).as_integer_ratio()
(5, 2)
>>> f = 2.5
>>> z = Fraction(*f.as_integer_ratio())
>>> z
Fraction(5, 2)
>>> Fraction.from_float(1.75) # from_float方法
Fraction(7, 4)
>>> Fraction(*(1.75).as_integer_ratio())
Fraction(7, 4)
>>> # 不可避免的精度损失
>>> Fraction(*(4.0 / 3).as_integer_ratio())
Fraction(6004799503160661, 4503599627370496)
>>> a = Fraction(*(4.0 / 3).as_integer_ratio())
>>> a.limit_denominator(10) # 简化到最近的分数,精确到小数点后10位
Fraction(4, 3)
3、集合(Python3.x)
(1)集合是无序无重复的序列,只能包含具有不变性的对象(数字,字符串,元组)
(2)建立集合
>>> a = {1,2,3,4}
>>> a
{1, 2, 3, 4}
>>> b = set([1,2,3,4]) #set函数中放入列表,将其元素做为集合的元素
>>> b
{1, 2, 3, 4}
>>> b.add(1) #元素不重复
>>> b
{1, 2, 3, 4}
(3)集合的运算
>>> a = {1,2,3,4}
>>> b = {1,3,5}
>>> a - b # 减法或差集运算
{2, 4}
>>> b - a
{5}
>>> a > b # 判断b是否为a的子集
False
>>> b < a # 判断b是否为a的子集
False
>>> b.issubset(a) # 判断b是否为a的子集
False
>>> a | b # 并集运算
{1, 2, 3, 4, 5}
>>> a.union(b) # 并集运算
{1, 2, 3, 4, 5}
>>> a.intersection(b) # 交集运算
{1, 3}
>>> 3 in a # 检查某个元素是否在集合中
True
(4)为什么使用集合?
删除重复的元素:列表 -> 集合 -> 列表
追踪程序的循环状态:字典和集合是较好的选择
处理很大的数据集:数据库层面的应用
4、布尔值(逻辑值):使用逻辑True&False去表达逻辑值,不要用0或1这些比较难懂的值
5、其它数字扩展:NumPy, SciPy等第三方扩展