算数运算符
算数运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模,取余 |
** | 幂,返回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先求正800001000
2取反11110111
3最后位加111111000
第一位是符号位,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
优先级
记得加()
来源:https://www.cnblogs.com/inmeditation/p/12273761.html