python判断是否为数字(整型、浮点型)_python基本数据类
型之整型和浮点型
python基本数据类型之数字与浮点型
在python3中,整数的数据类型为int,⽽浮点数的数据类型为float。python2中整数可以是int和long(长整型)两种类型,python3只保留了int,去除了long。
整型
int也属于不可变类型,即int类型的变量⼀旦在内存中被创建就⽆法改变。int类型本⾝的内置⽅法并不多,仅有4个⽅法:bit_length()、conjugate、from_bytes、to_bytes。
1、bit_length() 该⽅法是获取某个数字⼆进制形式的位数。
i = 5
v = i.bit_length()
print(bin(i))
print(v)
打印结果:
0b101浮点型变量float
3
可以看到,5被转换成⼆进制就是101,该数字的⼆进制形式有3位。
2、conjugate 该⽅法是⽤来操作复数的。在python中,复数的表⽰⽅法为:real(实部) + image j(虚部)。实部和虚部都可以是浮点类型(float),虚部的后缀可以是j或J。conjugate⽅法可以返回复数的共轭复数。
i = (12 + 3.4j)
v = i.conjugate()
print(v)
打印结果:(12-3.4j) 注意,在定义复数的时候,尽量带上⼩括号,这样可以更加明确变量之间的关系。
3、from_bytes、to_bytes from_bytes是将bytes类型的变量转化为⼗进制的数字。该函数是⼀个类函数(可以⽤类名直接调⽤的函数)。from_bytes⼀共有4个参数,其中⼀个参数是保留参数。 int.from_bytes(bytes, byteorder, *, signed=False)
bytes 字节类型的变量
bytesorder 字节类型变量的排序⽅式,'big'表⽰⾼位在前,低位在后;'little'表⽰低位在前,⾼位在后。
signed 是否考虑符号位,默认为False,即不考虑符号位
例如:
s1 = b'\xff\xf1'
print(int.from_bytes(s1, byteorder='big', signed=True))
打印结果: 15 分析该⽅法的作⽤过程:
⾸先声明了⼀个bytes类型的变量s:s1 = b'\xff\xf1',在引号前加上b表⽰该变量是bytes类型,\x表⽰
后⾯两位是⼗六进制数字。
将 \xff 写成⼆进制数字:1111 1111,\xf1 则写成:1111 0001,由于⾼低位标识为'big',即ff为⾼位,f1为低位,(如果是'little',则ff是低位,f1是⾼位),所以整个数字的⼆进制形式为:11111111 11110001。
⼜因为signed=True,所以要考虑符号位。因为该数字的第⼀位是1,因此它是⼀个负数。⼗进制要⽤补码来表⽰,⽽负数的补码就是原码(除符号位外)取反加1。因此取反加1后的结果为:10000000 00001111。因此表⽰成⼗进制就是 -15。
另外⼀个例⼦:
s1 = b'\xff\xf1'
print(int.from_bytes(s1, byteorder='little', signed=False))
打印结果:61951 在这个例⼦中,byteorder='little',表⽰ff是低位,f1是⾼位,则整个⼆进制数写作:11110001 11111111;signed=False表⽰不考虑符号位。因此表⽰为正数,结果就是61951。
to_bytes表⽰将某个数转换为⼗六进制表⽰,是from_bytes函数的逆过程。
_bytes(61951, length=2, byteorder='little', signed=False))
打印结果:b'\xff\xf1' to_bytes函数的参数与from_bytes的参数意义基本⼀致,其中length=2指定转换后的bytes类型⽤2位来表⽰,即\xff、\xf1两位。
浮点类型
python中的浮点数类型为float,其中包含的⽅法有:as_integer_ratio、conjugate、fromhex、hex、is_integer conjugate的⽤法与int中的内置⽅法⼀样,因此不再赘述。
1、as_integer_ratio 该⽅法可以将某⼀个浮点数表⽰成两个整型(最⼩整数)之⽐的形式。 例如:
t = 10.5
print(t.as_integer_ratio())
打印结果:(21, 2)
该⽅法其实是将浮点数转换成分数形式,当遇到负数时,该⽅法会保证分母为正。
t = -0.25
print(t.as_integer_ratio())
打印结果:(-1, 4) 该⽅法寻的是最精确的整数之⽐,所以当输⼊的⼩数特别复杂时,寻到的最⼩整数也就越⼤。
t = -0.99
print(t.as_integer_ratio())
打印结果:(-4458563631096791, 4503599627370496) 当寻的最精确⽐值中的整数超出int类型最⼤值时,会产⽣内存溢出的错误。
2、fromhex、hex fromhex⽅法是将⼀个⼗六进制⽤⼗进制进⾏表⽰。
f1 = '0x1.fp1'
print(float.fromhex(f1))
打印结果:3.875 0x1.fp1中的符号表⽰意义如下:
0x 表⽰该数字是⼀个⼗六进制数字
1.f 这个是数字部分
p1 科学计数法,p1的意思是2^1, 即2的1次⽅。
该函数的转换过程是:
1.f转换成⼆进制表⽰为:1.1111;
1.fp1表⽰的是1.111 * 2^1, 也就是将⼩数点右移⼀位,该数字表⽰为⼆进制:11.111。
将11.111转换成⼗进制。乘以2^(n-1)次⽅, 1*2^1 + 1*2^0 + 1*2^(-1) + 1*2^(-2) + 1*2^(-3) = 2 + 1 + 0.5 + 0.25 + 0.125 = 3.875。
⽽hex则是fromhex的逆过程,即将⼗进制数字转换成⼋进制表⽰。该过程同样也需要⼆进制作为中介。
f2 = 7.875
print(float.hex(f2))
打印结果:0x1.f800000000000p+2 该函数的过程如下:
将⼗进制数字拆分为整数部分和⼩数部分。7.875分为7 + 0.875
对于整数部分,让其除以2,不断取余,并逆序取值。
7 / 2 = 3...1(余1)
3 / 2 = 1 (1)
由最后得到的1往上取,即7 = 111b
对于⼩数部分,使其不断乘以2,取其整数部分,并顺序取值。
0.875 * 2 = 1.75(取1)
0.75 * 2 = 1.5(取1)
0.5 * 2 = 1
由第⼀个得到的1向下取,即0.875 = 0.111b
所以7.875转换成⼆进制为:111.111,使⽤科学计数法表⽰为:1.11111p2
将1.11111补齐:1.1111 1000,四位⼀取,即1.f8
所以7.875(10)转换成⼋进制:1.f8p2。
3、is_integer 该⽅法⽤来判断⼀个浮点数是否是整数,即能否精确转换成整数(⼩数部分是否全为0)。
i = 3.00
v1 = i.is_integer()
print('v1 = '+ str(v1))
i2 = 4.12
v2 = i2.is_integer()
print('v2 = '+ str(v2))
打印结果:
v1 = True
v2 = False
可以看到,当⼩数部分不全为0时,该⽅法返回的就是False。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论