来源:AI入门学习
作者:小伍哥
Python中有6个标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)、Dictionary(字典),每种类型有其固有的属性和方法,学会这六种数据类型及基础的方法,很多代码基本上都能看得懂,很多功能也都能实现了。要是实现面向百度编程到面向自己编程的转变,必须搞搞清楚这六大数据类型的属性和方法。
标准的数据类型又分为可改变的数据类型和不可变的数据类型,数字、字符串、元组属于不可变类型;列表、字典、集合都属于可变类型。
什么是可变类型?在值改变的情况下, 内存地址(ID)不变, 证明改变的是原值即可变类型-->也叫不可 hash 类型
'''修改前'''ls = ['aaa', 'bbb', 'ccc']id(ls)#1744975906560'''修改后'''ls[0] = 'AAA'id(ls)#1744975906560
什么是不可变类型?在值改变的情况下, 内存地址也改变了, 证明这改变的值是产生的新值即原值不可变-->也叫可 hash 类型他们都是一个不可分割的整体
'''修改前'''
x = 'xiaowuge'
id(x)#1744975676080
'''修改后'''
x = "XiaoWuGe"
id(x)#1744996503344
本文将对其中的数字类型进行详解。
Python支持的数值类型有四种:整数(int)、浮点数(float)、复数(complex), 此外,布尔值(bool)属于整数的子类型。
1、整数类型
与数学中整数概念一致,共有4种进制表示:十进制,二进制,八进制和十六进制。默认情况,整数采用十进制,其它进制需要增加相应的引导符号,如下表所示。
进制种类 |
引导符号 |
描述 |
备注 |
十进制 |
无 |
默认情况 | |
二进制 |
0b 或 0B |
由字符0和1组成 |
bin将一个整数转换为一个二进制字符串 bin(43):'0b101011' |
八进制 |
0o 或 0O |
由字符0到7组成 |
oct(x) 将一个整数转换为一个八进制字符串 oct(43):'0o53' |
十六进制 |
0x 或 0X |
由字符0到9、a到f、A到F组成,不区分大小写 |
hex(x) 将一个整数转换为一个十六进制字符串 hex(43):'0x2b' |
整数类型的取值范围在理论上没有限制,实际上受限制于运行Python程序的计算机内存大小。
2、布尔型
布尔型(bool),关键字True和False,分别表示真和假,他们的值是1和0,还可和数字相加。
True True23*True31 True-False2
可以用内置函数type()来查询变量所指的对象类型
a, b, c, d = 13, 2.5, True, 5 4j
type(a),type(b),type(c),type(d)
(int, float, bool, complex)
3、浮点数类型
浮点数类型表示有小数点的数值,浮点数有两种表示方法:小数表示和科学计数法表示。整数具有无限的精度。浮点数通常使用C中的double来实现,有关你的程序运行所在机器上浮点数的精度和内部表示法可在 sys.float_info 中查看。
import sys
sys.float_info
sys.float_info(max=1.7976931348623157e 308,max_exp=1024,max_10_exp=308,min=2.2250738585072014e-308,
min_exp=-1021,min_10_exp=-307,dig=15,mant_dig=53,epsilon=2.220446049250313e-16,radix=2,rounds=1)
4、复数类型
表示数学中的复数,复数可以看作二元有序实数对(a, b),表示a bj,其中,a是实数部分,b为虚数部分。在Python语言中,复数的虚数部分通过后缀 'J' 或 'j' 来表示。复数包含实部和虚部,分别以一个浮点数表示。要从一个复数 z 中提取这两个部分,可使用 z.real 和 z.imag。
#创建一个复数
complex(3, 4)
(3 4j)
#复数 c 的共轭
c = complex(3, 4)
c.conjugate()
(3-4j)
1、运算操作概述
所有数字类型(复数除外)都支持下列运算(有关运算优先级,请参阅:运算符优先级):
Python提供了9个基本的数值运算操作符。这些操作符不需要引用标准或者第三方函数库,也叫内置操作符。
运算 |
结果: |
注释 |
完整文档 |
x y |
x 和 y 的和 | ||
x - y |
x 和 y 的差 | ||
x * y |
x 和 y 的乘积 | ||
x / y |
x 和 y 的商 | ||
x // y |
x 和 y 的商数,并取整 |
(1) | |
x % y |
x / y 的余数 |
(2) | |
-x |
x 取反 | ||
x |
x 不变 | ||
abs(x) |
x 的绝对值或大小 |
abs() | |
int(x) |
将 x 转换为整数 |
(3)(6) |
int() |
float(x) |
将 x 转换为浮点数 |
(4)(6) |
float() |
complex(re, im) |
一个带有实部 re 和虚部 im 的复数。im 默认为0。 |
(6) |
complex() |
c.conjugate() |
复数 c 的共轭 | ||
divmod(x, y) |
(x // y, x % y) |
(2) |
divmod() |
pow(x, y) |
x 的 y 次幂 |
(5) |
pow() |
x ** y |
x 的 y 次幂 |
(5) |
注释:
1)也称为整数除法。结果值是一个整数,但结果的类型不一定是 int。运算结果总是向负无穷的方向舍入: 1//2 为 0, (-1)//2 为 -1, 1//(-2) 为 -1 而 (-1)//(-2) 为 0。
2)不可用于复数。而应在适当条件下使用 abs() 转换为浮点数。
3)从浮点数转换为整数会被舍入或是像在C语言中一样被截断;请参阅math.floor() 和math.ceil()函数查看转换的完整定义。
4)float 也接受字符串 "nan" 和附带可选前缀 " " 或 "-" 的 "inf" 分别表示非数字 (NaN) 以及正或负无穷。
5)Python 将 pow(0, 0) 和 0 ** 0 定义为1,这是编程语言的普遍做法。
6)接受的数字字面值包括数码 0 到 9 或任何等效的 Unicode 字符(具有 Nd 特征属性的代码点)。
注意:表中所有的二元数学操作符( 、-、*、/、//、%、**)都有与之对应的增强赋值操作符( =、-=、*=、/=、//=、%=、**=)。即x op= y 等价于 x = x op y ,op 为二元数学操作符。
2、除法运算符(/)
#被除数为0
print(0/5)
0.0
#被除数为小数
print(5/2.2)
2.2727272727272725
#被除数为负数
print(-5/2)
-2.5
#除数和被除数都为负数
print(-5/-2)
2.5
#查看结果的数字类型
type(4/2)
float
#除数为0
print(5/0)
ZeroDivisionError: division by ze
3、取整运算符(//)
python的取整运算符是向下取整的,同时除数也是不能为0的
print(5//2)
2
print(-5//-2)
2
print(-5//2)
-3
print(5//-2)
-3
print(-2//-5)
0
print(0//-5)
0
print(4//5)
0
type(5//2)
int
4、求余运算符(%)
Python求余公式:r=a - b*[a//b](r为余数,a为被除数,b为除数且不能为0)不管a,b是正负整数还是a为0都可以直接套用这个公式计算,这个公式我们可以分三个部分
例1:7%2
1)a//b,向下取整,7//2=3
2)b*[a//b],2*3=6
3)r=7-6=1
例2:-7%2
1)a//b,向下取整,-7//2=-4
2)b*[a//b],2*-4=-8
3)r=-7-(-8)=1
print(8%3)
2
print(-8%-3)
-2
print(-8%3)
1
print(8%-3)
-1
print(0%3)
0
print(1%3)
1
5、divmod
divmod(x, y)返回的结果等价于(x // y, x % y),同时返回商数和余数。
divmod(8,5)
(1, 3)
(8 // 5, 8 % 5)
(1,3)
1、按位运算概述
按位运算只对整数有意义,计算按位运算的结果,就相当于使用无穷多个二进制符号位对二的补码执行操作。二进制按位运算的优先级全都低于数字运算,但又高于比较运算;一元运算 ~ 具有与其他一元算术运算 ( and -) 相同的优先级。
此表格是以优先级升序排序的按位运算列表:
运算 |
结果: |
注释 |
x | y |
x 和 y 按位 或 |
(4) |
x ^ y |
x 和 y 按位 异或 |
(4) |
x & y |
x 和 y 按位 与 |
(4) |
x << n |
x 左移 n 位 |
(1)(2) |
x >> n |
x 右移 n 位 |
(1)(3) |
~x |
x 逐位取反 |
注释:
1、负的移位数是非法的,会导致引发 ValueError。
2、左移 n 位等价于不带溢出检测地乘以 pow(2, n) 。
3、右移 n 位等价于除以 pow(2, n) ,作向下取整除法。
4、使用带有至少一个额外符号扩展位的有限个二进制补码表示(有效位宽度为 1 max(x.bit_length(),y.bit_length()) 或以上)执行这些计算就足以获得相当于有无数个符号位时的同样结果。
2、或、与、异或
下面以八位机为例,x 取 6,y 取 8,n 取 2,6 和 8 在内存中的储存分别为 00000110,00001000。可以用bin函数进行转换,如下:
bin(6)
'0b110'
bin(8)
'0b1000'
按位 或 运算,规则如下:
0|0, 1|0, 1|1
(0, 1, 1)
6|8 逐位运算后结果为 00001110,十进制就是 14:
6|8, 0b00001110
(14, 14)
同理可按下列计算规则,计算出 6^8, 6&8:
0^0, 0^1, 1^1
(0, 1, 0)
0&0, 0&1, 1&1
(0, 0, 1)
6^8, 6&8
(14, 0)
3、左移、右移
6 左移 2 位结果为 00011000,十进制就是 24,相当于 6*2**2:
6<<2, 0b00011000, 6*2**2
(24, 24, 24)
同理可计算出 6>>2,结果为 1:
6>>2, 6//(2**2)
(1, 1)
4、逐位取反
6 逐位取反为 11111001,因为我们是以八位机来举例的,八位机中 11111001 表示 -7,这是个天才设计,正负整数计算可以利用一种电路即可完成,有兴趣的可以查资料了解详情。
~6
-7
例如 8 (-7) 如此计算:
00001000 11111001=100000001
因为是八位机,结果有 9 位,所以第一个 1 溢出,结果就是 1。
四、整数的附加方法int 类型实现了 numbers.Integral abstract base class。此外,它还提供了其他几个方法:
int.bit_length()返回以二进制表示一个整数所需要的位数,不包括符号位和前面的零
n = -37bin(n)'-0b100101'n.bit_length()6
更准确地说,如果 x 非零,则 x.bit_length() 是使得 2**(k-1) <= abs(x) < 2**k 的唯一正整数 k。同样地,当 abs(x) 小到足以具有正确的舍入对数时,则 k = 1 int(log(abs(x), 2))。如果 x 为零,则 x.bit_length() 返回 0。
等价于:
def bit_length(self):
s = bin(self) # binary representation: bin(-37) --> '-0b100101'
s = s.lstrip('-0b') # remove leading zeros and minus sign
return len(s) # len('100101') -->
int.to_bytes
int.to_bytes(length, byteorder, *, signed=False)
返回表示一个整数的字节数组。
(1024).to_bytes(2, byteorder='big')
b'\x04\x00'
(1024).to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
(-1024).to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
x = 1000
x.to_bytes((x.bit_length() 7) // 8, byteorder='little')
b'\xe8\x03'
整数会使用 length 个字节来表示。如果整数不能用给定的字节数来表示则会引发 OverflowError。
byteorder 参数确定用于表示整数的字节顺序。如果 byteorder 为 "big",则最高位字节放在字节数组的开头。如果 byteorder 为 "little",则最高位字节放在字节数组的末尾。要请求主机系统上的原生字节顺序,请使用 sys.byteorder 作为字节顺序值。
signed 参数确定是否使用二的补码来表示整数。如果 signed 为 False 并且给出的是负整数,则会引发 OverflowError。signed 的默认值为 False。
int.from_bytes
classmethod int.from_bytes(bytes, byteorder, *, signed=False)
返回由给定字节数组所表示的整数。
int.from_bytes(b'\x00\x10', byteorder='big')16int.from_bytes(b'\x00\x10', byteorder='little')4096int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)-1024int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)64512int.from_bytes([255, 0, 0], byteorder='big')16711680
bytes 参数必须为一个 bytes-like object 或是生成字节的可迭代对象。byteorder 参数确定用于表示整数的字节顺序。如果 byteorder 为 "big",则最高位字节放在字节数组的开头。如果 byteorder 为 "little",则最高位字节放在字节数组的末尾。要请求主机系统上的原生字节顺序,请使用 sys.byteorder 作为字节顺序值。
signed 参数指明是否使用二的补码来表示整数。
五、math模块Python math 模块提供了许多对浮点数的数学运算函数。主要框架包(括具体见文章:Python数学math模块55个函数详解)
- 数论与表示函数
- 幂函数与对数函数
- 三角函数
- 角度转换
- 双曲函数
- 特殊函数
- 常量
import math
print(dir(math))
[ 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh',
'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor',
'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan',
'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi',
'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
注意:上面的函数是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。
cmath模块包含了一些用于复数运算的函数. cmath模块的函数跟math模块函数基本一致,区别是cmath模块运算的是复数,math模块运算的是数学运算。
查看 cmath 查看包中的函数
import cmath
print(dir(cmath))
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cos',
'cosh', 'e', 'exp', 'inf', 'infj', 'isclose', 'isfinite', 'isinf', 'isnan', 'log', 'log10', 'nan', 'nanj', 'phase', 'pi',
'polar', 'rect', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau']
部分操作实例
import cmath
#负数开根号
cmath.sqrt(-9)
3j
cmath.sqrt(-1)
1j
cmath.sqrt(9)
(3 0j)
cmath.sin(1)
(0.8414709848078965 0j)
cmath.log10(100)
(2 0j)
随机数是编程里面非常重要的部分(具体见文章:Python随机模块22个函数详解),random模块主要用于随机数的生成,随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性,平时数据分析各种分布的数据构造也会用到。
random模块,用于生成伪随机数,之所以称之为伪随机数,是因为真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。而计算机中的随机函数是按照一定算法模拟产生的,对于正常随机而言,会出现某个事情出现多次的情况。
但是伪随机,在事情触发前设定好,就是这个十个事件各发生一次,只不过顺序不同而已。现在MP3的随机列表就是用的伪随机,把要播放的歌曲打乱顺序,生成一个随机列表而已,每个歌曲都播放一次。真实随机的话,会有出现某首歌多放次的情况,歌曲基数越多,重放的概率越大。
注意:random()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。
查看 random包中的函数
import random
print(dir(random))
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF','Random','SG_MAGICCONST',
'SystemRandom', 'TWOPI',... , 'betavariate', 'choice', 'choices', 'expovariate',
'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate',
'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate',
'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
正态分布random.normalvariate(mu, sigma)
data = [random.normalvariate(2,4) for i in range(20000)]
#直方图
plt.hist(data, bins=100, color="#FF0000", alpha=.7)
#密度图
sns.kdeplot(data, shade=True,color="#FF0000")
,