python运算符

回眸只為那壹抹淺笑 提交于 2020-02-07 20:12:43

算数运算符

算数运算符 描述
+
-
*
/
% 取模,取余
** 幂,返回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

优先级

记得加()

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!