百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Python基础之数字(Number)超级详解

liuian 2025-03-01 14:38 20 浏览

来源: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支持的数字类型

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")

相关推荐

git的撤销、删除和版本回退_git撤销删除的文件

备注:本文参考于廖雪峰的博客Git教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。知识点:1、gitstatus,查看git仓库的状态2、gitdiff查看git修改了的内容...

程序员开发必会之git常用命令,git配置、拉取、提交、分支管理

整理日常开发过程中经常使用的git命令!git配置SSH刚进入项目开发中,我们首先需要配置git的config、配置SSH方式拉取代码,以后就免输入账号密码了!#按顺序执行gitconfig-...

Git使用指南 | 教你轻松学会Git_git用法详解

4000字,教大家学会Git使用。一、Git基础1、Git介绍Git是目前世界上最先进的分布式版本控制系统。版本控制系统:设计师在设计的时候做了很多版本经过了数天去问设计师每个版本都改了些啥,设计师此...

深入浅出 Git_深入浅出 gRPC

git初体验使用git前需设置用户名和Email,这些信息会出现在提交记录中以标识作者。gitconfig--globaluser.name"YeHanlin"gitc...

Git不提交指定文件的方法_git不提交指定文件的方法有哪些

大家在开发项目的时候都很喜欢使用git作为代码管理工具,但是在开发项目的时候我们的本地配置文件不应该覆盖服务器中的配置文件,我们使用命令gitstatus查看待提交文件的时候需要注意不要把本地的配...

相见恨晚的 Git 命令动画演示,一看就懂

虽然Git是一个强大的工具,但是我觉得大部分人都会同意我说的:它也可以是一个……噩梦!我一直觉得,使用Git的时候把操作过程在脑海里视觉化会非常有用:当我执行某个命令的时候,分支之间是如何交互...

GitCode的一些命令_git命令大全

GitCode的一些命令配置工具对所有本地仓库的用户信息进行配置$gitconfig--globaluser.name"[name]"对你的commit操作设置关联的用户名$...

【git】 如何删除所有 tag(本地和远程)

要删除所有本地和远程的Git标签,可以按照以下步骤进行:删除本地标签首先,删除本地标签。你可以使用以下命令删除本地的所有标签:gittag-d$(gittag-l)这将列出并删除所有本地...

互联网大漏洞:每600个网站就有1个暴露了.git文件夹

对于Web开发人员来说,向外界暴露你的.git文件夹绝对是一个菜鸟级错误。因为这样会允许任何人下载你的整个源代码存储库,包括数据库密码、加密盐、Hash和第三方接口密钥API,还有你的用户名和密码。多...

git常用命令整理_git 常用

一、Git仓库完整迁移完整迁移,就是指,不仅将所有代码移植到新的仓库,而且要保留所有的commit记录1.随便找个文件夹,从原地址克隆一份裸版本库gitclone--bare旧的git地址...

项目常用GIT操作命令_git常用操作命令 简书

Git仓库更新依赖的命令:gradle--refresh-dependenciesgradleaR完全编译;./gradlewecomm:packages:telephony:larges...

【超详细】Git 所有常用命令 + 提交规范全指南(建议收藏!)

Git命令大全初始化类命令作用gitinit初始化一个本地Git仓库(当前目录会出现.git文件夹)gitclone<仓库地址>克隆远程仓库到本地,一般用来拉项目提交代...

Git 常用的alias命令大全_git -a

Git的alias(别名)功能可以将常用的复杂命令简化,大幅提升操作效率。以下是一些实用的Gitalias配置和常用示例:一、配置alias的方法通过gitconfig命令设置,分...

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

导读:因为教程详细,所以行文有些长,新手边看边操作效果出乎你的预料。GitHub虽然有些许改版,但并无大碍。一、Git是什么?Git是目前世界上最先进的分布式版本控制系统。工作原理/流程:Work...

实用干货分享(3)- Git常用操作干货分享

官方学习地址https://git-scm.com/book/zh/v2简单的代码提交流程1.gitstatus查看工作区代码相对于暂存区的差别;2.gitadd.将当前目录下修改的所有...