Python Cookbook学习笔记ch3_01

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FANGLICHAOLIUJIE/article/details/82220644

第三章,这里查看效果更好奥

3.1数字的四舍五入

  • 问题:对一个浮点数执行指定精度的的舍入运算
  • 方案:使用内置的round(value,ndigits)
  • 注意:当一个数正好处于两个整数之间时,例如1.5或者2.5都会舍入为2。round()函数返回指定精度离他最近的偶数
round(1.23,1)
1.2
round(1.255,2)
1.25
round(1.27,1)
1.3
  • 传给round() 函数的ndigits可以为负数,这时涉入操作作用在十位百位等
a = 1627731.235
round(a,-1)
1627730.0
round(a,-2)
1627700.0
  • 如果只是想简单的输出一定宽度的数,使用格式化输出即可
x = 1.23456
format(x,'.2f')
'1.23'
format(x, '.3f')
'1.235'
'value is {:.4f}'.format(x)
'value is 1.2346'
  • 不要试着去舍入浮点值来修正结果,如下
a = 2.1
b = 4.2
c = a+b
c
6.300000000000001
c = round(c,2)
c
6.3

3.2执行精确的浮点数运算

  • 问题:上面的计算有时候会有一定的误差,如何避免
  • 方案:使用decimal模块
  • 问题的原因:计算误差是由于CPU和IEEE754标准去执行浮点数计算时导致的。浮点数的一个普遍问题是他们不能精确的表示十进制数
from decimal import Decimal
a = Decimal('4.2')
b = Decimal('2.1')
a + b
Decimal('6.3')
  • decimal的一个主要特征就是允许你控制计算机的每一个方面包括数字的位数和四舍五入运算。为此需要创建一个上下文并更改它的设置
from decimal import localcontext
a = Decimal('1.3')
b = Decimal('1.7')
print(a/b)
0.7647058823529411764705882353
with localcontext() as ctx:
    ctx.prec = 3
    print(a/b)
0.765
with localcontext() as ctx:
    ctx.prec = 50
    print(a/b)
0.76470588235294117647058823529411764705882352941176
  • 有时候需要注意大数和小数之间的运算会导致的问题。下面的运算导致1没有了。
nums = [1.23e+18,1,-1.23e+18]
sum(nums)
0.0
  • 上面的问题可以使用math.fsum()解决
import math
math.fsum(nums)
1.0

3.3数字的格式化输出

  • 问题:将数字进行格式化输出,并控制数字的位数、对齐、千位分隔符等细节
  • 方案:使用format() 函数
x = 1234.56789
format(x,'0.2f')
'1234.57'
format(x,'>10.1f')
'    1234.6'
format(x,'<10.2f')
'1234.57   '
format(x,'^10.2f')
' 1234.57  '
#千位分隔
format(x,',')
'1,234.56789'
format(x,'0,.2f')
'1,234.57'
  • 如果想使用指数表示法,只需要将f改成e或者E
format(x,'0,.2e')
'1.23e+03'
  • 同时指定宽度和精度一般的形式是 ‘[<>^]?width[,]?(.digits)?’,其中width和digits为整数,?代表可选部分

3.4二八十六进制的整数

  • 问题:进制之间的相互转化
  • 方案:bin()、oct()、hex()函数
x = 1234
bin(x)
'0b10011010010'
oct(x)
'0o2322'
hex(x)
'0x4d2'
  • 如果不想输出进制的前缀,可以使用format()
format(x,'b')
'10011010010'
format(x,'o')
'2322'
format(x,'x')
'4d2'
  • 整数是由正负的,如果处理负数,结果也会包含一个负号.
  • 如果想要一个无符号值,需要增加一个指示最大位长度的值
x = -1234
format(x,'b')
'-10011010010'
format(2**32 + x,'b')
'11111111111111111111101100101110'
  • 简单的使用int()函数即可,传入一个代表进制的参数
int('4d2',16)
1234
int('1234',8)
668

3.5字节到大整数的打包与解包

  • 问题:将一个字节字符串解压成一个整数,或将一个大整数转换为一个字节字符串
  • 方案:int.from_bytes()函数和int.to_bytes()函数
data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
len(data)
16
int.from_bytes(data,'little')
69120565665751139577663547927094891008
int.from_bytes(data,'big')
94522842520747284487117727783387188
x = 94522842520747284487117727783387188
x.to_bytes(16,'big')
b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
  • 字节顺序规则(little或者big)仅仅指定了构建了整数时字节的低位高位排列方式
x = 0x01020304
x.to_bytes(4,'big')
b'\x01\x02\x03\x04'
x.to_bytes(4,'little')
b'\x04\x03\x02\x01'

3.6复数的运算

  • 问题:如何计算复数
  • 方案:使用complex(real,imag)函数,或者带有j后缀浮点数来指定
a = complex(2,4)
a
(2+4j)
b = 2 - 3j
b
(2-3j)
a.real
2.0
b.imag
-3.0
a+b
(4+1j)
a*b
(16+2j)
abs(a)
4.47213595499958
  • 如果要执行其他的操作,可以引入cmath模块
import cmath 
cmath.sin(a)
(24.83130584894638-11.356612711218174j)
  • python标准数学模式不能产生复数值
import math
math.sqrt(-1)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-70-8956a835fc63> in <module>()
      1 import math
----> 2 math.sqrt(-1)


ValueError: math domain error
import cmath
cmath.sqrt(-1)
1j

3.7 无穷大与NaN

  • 问题:测试无穷大与NaN(非数字)的浮点数
  • 方案:使用float()创建它们
a = float('inf')
b = float('-inf')
c = float('nan')
a
inf
a+b
nan
math.isinf(a)
True
a+23
inf
10/a
0.0
math.isnan(c)
True

3.8分数运算

  • 问题:如何计算分数数学运算
  • 方案:使用fractions模块
from fractions import Fraction
a = Fraction(3,4)
b = Fraction(4,5)
print(a+b)
31/20
print(a*b)
3/5
print(a/b)
15/16
c = a*b
c.numerator
3
c.denominator
5
float(c)
0.6
  • 将一个小数转化为分数
x = 3.75
y = Fraction(*x.as_integer_ratio())
y
Fraction(15, 4)

猜你喜欢

转载自blog.csdn.net/FANGLICHAOLIUJIE/article/details/82220644