【Python】入门到放弃之第五章《运算符》

上一篇:【Python】入门到放弃之第四章《数据类型转换》
下一篇:【Python】入门到放弃之第六章《字符串》


前言

这是本系列的第五章节内容,《运算符》。这又是一篇长文章。


一、定义

  • 运算符(Operator)是一种告诉编译器执行特定数学或逻辑操作的符号,用于表示针对数据的特定操作,也称之为操作符。根据不同的分类标准,运算符可以分为多种类型。

二、算术运算符

  • 算术运算符用于执行基本的数学运算,如加、减、乘、除等。

1.加法 (+)

  • 用于将两个数相加。

代码如下(示例):

result = 5 + 3  # 结果为 8

2.减法 (-)

  • 用于从一个数中减去另一个数。

代码如下(示例):

result = 10 - 3  # 结果为 7

3.乘法 (*)

  • 用于将两个数相乘。

代码如下(示例):

result = 4 * 3  # 结果为 12

4.除法 (/)

  • 用于将一个数除以另一个数,并返回商(浮点数)。

代码如下(示例):

result = 10 / 4  # 结果为 2.5

5.整除 (//)

  • 用于将一个数除以另一个数,并返回商的整数部分(向下取整)。

代码如下(示例):

result = 10 // 3  # 结果为 3

6.取模 (%)

  • 用于求两个数相除的余数。

代码如下(示例):

result = 10 % 3  # 结果为 1

7.幂 (**)

  • 用于计算左操作数的右操作数次幂。

代码如下(示例):

result = 2 ** 3  # 结果为 8

8.增强赋值运算符

  • 这些运算符结合了赋值和算术运算,使代码更简洁。(代码参考本章 四、赋值运算符–>2.复合赋值运算符)
  1. 加法赋值 (+=): x += y 相当于 x = x + y
  2. 减法赋值 (-=): x -= y 相当于 x = x - y
  3. 乘法赋值 (*=): x *= y 相当于 x = x * y
  4. 除法赋值 (/=): x /= y 相当于 x = x / y
  5. 整除赋值 (//=): x //= y 相当于 x = x // y
  6. 取模赋值 (%=): x %= y 相当于 x = x % y
  7. 幂赋值 (**=): x **= y 相当于 x = x ** y

三、比较(关系)运算符

  • Python中的比较运算符(也称为关系运算符)用于比较两个值之间的关系,并根据比较结果返回布尔值True或False。

1.等于 (==)

  • 检查两个值是否相等。

代码如下(示例):

a = 5  
b = 5  
print(a == b)  # 输出: True

2.不等于 (!=)

  • 检查两个值是否不相等。

代码如下(示例):

a = 5  
b = 6  
print(a != b)  # 输出: True

3.大于 (>)

  • 检查左边的值是否大于右边的值。

代码如下(示例):

a = 5  
b = 3  
print(a > b)  # 输出: True

4.小于 (<)

  • 检查左边的值是否小于右边的值。

代码如下(示例):

a = 3  
b = 5  
print(a < b)  # 输出: True

5.大于等于 (>=)

  • 检查左边的值是否大于或等于右边的值。

代码如下(示例):

a = 5  
b = 5  
print(a >= b)  # 输出: True

6.小于等于 (<=)

  • 检查左边的值是否小于或等于右边的值。

代码如下(示例):

a = 3  
b = 5  
print(a <= b)  # 输出: True

7.小结

  • 以上这些比较运算符不仅适用于数值类型,还适用于字符串、列表等序列类型,但比较的方式会根据数据类型而有所不同。例如,对于字符串,比较是基于字典序的;对于列表,比较是基于列表元素逐一比较的。

  • 值得注意的是,当比较的对象是可变类型(如列表)时,即使两个列表包含相同的元素,如果它们不是同一个对象(即内存地址不同),使用==比较也会返回True,因为==在这里是比较两个列表的内容是否相等,而不是比较它们的身份(即内存地址)。相反,is运算符用于比较两个对象的身份是否相同(即内存地址是否相同)。

  • 此外,Python中的比较运算符还可以用于构建更复杂的表达式,这些表达式可以包含多个比较运算符,并且可以使用逻辑运算符(and、or、not)来组合多个比较结果。

四、赋值运算符

  • Python 中的赋值运算符主要用于将值或表达式的结果赋给变量。最基本的赋值运算符是单个等号 =,但 Python 还提供了一些复合赋值运算符,它们结合了算术、位或其他运算符与赋值操作。

1.基本赋值运算符

  • =:最基本的赋值运算符,用于将右侧的值或表达式的结果赋给左侧的变量。

代码如下(示例):

x = 10    # 将 10 赋给变量 x

2.复合赋值运算符

  • 复合赋值运算符结合了算术、位或其他运算符与赋值操作,使代码更简洁易读。
  1. +=:加法赋值运算符。x += y 相当于 x = x + y。
  2. -=:减法赋值运算符。x -= y 相当于 x = x - y。
  3. *=:乘法赋值运算符。x *= y 相当于 x = x * y。
  4. /=:除法赋值运算符。x /= y 相当于 x = x / y。
  5. %=:取模赋值运算符。x %= y 相当于 x = x % y。
  6. **=:幂赋值运算符。x **= y 相当于 x = x ** y(注意:Python 3 中幂运算符是 **,不是 ^,后者是按位异或运算符)。
  7. //=:整除赋值运算符。x //= y 相当于 x = x // y。
  8. &=、|=、^=、<<=、>>=:这些是位运算符与赋值操作的结合,分别用于按位与、按位或、按位异或、左移和右移赋值。

代码如下(示例):

x = 10
x += 1  # x 现在是 11
x -= 2  # x 现在是 9
x *= 2  # x 现在是 18
x /= 3  # x 现在是 6.0
x %= 4  # x 现在是 2.0

# 使用幂赋值运算符  
z = 2
z **= 3  # z 现在是 823 次方)  

# 使用位运算符(这里只是示例,不代表实际有意义的操作)  
a = 6  # 二进制表示为 110  
a &= 3  # a 现在是 2(二进制 110 & 011 = 010

五、逻辑运算符

  • Python中的逻辑运算符用于在表达式中执行逻辑运算,这些运算通常返回布尔值(True 或 False)。

1.逻辑与(AND)

  • 使用符号 and(代码中使用“AND”会报错,下同)。如果两个操作数都为真(True),则结果为真(True)。如果任一操作数为假(False),则结果为假(False)。

代码如下(示例):

print(True and True)  # 输出: True  
print(True and False) # 输出: False  
print(False and True) # 输出: False  
print(False and False) # 输出: False

2.逻辑或(OR)

  • 使用符号 or。如果两个操作数中至少有一个为真(True),则结果为真(True)。如果两个操作数都为假(False),则结果为假(False)。

代码如下(示例):

print(True or True)  # 输出: True
print(True or False) # 输出: True
print(False or True) # 输出: True
print(False or False) # 输出: False

3.逻辑非(NOT)

  • 使用符号 not。它用于反转操作数的布尔值。如果操作数为真(True),则结果为假(False)。如果操作数为假(False),则结果为真(True)。

代码如下(示例):

print(not True)  # 输出: False  
print(not False) # 输出: True

4.小结

  • 逻辑运算符经常与比较运算符(如 ==、!=、<、>、<=、>=)和布尔值一起使用,以构建复杂的条件表达式。

代码如下(示例):

# 检查一个数是否同时大于10且小于20
x = 15
if x > 10 and x < 20:  
    print("x 在 10 和 20 之间")

# 检查一个数是否大于10或小于5
y = 15
if y > 10 or y < 5:
    print("y 大于 10 或小于 5")

输出如下(示例):

x 在 1020 之间
y 大于 10 或小于 5

六、位运算符

  • Python中的位运算符是针对整数类型的数据进行操作的,它们将数字视为二进制数,并在每一位上执行相应的逻辑运算。

1.按位与(&)

  • 对两个数的二进制表示进行逐位与操作。只有两个对应的二进制位都为1时,结果位才为1,否则为0。

代码如下(示例):

a = 60  # 二进制为 0011 1100  
b = 13  # 二进制为 0000 1101  
result = a & b  # 结果为 0000 1100,即12  

2.按位或(|)

  • 对两个数的二进制表示进行逐位或操作。只要两个对应的二进制位中有一个为1,结果位就为1,否则为0。

代码如下(示例):

a = 60  # 二进制为 0011 1100  
b = 13  # 二进制为 0000 1101  
result = a | b  # 结果为 0011 1101,即61  

3.按位异或(^)

  • 对两个数的二进制表示进行逐位异或操作。只有两个对应的二进制位不同时,结果位才为1,否则为0。

代码如下(示例):

a = 60  # 二进制为 0011 1100  
b = 13  # 二进制为 0000 1101  
result = a ^ b  # 结果为 0011 0001,即49  

4.按位取反(~)

  • 对一个数的二进制表示进行取反操作,即将0变为1,将1变为0。注意,Python中的数字是带符号的,因此取反操作后通常会导致结果的符号位也发生变化,进而影响到整个数的值。

代码如下(示例):

a = 60  # 二进制为 0011 1100(在Python中,整数以补码形式存储)  
result = ~a  # 结果为 -61(因为Python是带符号整数,取反后需要按补码规则解释)  

5.左移(<<)

  • 将一个数的二进制表示向左移动指定的位数,右侧用0填充。左移操作相当于乘以2的幂次方。

代码如下(示例):

a = 60  # 二进制为 0011 1100  
result = a << 2  # 结果为 1111 0000,即240  

6.右移(>>)

  • 将一个数的二进制表示向右移动指定的位数。对于正数,左侧用0填充;对于负数,Python使用算术右移,即用符号位(即最高位)填充左侧。右移操作相当于除以2的幂次方并向下取整。

代码如下(示例):

a = 60  # 二进制为 0011 1100  
result = a >> 2  # 结果为 0000 1111,即15  

七、成员运算符

  • Python中的成员运算符主要用于测试一个序列(如列表、元组、字符串或集合)中是否包含某个特定的值。主要的成员运算符有两个:
  1. in:如果指定的值在序列中,则返回True,否则返回False。
  2. not in:如果指定的值不在序列中,则返回True,否则返回False。

1.列表示例

  • 成员运算符in和not in不仅限于列表,它们也可以用于元组、字符串、集合(set)等任何可迭代对象。
  • 对于字典(dictionary),成员运算符用于检查键(key)是否存在于字典中,而不是值(value)。

代码如下(示例):

# 列表示例
fruits = ['apple', 'banana', 'cherry']

# 使用in运算符
if 'banana' in fruits:
    print("Yes, 'banana' is in the fruits list.")
else:
    print("No, 'banana' is not in the fruits list.")

# 使用not in运算符
if 'grape' not in fruits:
    print("Yes, 'grape' is not in the fruits list.")
else:
    print("No, 'grape' is in the fruits list.")

输出如下(示例):

Yes, 'banana' is in the fruits list.
Yes, 'grape' is not in the fruits list.

2.字典示例

  • 直接检查字典中是否包含某个值(如’John’)是不直观的,因为成员运算符in对字典来说只检查键。要检查值,你需要使用.values()方法,并考虑到in运算符对于集合(如.values()返回的)是有效的。

代码如下(示例):

# 字典示例
my_dict = {'name': 'John', 'age': 30}

# 检查键'name'是否在字典中
if 'name' in my_dict:
    print("Yes, 'name' is a key in the dictionary.")
else:
    print("No, 'name' is not a key in the dictionary.")

# 检查值'John'是否在字典中(这是错误的用法)
# 应该检查键对应的值
if 'John' in my_dict.values():
    print("Yes, 'John' is a value in the dictionary.")
else:
    print("No, 'John' is not a value in the dictionary.")

输出如下(示例):

Yes, 'name' is a key in the dictionary.
Yes, 'John' is a value in the dictionary.

八、身份运算符

  • Python中的身份运算符用于比较两个对象的身份(即它们在内存中的位置),而不是它们的值。有两个主要的身份运算符:is 和 is not。
  1. is:当两个对象在内存中的位置相同时,使用is运算符将返回True。这通常意味着它们实际上是同一个对象。
  2. is not:与is相反,当两个对象在内存中的位置不同时,使用is not运算符将返回True。

代码如下(示例):

# 示例 1: 使用 is 比较同一个对象
a = [1, 2, 3]
b = a
print(a is b)  # 输出: True,因为 a 和 b 指向同一个对象

# 示例 2: 使用 is 比较两个独立的对象
c = [1, 2, 3]
print(a is c)  # 输出: False,因为 a 和 c 指向不同的对象,尽管它们的内容相同

# 示例 3: 使用 is not 比较
print(a is not c)  # 输出: True,因为 a 和 c 不是同一个对象

# 示例 4: 使用 is with 数字和字符串字面量
x = 1
y = 1
# 对于小的整数和短的字符串,Python解释器可能为了优化内存使用而将它们缓存
# 所以有时候即使是字面量赋值,也可能看到 is 返回 True
print(x is y)  # 可能输出 True,取决于Python解释器的实现和缓存策略

# 示例 5: 比较两个 None 对象
n1 = None
n2 = None
print(n1 is n2)  # 输出: True,因为 None 在 Python 中是单例的
  • 注意:尽管在某些情况下(比如小整数和短字符串字面量),Python的解释器可能会缓存这些对象以节省内存,但在编写依赖于这种行为的代码时要小心,因为这不是语言规范的一部分,可能在不同的Python实现或版本中有所不同。对于自定义类型,这种缓存通常不会发生。

九、特殊运算符

  • *(星号)在函数调用中用于传递可变数量的参数
  • **(双星号)在函数调用中用于传递关键字参数
  • lambda 用于创建匿名函数
  • []、{}、() 用于定义列表、字典和元组

十、运算符的优先级

  • Python的运算符优先级决定了表达式中运算符的求值顺序。了解运算符的优先级对于编写清晰、无歧义的代码非常重要。Python的运算符优先级从高到低大致如下(注意,这个列表可能不是完全详尽的,但涵盖了最常用的运算符):
  1. 括号:()
    圆括号用于改变运算顺序,优先级最高。
  2. 幂运算符:**
    右结合运算符,用于计算左侧操作数的右侧操作数次幂。
  3. 正负号:+x, -x
    一元运算符,分别用于取正和取负。
  4. 按位取反:~
    对整数的二进制表示进行按位取反操作。
  5. 乘、除、取模、整除:*, /, //, %
    这些运算符用于乘法、除法、整除和取模运算。
  6. 加、减:+, -
    用于加法和减法运算。
  7. 位移运算符:<<, >>
    分别用于左移和右移操作。
  8. 按位与:&
    对两个数的二进制表示进行按位与操作。
  9. 按位异或:^
    对两个数的二进制表示进行按位异或操作。
  10. 按位或:|
    对两个数的二进制表示进行按位或操作。
  11. 比较运算符:<, <=, >, >=, ==, !=, is, is not, in, not in
    用于比较两个值的相对大小或身份。
  12. 布尔非:not
    逻辑非运算符,用于反转布尔值的真假。
  13. 布尔与:and
    逻辑与运算符,用于连接两个布尔表达式。
  14. 布尔或:or
    逻辑或运算符,用于连接两个布尔表达式。
  15. 条件表达式:a if condition else b(判断条件大于0,选择a,反之,选择b)
    三元运算符,根据条件选择两个值中的一个。
  16. 赋值运算符:=, +=, -=, *=, /=, %=, **=, //=, &=, |=, ^=, <<=, >>=
    用于给变量赋值或执行复合赋值操作。
  17. 身份运算符:is, is not
    比较两个对象的身份(即它们是否是同一个对象)。
  18. 成员运算符:in, not in
    检查一个值是否是一个序列(如列表、元组或字符串)的成员。

总结

以上,就是Python中运算符的全部内容。了解这些运算符及其优先级对于编写正确和高效的 Python 代码至关重要。不得不再次感叹:这也太长了吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值