在python中,数字并不是真正的对象类型,而是一组类似类型的分类
数字类型的完整工具:
整数,浮点数,复数,固定精度的十进制数,有理分数,集合,布尔类型,无穷的整数精度,各种数字内置函数和模块
第三方扩展:矩阵,向量
内置函数hex(I),oct(I),bin(I)把一个整数转换为这三种进制表示的字符串,int(str,base)根据每个给定的进制把一个运行时的字符串转换为一个整数
处理数字对象的工具:
表达式操作符:
+ - * / % >> ** & 等
内置数学函数:
pow abs round int hex bin 等
公用模块:
random math等
操作符 | 描述 |
---|---|
yield x | 生成器函数发送协议 |
lambda args:expression | 生成匿名函数 |
x if y else z | 三元表达式 |
x or y | 逻辑或(x为假才会计算y) |
x and y | 逻辑与(x为真才会计算y) |
not x | |
x in y, x not in y | 成员关系(可迭代对象,集合) |
x is y, x is not y | 对象实体测试(内存地址,严格意义上相等) |
x<y,<=,>,>=,==,!= | 大小比较,集合子集超集值相等性· |
x | y | 位或,集合并集 |
x ^ y | 位异或,集合对称差 |
x & y | 位与,集合交集 |
x<<y, x>>y | 左移右移y位 |
x+y,x-y | |
x*y,x%y,x/y,x//y | 乘法/重复,余数/格式化,除法,floor除法 |
-x,+x | 一元减法 |
~x | 按位求补(取反) |
x**y | 幂运算 |
x[i] | 索引(序列,映射及其他)点号取属性运算,函数调用 |
x[i:j:k] | 分片 |
x(...) | 调用(函数,方法,类及其他可调用的) |
x.attr | 属性引用 |
(...) | 元组,表达式,生成器表达式 |
[...] | 列表,列表解析 |
{...} | 字典,集合,集合和字典解析 |
混合类型自动升级,40+3.14结果是浮点数,混合类型转换仅在数字类型里适用,python不会在其他类型之间进行转换,如一个字符串不能喝一个整数相加。
运算符重载,所有的python操作符可以通过python类和C扩展类型被重载。python自动重载了某些操作使其根据对象类型执行不同的操作。如,数字“+”是做加法,string "+"做字符串连接。这种特性称为多态。
变量就是简单的名字,可以用来记录程序中的信息,在python中:
变量在它第一次赋值时创建。
变量在表达式中使用将被替换为它们的值。
变量在表达式中使用以前必须已赋值。
变量像对象一样不需要在一开始进行声明。
变量赋值a = 3, b = 4
然后就可以用a,b进行加减乘除运算
连续比较:
X<Y<Z 等价于 X<Y and Y<Z
X<Y>X 等价于 X<Y and Y>Z
1<2<3<4
注意:
1==2<3 翻译为1==2 and 2<3结果为False,而不是(1==2)<3, False<3结果为True
除法:传统除法,Floor除法,真除法
X/Y
python 2.x中整数相除结果也为整数,2/3结果为1,省去了小数
python 3.x中这个除法会得到准确的值
X//Y
对整数执行floor除法,对小数执行浮点除法
Floor除法,截断除法,round四舍五入(//是floor除法,结果是向下舍入)
>>> import math
>>> math.floor(2.567),math.floor(-2.567) #floor除法
(2, -3)
>>> math.trunc(2.567),math.trunc(-2.567) #截断除法
(2, -2)
>>> int(2.567),int(-2.567) #转换为int
(2, -2)
>>> round(2.567),round(2.467),round(2.567,2) #四舍五入,可设置保留小数位
(3, 2, 2.57)
>>> '%.1f'%2.567, '{0:.2f}'.format(2.567) #round for display
('2.6', '2.57')
>>>
复数
>>> complex(2,3)
(2+3j)
>>> 2+5j
(2+5j)
>>> 2+ -3j
(2-3j)
十六进制、八进制、二进制
注意int可以将10进制的小数转为整数,括号内直接传入数字,但是将其他进制转换为十进制整数,第一个参数必须传入字符串。
>>> 0o1,0o20,0o377
(1, 16, 255)
>>> 0x01,0x10,0xff
(1, 16, 255)
>>> 0b1,0b10000,0b11111111
(1, 16, 255)
>>> oct(64),hex(64),bin(64)
('0o100', '0x40', '0b1000000')
>>> int(64),int(100,8),int(40,16),int(1000000,2)
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
int(64),int(100,8),int(40,16),int(1000000,2)
TypeError: int() can't convert non-string with explicit base
>>> int('64'),int('100',8),int('40',16),int('1000000',2)
(64, 64, 64, 64)
>>> int('0x40',16),int('0b1000000',2)
(64, 64)
>>> int(10.8)
10
eval函数会把字符串作为python代码:
>>> eval('64'),eval('0o100'),eval('0x40'),eval('0b1000000')
(64, 64, 64, 64)
其他内置数学工具:
三种方法计算平方根:
>>> math.sqrt(144)
12.0
>>> 144**.5
12.0
>>> pow(144,.5)
12.0
random
>>> import random
>>> random.random() #生成0,1之间任意浮点数
0.9594537896354312
>>> random.randint(1,10) #指定数字间随机生成整数
7
>>> random.choice(['Aries','Virgo','Leo']) #序列中任意挑选一项
'Leo'
>>> dir(random)
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', '_BuiltinMethodType', '_MethodType', '_Sequence', '_Set', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_acos', '_bisect', '_ceil', '_cos', '_e', '_exp', '_inst', '_itertools', '_log', '_pi', '_random', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
小数数字
浮点数缺乏精确性,因为用了存储值的空间有限
>>> 0.1+0.1+0.1-0.3 #应该得0却没有,结果接近0但是没有足够的位数去实现这样的精度
5.551115123125783e-17
>>> print(0.1+0.1+0.1-0.3)
5.551115123125783e-17
>>> from decimal import Decimal
>>> Decimal(0.1)+Decimal(0.1)+Decimal(0.1)-Decimal(0.3) #注意Decimal里面一定要是字符串!!
Decimal('2.775557561565156540423631668E-17')
>>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3') #Decimal实现结果正确
Decimal('0.0')
设置小数全局精度
>>> import decimal
>>> decimal.getcontext().prec=4
>>> decimal.Decimal('1')/decimal.Decimal('7')
Decimal('0.1429')
分数
>>> from fractions import Fraction
>>> Fraction(4,6) #自动简化结果
Fraction(2, 3)
>>> Fraction('.25')
Fraction(1, 4)
>>> x = Fraction(1,3)
>>> y = Fraction('.25')
>>> x+y
Fraction(7, 12)
>>> Fraction(1,10)+Fraction(1,10)+Fraction(1,10)-Fraction(3,10) #得出准确值
Fraction(0, 1)
分数和小数都能够提供比浮点数更直观和准确的结果,他们以不同的方式做到这点(使用有理数表示以及通过限制精度)
集合set
集合本质上具有基本的数学特性。具体操作参考集合部分https://blog.csdn.net/thyme_C/article/details/83722659
布尔型:
bool数据类型值为True和False, 实际上他们是内置整数类型int的子类,其行为和1,0是一样的
数字拓展:numpy, pandas
Learning Python, Fourth Edition, by Mark Lutz.