关注微信公众号IT小组,获取更多知识干货~
位运算符在Python中有“按位与”、“按位或”、“按位异或”、“按位取反”、“左移”、“右移”等。
如下:
&:按位与,将数值转为二进制,按位进行与运算。
|:按位或,将数值转为二进制,按位或运算。
^:按位异或,将数值转为二进制,按位异或运算。
~:按位取反,将数值转为二进制,按位取反运算。
“<<”:左移,将数值转为二进制,按位左移。
“>>”:右移,将数值转为二进制,按位右移。
“&”按位与运算的例子如下:
a = 45
b = 20
print ( a & b )
# 打印结果如下:
4
# 原理如下:
45 转为二进制: 0010 1101
20 转为二进制:0001 0100
45&20:(“与”同为1则为1,否则为0)
-----------
0010 1101
0001 0100
-----------
0000 0100 转为十进制为:4
“|”或运算的例子如下:
a = 45
b = 20
print ( a | b )
# 打印结果如下:
61
# 原理如下:
45 转为二进制是:0010 1101
20 转为二进制是:0001 0100
45|20:(“或”运算,有1则1,都0为0)
-----------
0010 1101
0001 0100
-----------
0011 1101 转为十进制为:61
“|”或运算的例子如下:
a = 45
b = 20
print ( a | b )
# 打印结果如下:
61
# 原理如下:
45 转为二进制是:0010 1101
20 转为二进制是:0001 0100
45|20:(“或”运算,有1则1,都0为0)
-----------
0010 1101
0001 0100
-----------
0011 1101 转为十进制为:61
“^”异或运算的例子如下:
a = 45
b = 20
print ( a ^ b )
# 打印结果如下:
57
# 原理如下:
45 转为二进制为:0010 1101
20 转为二进制为:0001 0100
45^20:(“异或”运算相同为0,不同为1)
-----------
0010 1101
0001 0100
-----------
0011 1001 转为十进制为:57
“~”按位取反的例子如下:
c = 12
print ( ~c )
# 打印结果如下:
-13
# 原理如下:
12 转为二进制为: 0001100
~12 转为二进制为:1110011(补码)
补码转为源码减1在取反:
1110011-1=1110010
1110010取反则为0001101 转为十进制为:-13
(
扩充知识:负数的二进制形式是,以-13为例,
先求源码,-13的源码是0000 1101
在取反码,0000 1101 取反为 1111 0010
在+1取得补码,1111 0010 + 1 = 1111 0011 转为十进制为: -13
)
取反码有一种简单的算法,是“-(a+1)”,例如:
print ( ~5 )
# 打印结果如下:
-6
“<<”左移例子如下:
print ( 5 << 3 )
# 打印结果如下:
40
# 原理如下:
n << m 等于 n乘与2的m次方
( 5 << 3 = 5 * 2^3 )
“>>”右移的例子如下:
print ( 8 >> 2 )
# 打印结果如下:
2
# 原理如下:
n >> m 等于 n 除以2的m次方
( 8 >> 2 = 8 ÷ 2^2 )
算数运算符是比较常见的类型,有加法、减法、乘法、除法、取余、平方等等。
Python中的常见算数运算符如下:
print ( 1 + 1 ) # 加法运算符
print ( 2 - 1 ) # 减法运算符
print ( 2 * 3 ) # 乘法算符
print ( 6 / 3 ) # 除法运算符,结果为2.0(默认保留一位小数)
print ( 5 / 2 ) # 除法运算符,结果是2.5
print ( 5 // 2 ) # 整除运算符,默认向下取整。结果为2
print ( 2 ** 3 ) # 幂运算,2^3=8,结果为8
print ( 10 % 3 ) # 取余运算,结果为1
print ( 58 % 100 ) # 取余运算,结果为58
上面都是数值之间的算数运算符。
在Python中字符串之间也可以使用算数运算符。Python支持两个字符串之间使用加法运算表示两个字符串连接起来,如下:
print ( 'HI' + 'Hello' )
# 打印结果如下:
HIHello
字符串和数值之间也可以使用算数运算符,Python支持字符串和数字之间使用乘法运算符表示重复该字符几遍,但是字符串和数字之间使用加法运算符则会报错,如下:
print ( 'HI' * 5 ) # 在Python中字符串和数字相乘以为这重复几遍该字符串
# 打印结果如下:
HIHIHIHIHI
print ( 'HI' + 5 ) # 字符串和数值相加会报错
# 会报错,错误类型如下:
TypeError: can only concatenate str (not "int") to str
# 从报错提示可知,只能是两个字符串之间使用加号
赋值运算符是比较常见,在其他语言中比如C++,java等都是用“=”作为赋值运算符,Python也是如此,“=”在编程语言里的作用是将等号右边的常量或变量,赋值给等号左边。
a = 10 # 把数值10赋值给了a变量
a = b = c = 10 # Python中支持这种赋值语句,a,b,c的值都为10
a , b , c = 1 , 2 , 3 # 右边的值依次赋值给左边的变量(解包)
a = 1,2,3,4,5 # 这在Python中作为元组的赋值,a的值为(1,2,3,4,5)
a = 1 + 3 # 在Python中赋值等号的右边可以是表达式,常量等等,但是左边不可以
a , b = 2 , 3 # Python中支持这个赋值语句,这在Python中被称为解包,将元组的元素解包分别给a,b此时它们的值分别为2,3
上面有一个很特殊的例子:“解包”
解包的过程意味着将右边的变量或常量依次传递给左边的变量,他们的个数都是相等的,如果不相等时则会报错,不过也有另外一种情况:
a , *b , c = 1 , 2 , 3 , 4 , 5 # *args ...等都可以存储多个值
print ( a , b , c )
# 打印结果如下:
1 [2, 3, 4] 5
*a , b , c = 1 , 2 , 3 , 4 , 5
print ( a , b , c )
# 打印结果如下:
[1, 2, 3] 4 5
可以发现,变量存储了多余的数据,并且以列表的数据类型来保存。(如果你不知道什么是列表不用慌张,后面会谈到)这是因为在Python中“”表示了可变的类型。(不能同时使用两个可变类型,否则会报错。)
在赋值运算符中还有一种是“复合赋值运算符”,如下所示:
a = 1
a = a + 1 #代表a+1赋值给a
a += 1 # 与上面 a = a + 1 相等
a -= 1 # 表示a = a - 1
a *= 1 # 表示a = a * 1
a /= 1 # 表示a = a / 1
a **= 2 # 表示a^2次方赋值给a
a //= 2 # 表示a整除与2赋值给a
a %= 2 # 表示a模等于2赋值给a
比较运算符,在Python中有“>”、“<”、“>=”、“<=”、“!=”、“==”。
“>”:大于
“<”:小于
“>=”:大于等于
“<=”:小于等于
“!=”:不等于(在Python2中不等于是“<>”)
“==”:等于
(比较运算的结果都是bool类型的值,例子如下:)
print ( 3 > 2 )
print ( 2 < 3 )
print ( 2 <= 3 )
print ( 3 <= 2 )
print ( 2 != 3 )
print ( 2 == 3 )
# 打印结果如下:
True
True
True
False
True
False
前面比较的都是数值型之间,而字符型和数值之间也可以是使用比较运算符的,但只支持两种比较符:
1:“!=”(不等于)
2:“==”(等于)
例子代码如下:
print ( 'HI' != 2 )
print ( 'HI' == 2 )
# 打印结果如下:
True
False
字符串和字符串之间支持的比较运算符有:
1:“>”
2:“<”
3:“==”
例子如下:
print ( 'hello' > 'zoon' )
# 打印结果如下:
False
print ( 'a' < 'b' )
# 打印结果如下:
False
print ( 'a' == 'b' )
# 打印结果如下:
False
上面之所以是False的原因是在Python中字符比较时,解释器会自动将字符转为对应的数字(ASCII码)进行比较,我们可以通过ord方法来获取字符对应的数字,如下:
print ( ord ( 'h' ) )
print ( ord ( 'z' ) )
# 打印结果如下:
104
122
从上面字符转为的数字可以明显得出,104是不大于122的,所以’hello’>'zoon’结果为False。
上面是正常的两个字符比较,如果两个字符的首部字符都是相同的呢,那么Python会逐个比较,例子如下:
print ( 'abc' > 'abd' )
# 打印结果如下:
False
字符串’abc’和’abd’前面两个字符都相同,但是第三个字符不同,c字符的ASCII码小于d字符,所以为False。
下面补充一点,如果两个是字符型的数字之间做比较如何呢,如下:
print ( '123' > '23' )
# 打印结果如下:
False
在Python中的逻辑运算符有and、or、not,in等
and:逻辑与,都为真时才返回True,否则返回False(and遇到第一个False就返回False)
or:逻辑或,都为假时才返回False,否则返回True(or遇到第一个True就返回True)
not:逻辑非,对bool值取反。
in:成员资格检查运算符。(这一节不做介绍)
and逻辑与运算的例子如下:
print ( 3 > 2 and 1 > 2 )
print ( True and True and False and True )
print ( 6 > 1 and 1 > 0 )
# 打印结果如下:
False
False
True
and逻辑与运算在计算机中的执行如上面所示,只要返回了False则不会在执行后面的and语句,如:
1 > 2 and print( 'HI' )
2 > 1 and print( 'Hello' )
# 打印结果如下:
hello
上面代码中之所以没有打印“HI”还是我们之前说的,and逻辑与只要碰到了第一个False就不会继续执行下面的代码了,因为还如上面所述,and遇到了False则最终的返回就是False。(这是逻辑与的“短路问题”,下面会介绍)
or逻辑或运算遇到第一个为True的值则返回,并且后面的代码不执行。
例子如下:
print ( False or False or True )
print ( 3 > 4 or 5 > 4 )
print ( 2 > 3 or 3 > 4 or 4 > 5 )
# 打印结果如下:
True
True
False
and逻辑与的“短路问题”,如下:
a = 2 and 'hi' and 0 and print ( 'HI' )
print(a)
# 打印结果如下:
0
and逻辑与会返回第一个是False的值(0转为bool值则是False),所以后面的print语句则不会执行,这就是and逻辑与的“短路问题”。
or逻辑或的“短路问题”,如下:
4 > 1 or print( 'HI' )
1 < 0 or print( 'Hello' )
# 打印结果如下:
Hello
逻辑或的短路问题与逻辑与的相反,逻辑或遇到了True之后就不会执行之后的代码了,因为逻辑或遇到了True就返回True,后面的代码不会影响到执行结果。
上面代码中“4 > 1 ”则直接返回True并不会接着继续执行下面的代码了。
而第二行代码“1 < 0” 返回是False,则会继续执行后面的代码(所以print语句才会执行),寻找为True的返回,除非都是False才返回False。
逻辑运算符返回的结果不一定都是bool类型,正如上面逻辑与的“短路问题”一样,例子如下:
x = 3 and 2 and 0 and 'hello' and 'hi'
a = 3 and 4 and False and 'hello'
print ( x )
print ( a )
# 打印结果如下:
0
False
逻辑与运算取值的时候,会取第一个False的值。在第一个x取值的过程中,数字在逻辑运算中除了0以外都为True,所以当遇到0(False)时会返回。第二个a的取值也是如此,不过它直接用False作为返回值。(数字中0转为bool为False,字符串中空字符转为bool值为False,空列表转为bool为False,空字典转为bool为False)
补充:
上面and逻辑与的例子中都有代表为False的值返回,如果表达式没有False则会返回最后一个为True的值,如下:
a = 3 and 4 and 'hello' and 5 and 'HI'
print ( a )
# 打印结果如下:
HI
or逻辑运算是返回第一个True的值,若都为False则也返回最后一个为False的值,如下:
b = [] or {} or '' or None # 空列表、空字典、空字符串、None等转为bool值都为False
print ( b )
# 打印结果如下:
None