3.2 数值类型
在数值类型方面,Python不仅仅提供了传统类型,如“整型”,“浮点型”以及“多进制数”等。还还提供复数、分数、小数等类型。不同于其他编程语言,只要有内存空间足够大,Python中的整数的位数可以随意增长。
3.2.1 基本数值类型
整数
整数概念
整数类型,与数学中整数的概念相同。整数包括了正整数、负整数和零。我们日常生活中使用的是十进制数。Python默认采用十进制来显示整数数值,无需增加引导符号。如果要使用其他进制数,则必须在这些数之前加上引导符号。表[]是进制数的引导符号,以及使用方式。
表
十进制(Decimal)
无
100
100
由字符0~9组成
二进制(Binary )
0b或0B
0b1011或 0B1011
11
由字符0~1组成
八进制(Octal)
0o或0O
0o701或0O701
449
由字符0~7组成
十六进制(Hexadecimal)
0x或0X
0xFA1或0XFA1
4001
由字符0~9,a到f(或A到F)组成
在Python描述器中输入不同的进制数,Python描述器会自动将其转换为十进制数。
>>>0xFA1
4001
进制转换
在实际问题中,我们有时需要对不同进制的整数进行转换。表[]列举了进制转中常用的四种函数。
表
bin
bin(1024)
0b10000000000
将十进制数转换为二进制数
oct
oct(1024)
0o2000
将十进制数转换为八进制数
hex
hex(1024)
0x400
将十进制数转换为十六进制数
int
int(‘1024’, n)
139(以n=5,将1024转换为五进制数为例)
将进制数转换为十进制数
bin,oct,hex函数的传入参数为数值类型,bin的第一个传输参数为整数对应的字符类型,第二个参数为需要转换的数字的进制。
例:将1024分别转为二进制数,八进制数,十六进制数和五进制数
>>> bin(1024), oct(1024), hex(1024), int('1024', 5)
('0b10000000000', '0o2000', '0x400', 139)
浮点数
**浮点类型(float)**是含有小数部分的数值。浮点数可以带一个小数点,也可以加上一个科学计数符e或者E。Python使用双精度浮点数,有效数字16位。
科学记数法是一种记数的方法。把一个大于10(或者小于1)的数表示成a与10的n次幂相乘的形式(1≤a<10,n为整数),这种记数法叫做**科学记数法。**以python浮点数表示为例,2.77E-3转换为数学符号为,即0.00277;3.11E4转换为数学符号为,即3110。
当浮点数与整数进行算数运算时,运算结果是什么类型?答案是浮点型。在混合类属性表达式中,Python总是将参与运算的数据对象转换成最复杂的对象类型,然后使用此对象类型下定义的运算方法对数据对象进行处理。
我们使用python中的type函数,可以查看对象的类型。
>>>x=3
>>>y=0.14
>>>type(x), type(y)
(<class 'int'>, <class 'float'>)
>>>type(x+y)
<class 'float'>
由上例,我们可以看到x是整型类型,y是浮点类型,当x与y进行运算后,结果是浮点类型,与y的类型保持一致。
这种使用相同运算符对不同对象类型进行不同运算的操作,称为运算符重载。这种特性被称为多态。
我们还可以人工对整数或浮点数等进行强制类型转换:
>>>int(x+y)
3
>>>type(int(x+y))
<class 'int'>
>>>float(x)
3.0
>>>type(float(x))
<class 'float'>
小数
**小数(Fraction)**是一种较新的数值类型。小数与浮点数很相像,不同的是,小数是拥有固定精度的浮点数。因此,小数对象拥有固定的位数和小数点。我们通过调用decimal模块,而不是通过字面量表达式来创建。通过使用小数对象,我们可以得到保留两位小数的浮点数。
小数对象的创建方法如下:
>>>from decimal import Decimal
>>>Decimal(‘0.1’) #我们使用Decimal函数创建了小数0.1
当有不同位数的小数在表达式中混编时,python可以将运算结果的位数保留为精度最高的位数。
>>>Decimal('0.1')+Decimal('0.01')+Decimal('0.001')+Decimal('0.0001')
Decimal('0.1111')
>>>print(Decimal('0.1111')) #使用print函数显示
0.1111
因为计算机中用来存储数值的空间有限,所以浮点数缺乏精确性。我们使用小数可以避免浮点数运算在精度方面存在的问题。
分别使用浮点数和小数对表达式进行计算
>>>0.1+0.3+0.2-0.6 #使用浮点数进行计算
1.1102230246251565e-16
>>>Decimal(‘0.1’)+Decimal(‘0.3’)+Decimal(‘0.2’)-Decimal(‘0.6’)
Decimal('0.0')
值得注意的是,Decimal函数的传入参数为小数对应的字符串,这也就意味着,需要对传入的小数加引号或使用str函数将其转为字符串,如果不这样做就会出现拥有超长位数的小数。
>>> Decimal(0.1)+Decimal(0.3)+Decimal(0.2)-Decimal(0.6)
Decimal('2.775557561570313080847263336E-17')
我们通过对decimal.getcontext().prec的值进行修改,来获取我们希望得到的特定位数的小数。
>>>import decimal
>>>decimal.Decimal(3)/decimal.Decinal(11)
Decimal('0.2727272727272727272727272727')
>>>decimal.getcontext() #获取当前环境
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1,
clamp=0, flags=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero,
Overflow])
>>> decimal.getcontext().prec=3 #设定保留位数3位
>>> decimal.Decimal(3)/decimal.Decinal(11)
Decimal('0.273')
>>> Decimal(0.1)+Decimal(0.3)+Decimal(0.2)-Decimal(0.6)
Decimal('2.22E-17')
分数
**分数(Fraction)**是一种较新的数值类型。Python中的分数,显示了一个分数的分子和分母。这样做的好处也是显然的:分数的使用避免了浮点数运算的局限性。虽然和小数一样,它们都不像浮点数那样接近于计算机的底层硬件,因此执行效率无法达到浮点数的水平。但是它们却能提供比浮点数更加精确的计算结果。特别是分数的出现,既保证了计算的准确性,又简化了计算结果,可以为Python代码的编写带来极大的便利。
使用分数对象需要导入Fraction模块。
分数对象的创建方式如下:
>>>from fractions import Fraction
>>>x=Fraction(1, 3) #Fraction的第一个参数为分子,第二个参数为分母
>>>x
Fraction(1, 3)
>>>print(x)
1/3
还可以使用浮点数字符串来创建分数对象,创建方式如下:
>>>Fraction(‘.33’) #创建值为0.32的分数
Fraction(33, 100)
例:计算:
>>>sum= Fraction(1, 3)+ Fraction(1, 3)+ Fraction(1, 3)
>>>sum
Fraction(1, 1)
>>>float(sum)
1.0
复数
复数类型,与数学中的复数类型概念保持一致。在数学上,我们把形如的数称为复数,其中a和b均为实数,a称为实部,b称为虚部,虚部后以i结尾。不同于数学上虚部的表示法,在Python中,虚部以j或者J结尾。
分数对象的创建方式有两种,一种是直接键入a+bj,另一种是借助complex函数对复数进行创建。
complex函数的使用方法如下:
complex([real[, imag]])
complex函数的第一个参数位复数的实部, 第二个参数为复数的虚部。
下面让我们来创建复数3+4i:
>>>3+4j
(3+4j)
>>>complex(3, 4)
(3+4j)
例:计算(1+1i-3+5i)*4+(4*3i)*5i 的运算结果
>>> (1+1j-3+5j)*4+(4*3j)*5j
(-68+24j)
3.2.2 表达式运算符
表达式运算符
算术运算符
+, -, *, /
加减乘除四则运算符
**
幂运算
//
向下取整
%
模(取余)运算
关系运算符
>, >=, <, <=
大小比较,集合的子集和超集
==,!=
值等价运算
赋值运算符
=
赋值
<算数运算符]>=
对x与y执行算数运算x=x<算数运算符> y
位运算符
&,|,^,~
位与、位或、按位异或、按位取反运算
<<,>>
左移,右移运算
逻辑运算符
and, or, not
与、或、非运算
身份运算符
is, is not
检测两个对象是否相同
成员运算符
in ,not in
检测对象是否在序列类型中
运算符优先级
1
**
指数运算
2
~,+,-
按位取反,取正,取负
3
*,/,%,//
乘,除,模,整除
4
<<,>>
左移,右移
5
&
位与运算
6
^,|
位异或,位或运算
7
<=,>=,<,>
比较运算
8
< >, == ,!=
等价运算
9
=, %=, /=, //=, -=, += *=, **=
赋值运算
10
is,is not
身份运算
11
in, not in
成员运算
12
not, or, and
逻辑运算
3.2.3 内置数学函数
表是抄来的 需要重修排序,改说法
divmod(a, b)
分别取商和余数 注意:整型、浮点型都可以
float([x])
将一个字符串或数转换为浮点数。如果无参数将返回0.0
int([x[, base]])
将一个字符转换为int类型,base表示进制
long([x[, base]])
将一个字符转换为long类型
pow(x, y[, z])
返回x的y次幂
range([start], stop[, step])
产生一个序列,默认从0开始
round(x[, n])
四舍五入
sum(iterable[, start])
对集合求和
bool([x])
将x转换为Boolean类型
内置函数
1.数学运算
abs:求数值的绝对值
>>>abs(-5)
5
divmod:返回两个数值的商和余数
>>> divmod(3,2)
(1, 1)
max:返回可迭代对象中元素的最大值或者所有参数的最大值
>>> max(1,4,7)
7
>>> max('1234')
'4'
min: 返回可迭代对象中元素的最小值或者所有参数的最小值
>>> min(1,4,7)
1
>>> min('1234')
'1'
pow:返回两个数值的幂运算
>>> pow(2,3)
8
round:对浮点数进行四舍五入运算
>>> round(3.1515926,4)
3.1416
sum:对元素类型是数值的可迭代对象中的元素进行求和
>>>sum((2,2.5,3,3.5)) #元素类型必须是数值型
11
2.类型转换
(1)int:将传入的参数转换成整数类型
>>> int() #不传入参数时,返回0
0
>>> int(5)
5
>>> int(2.5)
2
(2)float:将传入的参数转换成浮点数类型
>>> float() #不传入参数时,返回0.0
0.0
>>> float(5)
5.0
>>> float('5')
5.0
(3)bool:将传入的参数转换成布尔类型
>>> bool() #不传入参数时,返回False
False
>>> bool(0) #数值0、空序列等返回False
False
>>> bool(1)
True
Last updated
Was this helpful?