更新时间:作者:小小条
来源: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+4jtype(a),type(b),type(c),type(d)(int, float, bool, complex)
3、浮点数类型
浮点数类型表示有小数点的数值,浮点数有两种表示方法:小数表示和科学计数法表示。整数具有无限的精度。浮点数通常使用C中的double来实现,有关你的程序运行所在机器上浮点数的精度和内部表示法可在 sys.float_info 中查看。
import syssys.float_infosys.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、除法运算符(/)
#被除数为0print(0/5) 0.0#被除数为小数print(5/2.2) 2.2727272727272725#被除数为负数print(-5/2) -2.5#除数和被除数都为负数print(-5/-2)2.5#查看结果的数字类型type(4/2)float#除数为0print(5/0) ZeroDivisionError: division by ze3、取整运算符(//)python的取整运算符是向下取整的,同时除数也是不能为0的print(5//2)2print(-5//-2)2print(-5//2)-3print(5//-2)-3print(-2//-5)0print(0//-5)0print(4//5)0type(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)2print(-8%-3)-2print(-8%3)1print(8%-3)-1print(0%3)0print(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。此外,它还提供了其他几个方法:
返回以二进制表示一个整数所需要的位数,不包括符号位和前面的零
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 = 1000x.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 参数指明是否使用二的补码来表示整数。
Python math 模块提供了许多对浮点数的数学运算函数。主要框架包(括具体见文章:Python数学math模块55个函数详解)
数论与表示函数幂函数与对数函数三角函数角度转换双曲函数特殊函数常量import mathprint(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 cmathprint(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)1jcmath.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 randomprint(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")
版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除