Python学习手册 [ 3 ]:数值类型


在Python中,数字并不是真的只是一种对象类型,而是一组相似类型的分类。Python不仅支持通常的数值类型(整数和浮点数),还提供了字面量来直接创建数字和表达式以处理数字。

完整的Python数值类型工具包括:

  • 整数和浮点对象
  • 复数对象
  • 小数:固定精度对象
  • 分数:有理数对象
  • 集合:带有数值运算的集合体
  • 布尔值:真和假
  • 内置函数和模块:round、math、random等
  • 表达式;无限制整数精度;位运算;十六进制、八进制和二进制格式
  • 第三方扩展:向量、库、可视化、作图等

一.数值字面量

1.整数和浮点数

整数写成十进制数字的串。
浮点数带一个小数点,也可以加上一个科学计数标志e或者E。

代码示例如下:

a=12
b=1.2
c=12e-2

2.十六进制、八进制和二进制

  • 字面量
    (1)十六进制数以0X或者0x开头,后面接十六进制的数字0-9和A-F(大小写都可以)。
    (2)八进制数以0o或者0O开头,后面接数字0-7构成的数字串。
    (3)二进制数以0b或者0B开头,后面接二进制数字(0-1)
  • hex(I)、oct(I)和bin(I)分别把一个十进制整数转换为十六进制、八进制和二进制表示的字符串。

代码示例如下:

a=12
print(hex(a))
print(oct(a))
print(bin(a))
运行结果如下:
0xc
0o14
0b1100
  • 使用int(str,base)根据每个给定的进制把一个运行时字符串转换为一个整数。

代码示例如下:

a=int('12',16)
print(a)
运行结果如下:
18

3.位操作

除了一般的数学运算,Python还支持位操作,需要把整数作为二进制位串处理的运算。包括<<、>>、&、|等位操作。第一篇文章写在前面也已经有详细介绍,这里不再赘述。

4.复数

Python的复数字面量写成实部+虚部的写法,这里的虚部是以j和J结尾。复数还可以通过内置函数complex(real,imag)来创建。

代码示例如下:

a=2+3j
b=complex(2,3)

5.编写其他的数据类型

在Python中,需要导入某些模块并调用其函数来创建一些数值类型,如小数和分数。其他他的一些拥有它们自己的字面量语法,如集合。

二.表达式运算符

1.表达式运算符

Python的表达式运算符在第一篇文章写在前面已经有详细介绍,这里不再赘述。

2.运算符优先级

在混合运算中,需要遵循运算符优先级规则。第一篇文章写在前面也已经有详细介绍,这里不再赘述。

3.带括号的子表达式

子表达式带有括号时,会超越Python的优先级规则。Python总会先行计算圆括号中的表达式,然后再将结果用于整个表达式中。

4.混合运算转换

Python首先将被操作的对象转换为其中最复杂的操作数的类型,然后再对相同类型的操作数进行数学运算。(Python是这样划分数值类型的复杂度的:整数比浮点数简单,浮点数比复数简单。)

5.强制转换类型

可以通过手动调用内置函数来强制转换类型。

代码示例如下:

a=int(2.4)
b=float(3)
print(a)
print(b)
运行结果如下:
2 
3.0

6.运算符重载和多态

重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。如:‘+’可以表示加法或者拼接。
多态,指的是操作的意义由操作对象来决定。重载是多态的具体表现形式,多态是面向对象编程思想的一种特征。

7.普通比较和链式比较

普通比较:比较操作数的相对大小,返回一个布尔类型的结果。第一篇文章写在前面也已经有详细介绍,这里不再赘述。
链式比较:如表达式(A<B<C)等同于布尔测试(A<B and B<C)。(A==B<C)等同于布尔测试(A==B and B<C)。

补充:str和repr显示格式,str显示用户友好的格式,repr默认交互式命令行显示,像代码样式的结果。

三.除法

1.X/Y:经典除法(Python2.X)和真除法(Python3.X)

经典除法(截断除法):对于整数会省去小数部分,对于浮点数会保持余项(小数部分)。相当于math模块中math.trunc函数的功能。

真除法:即无论任何类型,最终的浮点数结果都会保留小数部分。

2.X//Y(向下取整法)

向下取整法:不考虑操作对象的类型,总会省略结果的小数部分,剩下最小的能整除的整数部分。相当于math模块中math.floor函数的功能。

四.其他内置工具

1.内置函数(无需导入)

  • pow函数:两个参数,第一个参数为底数,第二个参数为指数
  • abs函数:求绝对值,参数数目不限
  • round函数:针对操作数进行四舍五入取值。只有一个参数,默认舍弃小数部分;有两个参数,第二个参数表示取值的位数。结果是一个字符串。

2.math模块(需要事先导入)

  • math.pi:数学含义里的圆周率,3.141592653589793
  • math.e:数学含义里的自然数e,2.718281828459045
  • math.sin函数:求sin值
  • math.sqrt函数:求根
  • math.floor函数:向下取整,在(四)已有详细介绍
  • math.trunc函数:截断取整,在(四)已有详细介绍

3.random模块(需要事先导入)

  • random.random函数:随机生成一个浮点数。两个参数表示生成数的范围
  • random.randint函数:随机生成一个整型数。两个参数表示生成数的范围
  • random.choice函数:随机打乱一个序列中的元素,并且随机选择一个元素。参数为一个序列
  • random.shuffle函数:随机打乱一个序列中的元素。参数为一个序列

五.其他数值类型

1.小数类型

  • 创建小数对象:小数对象,正式的名称为Decimal。通过调用已导入模块decimal中的函数来创建小数。功能上和浮点数类似,但是有固定的位数和小数点。因此,小数是精度固定的浮点数
  • 设置全局小数精度:使用getcontext函数来设置小数的精度

代码示例如下:

from decimal import Decimal
from decimal import getcontext
# 设置小数精度为4,该精度将全局性地应用到调用线程中创建的所有小数
getcontext().prec=4
# 创建一个小数对象a
a=Decimal('1.14')
b=a/Decimal('7')
print(b)
运行结果如下:
0.1629

2.分数类型

分数(Fraction)是Python首次引入的一种新的数值类型,它实现了一个有理数对象。本质上,它显式地保持了一个分子和一个分母,从而避免了浮点数运算的某些不确定性和局限性。

  • 分数的创建:Fraction位于模块fractions中,需要导入其构造函数并传入一个人分子和一个分母,从而产生一个分数。
  • 浮点数转换为分数:使用float.as_integer_ratio()将浮点数转换为分数
  • 分数的混用:
    Fraction+int->Fraction
    Fraction+float->float
    Fraction+Fraction->Fraction

代码示例如下:

import fractions
# 创建一个分数
a=fractions.Fraction(1,3)
print(a)
# 将分数转换为分数
b=(1.5).as_integer_ratio()
print(b)
# 分数混用的格式
c=a+4
print(c)
d=a+1.2
print(d)
e=a+a
print(e)
运行结果如下:
1/3
(3, 2)
13/3
1.5333333333333332
2/3

3.集合

集合(set)是一些唯一的、不可变的对象的无序集合体,一个元素只能在集合中出现一次,不管它被添加了多少。集合是其他对象的集合体,兼备列表和字典的某些共有行为。如,集合是可迭代对象,可以按需增长或缩短,并且可以包含多种对象类型。

  • 集合可以通过表达式运算符支持一般的数学集合运算。要注意,我们不能对诸如字符串、列表和元组的一般序列使用下面的运算——我们必须将字符串、列表和元组传入set函数,并创建了相关的相应的集合后,才能使用这些工具。
  • 集合set的相关方法。下面展示集合相关的方法。

代码示例如下:

# 通过字面量直接创建一个集合
x={'h','e','l','l','o'}
# 通过set函数创建一个集合,参数为一个可迭代对象
x=set('hello')
x=set(['h','e','l','l','o'])
print(x)

x=set('hello')
# add函数:新增一个元素到集合;和update函数相比,只能添加一个元素
x.add(2)
print('add函数后结果:',x)

x=set('hello')
# update():更新集合,参数为可迭代对象;和add函数相比,可以添加多个元素
x.update((2,'aa'))
print('update函数后结果:',x)

x=set('hello')
# clear函数:清除集合所有元素
x.clear()
print('clear函数后结果:',x)

x=set('hello')
# copy函数:拷贝整个集合并赋值给变量
y=x.copy()
print('copy函数后结果:',y)

x=set('hello')
# pop函数:随机删除集合中一个元素,可以通过变量来获取删除的元素
x.pop()
print('pop函数后结果:',x)

x=set('hello')
# remove函数:删除集合中指定的元素,如果该集合内没有该元素就报错
x.remove('o')
print('remove函数后结果:',x)

x=set('hello')
# discard函数:删除集合中指定的元素,如果该集合内没有该元素也不会报错
x.discard('l')
print('discard函数后结果:',x)

x=set('hello')
y=set('hexxo')
# intersection  & :交集; union | :并集合; difference - : 差集
print('intersection函数后结果:',x.intersection(y))
print('union函数后结果:',x.union(y))
print('difference函数后结果:',x.difference(y))

# 使用frozenset定义不可变集合,该函数不可使用add或者pop方法
x=frozenset('hello')
print('frozenset函数创建集合后结果:',x)
运行结果如下:
{'e', 'o', 'l', 'h'}

add函数后结果: {2, 'o', 'e', 'l', 'h'}
update函数后结果: {2, 'o', 'aa', 'e', 'l', 'h'}

clear函数后结果: set()

copy函数后结果: {'e', 'o', 'l', 'h'}

pop函数后结果: {'o', 'l', 'h'}
remove函数后结果: {'e', 'l', 'h'}
discard函数后结果: {'e', 'o', 'h'}

intersection函数后结果: {'e', 'o', 'h'}
union函数后结果: {'o', 'e', 'l', 'h', 'x'}
difference函数后结果: {'l'}

frozenset函数创建集合后结果: frozenset({'e', 'o', 'l', 'h'})
  • 集合推导
    集合推导会运行一个循环并在每次迭代时收集一个表达式的结果,通过一个循环变量来访问当前迭代值以用于集合表达式中。其结果就是通过运行代码创建了一个新的集合,它具备所有一般的集合行为。

代码示例如下:

x=set('hello')
# 通过字面量收集集合推导的元素
y={p for p in x}
# 通过字面量收集集合推导的元素
y=set(p for p in x)
print(y)
运行结果如下:
{'l', 'e', 'h', 'o'}

4.布尔型

Python中有一个名为bool的显式布尔数据类型,带有True和False作为可用且预赋值的内置名称。在内部,名称True和False是bool的实例,而bool实际只是内置整数类型int的子类(从面向对象的角度来看)。True和False的行为与整数1和0是一样的,只不过它们有独特的显示逻辑:他们是作为关键字True和False显示的,而不是数字1和0。

5.数值拓展

Python有大量的第三方开源拓展可以用来解决更加专门的需求。Numpy,可选的Python拓展提供了高级的数值编程工具,如:矩阵数据类型、向量处理和精密的计算库。

【参考书目】:《Python学习手册》(第5版)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值