来源:AI入门学习

作者:小伍哥

Python中有6个标准的数据类型:Number(数字)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字典),每种类型有其固有的属性和方法,学会这六种数据类型及基础的方法,很多代码基本上都能看得懂,很多功能也都能实现了。要是实现面向百度编程到面向自己编程的转变,必须搞搞清楚这六大数据类型的属性和方法。

标准的数据类型又分为可改变的数据类型和不可变的数据类型,数字、字符串、元组属于不可变类型;列表、字典、集合都属于可变类型。

python中number怎么定义(Python基础之数字Number超级详解)(1)

什么是可变类型?在值改变的情况下, 内存地址(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支持的数字类型

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),关键字TrueFalse,分别表示真和假,他们的值是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)

二、Pyhon支持的运算

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模块包含了一些用于复数运算的函数. 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)

七、random模块

随机数是编程里面非常重要的部分(具体见文章: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")

python中number怎么定义(Python基础之数字Number超级详解)(2)

,