python运算符和进制
算数运算符
算数运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模,取余 |
** | 幂,返回x的y次幂 |
// | 取整数 |
a=8
b=5
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a%b)
print(a//b)
print(a**b)
13
3
40
1.6
3
1
32768
如果想要获取两数相除的整数和余数
可以使用dicmod
print(divmod(10,3))
(3, 1)
赋值运算符
赋值运算符 | 描述 |
---|---|
= | 赋值运算符 |
+= | 加法赋值运算符 |
-= | 减法赋值运算符 |
*= | 乘法赋值运算符 |
/= | 除法赋值运算符 |
%= | 取模赋值运算符 |
**= | 幂赋值运算符 |
//= | 取整除赋值运算符 |
name1 = 'admin'
name2 = name1
print(id(name1),name1)
print(id(name2),name2)
2251004377664 admin
2251004377664 admin
在内存中创建admin,并将变量名name1指向该内存地址
将指向name1的内存空间指向变量name2
id函数,返回内存地址
num1 = 0
num1 += 5 # num1 = num1 + 5
print(num1)
num1 -= 3 # num1 = num1 - 3
print(num1)
num1 *= 10 # num1 = num1 * 2
print(num1)
num1 /= 2 # num1 = num1 / 2
print(num1)
num1 %= 3 # num1 = num1 % 3
print(num1)
num1 = 10
num1 //= 3 # num1 = num1 // 3
print(num1)
num1 **= 2 # num1 = num1 ** 2
print(num1)
5
2
20
10.0
1.0
3
9
关系运算符
|比较运算符|
|-|-|
|==|等于|
|!=|不等于|
|>|大于|
|<|小于|
|>=|大于等于|
|<=|小于等于|
print('hello'=='hello')
print(10 == 10.0)
print(10 != 10)
print(2 > 10)
print(2 < 10)
print(10 >= 10)
print(2 <= 10)
True
True
False
False
True
True
True
比较运算符 | 描述 |
---|---|
is | 判断两个标识符是不是引用自同一个一个内存地址 |
not is | 判断两个标识符是不是引用自不同内存地址 |
分析:源文件执行,和交互模式下执行,为何会产生差异
源文件
age1 = 20
age2 = 20
print(id(age1),id(age2))
print(age1 is age2)
money1 = 2000000
money2 = 2000000
print(id(money1),id(money2))
print(money1 is money2)
执行结果
1837466320 1837466320
True
2049247784688 2049247784688
True
交互模式下
>>> age1 = 20
>>> age2 = 20
>>> print(id(age1),id(age2))
1837466320 1837466320
>>> print(age1 is age2)
True
>>> money1 = 2000000
>>> money2 = 2000000
>>> print(id(money1),id(money2))
2790686827632 2790686830320
>>> print(money1 is money2)
False
在python中为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间
小整数[-5,256],这些整数对象是提前建立好的,不会被垃圾回收
源文件执行,从上到下,属于同一个执行过程
在这个过程中,开辟的所有内存都是属于这一次的
当运行到money2 = 2000000时,发现2000000已经存在,会复用
交互环境下,所见即所得,回车就是一个执行过程,所有每次的大整数都是重新创建
is 与 比较运算符"=="
两者有根本上的区别
- is用于判断两个变量的引用是否为同一个对象
- 而==用于判断变量引用的对象的值是否相等
逻辑运算符
逻辑运算符 | 描述 |
---|---|
and | 逻辑与,两边都为True,即为True,其余都是False |
or | 逻辑或,只要有一边为True,即为True |
not | 逻辑非,取反 |
username = 'admin'
password = 'a123456'
print(username == 'admin' and password == '123456')
False
n1 = 8
n2 = 5
n3 = 3
result = n1>=(n2+n3) and n1>n2
print(result,not result)
True False
进制转换
二进制
由
0 1
组成
python中bin()函数,将十进制转换为二进制,0b是二进制的前缀
>>> bin(13)
'0b1101'
二进制转换位十进制
例:1101
从右往左分别对应 2的0次幂,2的1次幂,2的2次幂,2的3次幂
>>> 2**0
1
>>> 2**1
2
>>> 2**2
4
>>> 2**3
8
然后将二进制中为1,所对应的相加
8+4+1=13
例:101101
从右往左分别对应
>>> 2**0
1
>>> 2**1
2
>>> 2**2
4
>>> 2**3
8
>>> 2**4
16
>>> 2**5
32
为二进制中为1的进行相加
>>> 32+8+4+1
45
进行验证
>>> bin(45)
'0b101101'
负数转二进制
那么-8的二进制是多少呢
1先求正8
00001000
2取反
11110111
3最后位加1
11111000
第一位是符号位,1就是负数,0就是正数
在python中函数封装后的结果,会有不同
>>> print(bin(-8))
-0b1000
八进制
由01234567组成
0o
表示八进制
计算机中,8个二进制位bit构成1个字节byte
python中将十进制转换为八进制
>>> oct(10)
'0o12'
八进制转十进制
八进制,所以底数位8
n = 0o6430
>>> 8**0
1
>>> 8**1
8
>>> 8**2
64
>>> 8**3
512
每位对应的进行相乘后相加
512*6+64*4+8*3+1*0
>>> c = 0o6430
>>> print(int(c))
3352
八进制转二进制
因为八进制中最大的数为7.二进制表示为111
可以将八进制中的每一位,转换位3位2进制,然后进行组合
n = 0o6430
6 4 3 0
110100011000
>>> print(bin(c))
0b110100011000
十六进制
0x
开头表示十六进制
0123456789abcder
a表示10,b表示11
python中使用hex()函数将十进制转换为十六进制
>>> hex(16)
'0x10'
转为十进制
c = 0x911
>>> 16**0
1
>>> 16**1
16
>>> 16**2
256
>>> aa = 9*256+1*16+1*1
>>> print(aa)
2321
>>> c = 0x911
>>> print(int(c))
2321
转二进制
十六进制的最大值为f,也就是15用二进制表示为1111
将十六进制中的每一位,转换位4位2进制,然后进行组合
c = 0x9ab16
9 a b 1 6
10011010101100010110
>>> c = 0x9ab16
>>> print(bin(c))
0b10011010101100010110
十进制
0123456789
python中使用int()函数来将数值转换为十进制
>>> int(0b1010)
10
>>> int(0o12)
10
>>> int(0xa)
10
位运算符
位运算符 | 描述 |
---|---|
& | 与 |
| | 或 |
~ | 非 |
^ | 异或 |
<< | 左移 |
>> | 右移 |
>>> print(3 & 2)
2
3转换位二进制 0000 0011
2转换位二进制 0000 0010
执行与运算 0000 0010
都为1,才为1,最后将结果转换为十进制
>>> print(5 | 3)
7
5转换为二进制 0000 0101
3转换为二进制 0000 0011
执行或运算 0000 0111
只要一边为1,就为1,最后将结果转为10进制
>>> print(~7)
-8
7转换为二进制 0000 0111
取反 1111 1000
将二进制转换为十进制
第一位是符号位,只要第一位是1的就是负数,第一位是0的就是整数
减1 1111 0111
取反 0000 1000
>>> print(3^5)
6
相同的是0,不同的是1
3转换 00000011
5转换 00000101
^运算 00000110
>>> print(2<<1)
4
2左移一位
2转换 00000010
运算,左边抹掉一位,右边进行补零
结果位 00000100
>>> print(16<<2)
64
>>> print(8<<3)
64
发现左移规律
m<<n
m*(2**n)
>>> 16*(2**2)
64
>>> 8*(2**3)
64
>>> 2*(2**1)
4
>>> print(2>>1)
1
2右移一位
2转换 00000010
运算,右边抹掉一位,左边根据原先符号位补0或1
结果是 00000001
>>> print(16>>2)
4
>>> print(8>>3)
1
发现右移也是有规律的
m>>n
m/(2**n)
>>> 16/(2**2)
4.0
>>> 8/(2**3)
1.0
>>> 2/(2**1)
1.0
三目运算符
格式
a - b if a>b else a + b
当a>b时,执行a - b
否则,执行a + b
>>> a = 6
>>> b = 5
>>> result = (a+b) if a<b else (b-a)
>>> print(result)
-1
优先级
记得加()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!