目录

Python基础-2运算符

Python基础 2》运算符

运算符的优先级:括号 > 幂运算 > 单目运算 > 乘除 > 加减 > 比较 > 逻辑非与或 > 赋值

推荐资料:

运算符用于对变量和值执行操作。

python的运算符大致分为以下几种:

  • 算术运算符
  • 赋值运算符
  • 比较运算符
  • 逻辑运算符
  • 身份运算符
  • 成员运算符
  • 位运算符

一、算术运算符

算术运算符与数值一起使用来执行常见的数学运算(+、-、*、/、%、**、//)

运算符名称实例
+x + y
-x - y
*x * y
/x / y
%取余(取模)x % y
**x ** y
//取整除(向下取整)x // y
# 算术运算符
# +、-、*、/、%、**、//
x = 3
y = 2
print(x + y)   # 5
print(x - y)   # 1
print(x * y)   # 6
print(x / y)   # 1.5
print(x % y)   # 1
print(x ** y)  # 3的平方=9
print(x // y)  # 向下取整

二、赋值运算符

主要用于变量的赋值操作(=、+=、-=、*=、/=、%=、//=、**=、&=、|=、^=、»=、«=)

运算符描述实例等同于
=赋值运算x = 5x = 5
+=加法赋值运算x += 3x = x + 3
-=减法赋值运算x -= 3x = x - 3
*=乘法赋值运算x *= 3x = x * 3
/=除法赋值运算x /= 3x = x / 3
%=取余赋值运算x %= 3x = x % 3
//=整除赋值运算x //= 3x = x // 3
**=幂赋值运算x **= 3x = x ** 3
&=与赋值运算x &= 3x = x & 3
^=异或赋值运算x ^= 3x = x ^ 3
»=右移赋值运算x »= 3x = x » 3
«=左移赋值运算x «= 3x = x « 3

案例代码:

# 赋值运算符
# 主要用于变量的赋值操作(=、+=、-=、*=、/=、%=、//=、**=、&=、|=、^=、>>=、<<=)
# += 加法赋值运算
a = 5
a += 3
print("a的值是:", a)  # a = a + 3  8
# -= 减法赋值运算
b = 3
b -= 4
print('b的值是:', b)  # b = b - 4  -1
# *= 乘法赋值运算
c = 5
c *= 10
print('c的值是:', c)  # c = c * 10  50
# /= 除法赋值运算
d = 8
d /= 2
print('d的值是:', d)  # d = d / 2  4
# %= 取余赋值运算
e = 10
e %= 3
print('e的值是:', e)  # e = e % 3  1
# **= 幂赋值运算
f = 10
f **= 3
print('f的值是:', f)  # f = f ** 3  1000
# //= 整除赋值运算
g = 20
g //= 3
print('g的值是:', g)  # g = g // 3  6
# &= 与赋值运算
h = 5
h &= 3
print('h的值是:', h)  # h = h & 3  1
# |= 或赋值运算
i = 5
i |= 3
print('i的值是:', i)  # i = i | 3  7
# ^= 异或赋值运算
j = 5
j ^= 3
print('j的值是:', j)  # j = j ^ 3  6
# >>= 右移赋值运算
k = 5
k >>= 3
print('k的值是:', k)  # k = k >> 3  0  [0101 => 0000 = 0]
print(k)  #
# <<= 左移赋值运算
l = 5
l <<= 3
print('l的值是:', l)  # l = l << 3  40  [0101 => 0010 1000 => 32+8 = 40]

# 特殊的赋值运算
# 【1】链式赋值
a = b = c = 10
print("a、b、c的值是:", a, b, c)  # 10 10 10

# [2】交叉赋值
a = 10
b = 20
print("a、b的值是:", a, b)  # 10 20
a, b = b, a
print("a、b的值是:", a, b)  # 20 10

# [3】解包赋值
num_list = [1, 2, 3]
a, b, c = num_list
print("a、b、c的值是:", a, b, c)  # 1 2 3

# 列表中的元素个数不够前面的变量解压的时候就会报错
# a, b, c, d = num_list
# print(d)  # ValueError: not enough values to unpack (expected 4, got 3)

# 如果列表中的元素多余位置变量的时候也会报错
# a, b = num_list
# print(a)
# print(b)  # ValueError: too many values to unpack (expected 2)

# 可以用下划线来存储不需要的变量值
# a, b, _ = num_list
# print(a)
# print(b)

三、比较运算符

用于比较两个值(= =、!= 、>、<、>=、<=)

运算符名称实例
= =等于x = = y
! =不等于x ! = y
>大于x > y
<小于x < y
> =大于等于x > = y
< =小于等于x < = y

案例代码:

# 比较运算符
# 用于比较两个值(==、!= 、>、<、>=、<=)
print(1 == 1)  # True
print(1 != 1)  # False
print(1 > 2)   # False
print(1 < 2)   # True
print(1 >= 2)  # False
print(1 <= 2)  # True

四、逻辑运算符

逻辑运算符一般用于组合语句中。(and、or、not)

运算符描述实例
and如果两个语句都为真,则返回True。x > 3 and x < 10
or如果其中一个语句为真,则返回True。x > 3 or x < 4
not反转结果,如果结果为true,则返回falsenot(x > 3 and x < 10)

案例代码:

# 逻辑运算符一般用于组合语句中。(and、or、not)
# 与或非
# 与 : 两者都必须 and
# 或 : 两者任一 or
# 非 : 取反 not
a = 10
b = -10
print(a > 0 and b > 0)
print(a > 0 or b < 0)
print(a > 0 or b > 0)
# a < 0 False not False ==> True
print(not a < 0)

# 连续多个and
print(10 > 0 and 5 > 0 or 3 < 0)  # True
print(10 > 0 or 5 > 0 or 3 < 0)  # True

# 提高运算的优先级 对优先的部分加 ()

# 运算优先级 : not > and > or
"""
假 and 真 or 假 and 真 or 假
假 or 假 or 假
假(False)
"""
print(3 > 4 and 4 > 3 or 1 == 3 and 'x' == 'x' or 3 > 3)  # False
"""
真 and (真 or 假) and (真 or 假)
真 and 真 and 真
真(True)
"""
print(not 3 > 4 and (4 > 3 or 1 == 3) and ('x' == 'x' or 3 > 3))  # True

五、身份运算符

身份运算符用于比较对象,不是比较是否相等,而是判断它们是否指向同一个内存位置。(is、is not)

运算符描述实例
is如果两个变量是同一个对象(指向同一个内存地址),则返回True。x is y
is not如果两个变量不是同一个对象(不指向同一个内存地址),则返回True、x is not y

案例代码:

# 身份运算符
# 比较对象是否指向同一个内存地址(is、is not)
# 由于列表是可变数据,因此即便值相等,所指向的内存地址也不一样,因此返回为False
x = [1, 2, 3]
y = [1, 2, 3]
print(x, id(x))  # [1, 2, 3] 3147884019840
print(y, id(y))  # [1, 2, 3] 3147884018816
print(x is y)  # False
print(x is not y)  # True
# 如果是不可变数据的话,对象所指向的内存地址是一致的,因此返回为True
x = 1
y = 1
print(x, id(x))  # 1 140711727033264
print(y, id(y))  # 1 140711727033264
print(x is y)  # True
print(x is not y)  # False

# 【== 和 is 的区别】,针对于可变数据类型就很明显。
# == 比较的是值 两个值是否相等
# is 比较的是值 和 内存地址是否相等
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print("id(l1):", id(l1))
print("id(l2):", id(l2))
print("l1 == l2:", l1 == l2)
print("l1 is l2:", l1 is l2)

六、成员运算符

成员运算符用于测试数据是否在对象中出现。(in、not in)

运算符描述使用形式实例
in如果对象存在于指定数据中(例如:列表、字符串)中,则返回True。x in y‘a’ in ‘apply’ 或者 4 in [1, 2, 3]
not in如果对象不存在于指定数据中(例如:列表、字符串)中,则返回True。x not y‘a’ not in ‘apply’ 或者 4 not in [1, 2, 3]

案例代码:

# 成员运算符
# 成员运算符用于测试数据是否在对象中出现。(in、not in)
# 案例1:列表
x = 4
y = [1, 2, 3]
print(x in y)  # False
print(x not in y)  # True
# 案例2:字符串
x = 'a'
y = 'apple'
print(x in y)  # True
print(x not in y)  # False

七、位运算符

位运算符用于比较二进制数据(&、|、^、~、«、»)

位运算按照数据在内存中的二进制位(Bit)进行操作,它一般用于底层开发(算法设计、驱动、图像处理、单片机等),在应用层开发(Web 开发、Linux 运维等)中并不常见。

想详细了解:

总结:

负数的左移右移,先获取补码,然后进行移位操作,最后在获取补码+1,前面添加符号

运算符描述使用形式实例
&按位与(只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。)1&1为 1,0&0为 0,1&0为 0x & y4 & 5
^按位异或(参与运算的两个二进制位不同时,结果为 1,相同时结果为 0)0^1为 1,0^0为 0,1^1为 0x ^ y4 ^ 5
~按位取反(反转所有位。作用是对参与运算的二进制位取反。)~x~8 或 ~-128
«按位左移(Python 左移运算符«用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补 0。)x « y9 « 3 或 -9 « 3
»按位右移(Python 右移运算符»用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。 如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1)x » y9 » 3 或 -9 » 3

案例代码:

# 位运算符
# 位运算符用于比较`二进制`数据(&、|、^、~、<<、>>)
"""
    正数:原码、负数:补码
    原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
    反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反[每一位取反(除符号位)]。
    补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
"""
print(4 & 5)  # 100 & 101 = 100 再转为10进制为4
print(4 | 5)  # 100 | 101 = 101 再转为10进制为5
print(4 ^ 5)  # 100 ^ 101 = 001 再转为10进制为1
print(~8)  # 正数=》负数-1 -9 【取反,补码取反后+1, 1000-> 0111+1 -> 1000 + 1 = 9, 取反变符号-9】
print(~-128)  # 负数=》正数-1 127
print(~-66)  # 01000010【66】 ->1011 1101 【-65】 -> 1011 1110【-66】
print(9 << 3)  # 1001 => 0100 1000 = 64+8 = 72
print(-9 << 3)  # 0111 => 1011 1000【负数】 => 0100 0111【71】+ 1【正数】  = -72
print(9 >> 3)  # 1001 => 0001 = 1
print(-9 >> 3)  # 0111 => 1110【负数】 => 0001 + 1【正数】 => 0010 => 2 => -2