【Python深入浅出⑧】Python3运算符:开启编程魔法的钥匙

目录

  • 一、引言
  • 二、算术运算符:数学运算的基石
  • 2.1 基本算术运算符
  • 2.2 特殊算术运算符
  • 2.3 “+” 与 “*” 在序列中的运用
  • 三、比较运算符:数值比较的利器
  • 3.1 常规比较运算符
  • 3.2 特殊比较场景
  • 四、赋值运算符:变量赋值的桥梁
  • 4.1 基本赋值运算符
  • 4.2 复合赋值运算符
  • 五、逻辑运算符:条件判断的魔法棒
  • 5.1 逻辑与(and)
  • 5.2 逻辑或(or)
  • 5.3 逻辑非(not)
  • 5.4 逻辑运算符优先级
  • 六、位运算符:二进制世界的探索者
  • 6.1 按位与(&)
  • 6.2 按位或(|)
  • 6.3 按位异或(^)
  • 6.4 按位取反(~)
  • 6.5 左移(<<)和右移(>>)
  • 七、成员运算符:集合成员的探测器
  • 7.1 in 运算符
  • 7.2 not in 运算符
  • 八、身份运算符:对象身份的验证者
  • 8.1 is 运算符
  • 8.2 is not 运算符
  • 九、运算符优先级:运算顺序的指挥家
  • 9.1 优先级规则
  • 9.2 优先级示例
  • 十、总结

  • 一、引言

    Python3 运算符作为 Python 语言的重要组成部分,是我们与程序进行交互、实现各种功能的关键工具。运算符就像是编程语言的 “魔法咒语”,通过它们,我们可以对数据进行各种操作,实现从简单的数学计算到复杂的逻辑判断等功能。掌握 Python3 运算符,就如同掌握了一把开启 Python 编程世界大门的钥匙,能够帮助我们更高效、更灵活地编写代码,实现各种创意和想法。无论是初涉编程领域的新手,还是经验丰富的开发者,深入理解和熟练运用 Python3 运算符都是提升编程能力的必经之路。接下来,就让我们一起走进 Python3 运算符的奇妙世界,探索它们的奥秘吧!

    二、算术运算符:数学运算的基石

    2.1 基本算术运算符

    在 Python 中,加法(+)、减法(-)、乘法(*)、除法(/)是最基础的算术运算符 ,它们的功能和数学中的对应运算基本一致。

  • 加法(+):用于将两个数值相加,返回它们的和。例如:
  • a = 3
    b = 5
    result = a + b
    print(result)  # 输出8
    
  • 减法(-):从第一个数值中减去第二个数值,返回差。例如:
  • a = 10
    b = 4
    result = a - b
    print(result)  # 输出6
    
  • 乘法(*):将两个数值相乘,返回乘积。例如:
  • a = 6
    b = 7
    result = a * b
    print(result)  # 输出42
    
  • 除法(/):将第一个数值除以第二个数值,返回的结果是浮点数(即使能整除)。例如:
  • a = 15
    b = 3
    result = a / b
    print(result)  # 输出5.0
    

    2.2 特殊算术运算符

    除了上述基本运算符,Python 还有一些特殊的算术运算符,它们在特定的计算场景中发挥着重要作用。

  • 取模(%):计算两个数值相除的余数。例如,在计算一个数是否能被另一个数整除时,取模运算就非常有用。
  • a = 17
    b = 5
    result = a % b
    print(result)  # 输出2
    

    在时间计算中,我们可以利用取模运算将总秒数转换为小时、分钟和秒的形式。比如将 10000 秒转换为小时、分钟和秒:

    total_seconds = 10000
    hours = total_seconds // 3600
    minutes = (total_seconds % 3600) // 60
    seconds = total_seconds % 60
    print(f"{hours}小时{minutes}分钟{seconds}秒")  # 输出2小时46分钟40秒
    
  • 幂():用于计算一个数的指定次幂。例如计算 2 的 3 次方:
  • a = 2
    b = 3
    result = a ** b
    print(result)  # 输出8
    

    在科学计算和金融领域,幂运算经常用于计算复利、增长模型等。比如计算本金为 1000 元,年利率为 5%,存 3 年的复利终值:

    principal = 1000
    rate = 0.05
    years = 3
    future_value = principal * (1 + rate) ** years
    print(future_value)  # 输出1157.625
    
  • 整除(//):将两个数值相除,返回商的整数部分(向下取整)。这在需要获取整数结果的场景中很常用,比如计算平均分配物品时每人能得到的数量。
  • a = 17
    b = 5
    result = a // b
    print(result)  # 输出3
    

    整除与普通除法的区别在于,普通除法(/)无论是否能整除,结果都是浮点数;而整除(//)则返回整数结果。例如:

    a = 10
    b = 3
    print(a / b)  # 输出3.3333333333333335
    print(a // b)  # 输出3
    

    2.3 “+” 与 “*” 在序列中的运用

    在 Python 中,“+” 和 “*” 运算符不仅适用于数值计算,在字符串、列表、元组等序列类型中也有着独特的功能。

  • “+” 的拼接合并功能:在字符串、列表、元组中,“+” 运算符用于将两个序列拼接合并成一个新的序列。
  • # 字符串拼接
    str1 = "Hello, "
    str2 = "world!"
    result_str = str1 + str2
    print(result_str)  # 输出Hello, world!
    
    # 列表合并
    list1 = [1, 2, 3]
    list2 = [4, 5, 6]
    result_list = list1 + list2
    print(result_list)  # 输出[1, 2, 3, 4, 5, 6]
    
    # 元组拼接
    tuple1 = (1, 2)
    tuple2 = (3, 4)
    result_tuple = tuple1 + tuple2
    print(result_tuple)  # 输出(1, 2, 3, 4)
    

    在实际应用中,字符串拼接常用于生成动态的文本内容,比如生成邮件正文、日志信息等;列表和元组的合并则在数据处理和算法实现中频繁使用,比如将多个数据片段合并成一个完整的数据集。

  • “*” 的复制功能:在字符串、列表、元组中,“*” 运算符用于将序列复制指定的次数,生成一个新的序列。
  • # 字符串复制
    str3 = "Ha"
    result_str3 = str3 * 3
    print(result_str3)  # 输出HaHaHa
    
    # 列表复制
    list3 = [0]
    result_list3 = list3 * 5
    print(result_list3)  # 输出[0, 0, 0, 0, 0]
    
    # 元组复制
    tuple3 = (1,)
    result_tuple3 = tuple3 * 4
    print(result_tuple3)  # 输出(1, 1, 1, 1)
    

    在开发游戏时,我们可以使用列表复制来快速初始化游戏地图的某些元素;在生成测试数据时,字符串和元组的复制也能帮助我们高效地创建大量重复的样本。

    三、比较运算符:数值比较的利器

    3.1 常规比较运算符

    在 Python 中,比较运算符用于比较两个值的大小或判断它们是否相等,其返回结果为布尔值(True 或 False) 。常见的比较运算符有等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。

  • 等于(==):判断两个值是否相等。例如:
  • a = 5
    b = 5
    print(a == b)  # 输出True
    

    在实际应用中,在判断用户输入的密码是否与预设密码一致时,就可以使用等于运算符。

    user_password = "123456"
    correct_password = "123456"
    if user_password == correct_password:
        print("密码正确,登录成功!")
    else:
        print("密码错误,请重新输入!")
    
  • 不等于(!=):判断两个值是否不相等。例如:
  • a = 8
    b = 10
    print(a!= b)  # 输出True
    
  • 大于(>):判断左边的值是否大于右边的值。例如:
  • a = 15
    b = 10
    print(a > b)  # 输出True
    
  • 小于(<):判断左边的值是否小于右边的值。例如:
  • a = 3
    b = 7
    print(a < b)  # 输出True
    
  • 大于等于(>=):判断左边的值是否大于或等于右边的值。例如:
  • a = 10
    b = 10
    print(a >= b)  # 输出True
    
  • 小于等于(<=):判断左边的值是否小于或等于右边的值。例如:
  • a = 5
    b = 8
    print(a <= b)  # 输出True
    

    3.2 特殊比较场景

    除了数值比较,比较运算符在字符串、列表、元组等数据类型中也有特殊的比较规则。

  • 字符串按字典序比较:Python 中的字符串比较是基于字典序的,也就是按照字符的 Unicode 编码值进行比较。从字符串的第一个字符开始,依次比较每个字符的编码值,直到找到不同的字符或到达字符串末尾。
  • str1 = "apple"
    str2 = "banana"
    print(str1 < str2)  # 输出True,因为'a'的Unicode编码小于'b'
    

    当需要对字符串列表进行排序时,就会用到这种字典序比较。比如对一个水果列表进行排序:

    fruits = ["banana", "apple", "cherry"]
    sorted_fruits = sorted(fruits)
    print(sorted_fruits)  # 输出['apple', 'banana', 'cherry']
    
  • 列表和元组按元素逐个比较:从第一个元素开始,依次比较两个列表或元组中对应位置的元素,直到找到不同的元素或到达末尾。如果所有元素都相等,则两个列表或元组相等;如果某个位置的元素不同,则根据该元素的比较结果确定整个列表或元组的大小关系;如果一个列表或元组的元素已经比较完,而另一个还有剩余元素,则剩余元素多的列表或元组更大。
  • list1 = [1, 2, 3]
    list2 = [1, 2, 4]
    print(list1 < list2)  # 输出True,因为第三个元素3小于4
    
    tuple1 = (1, 2)
    tuple2 = (1, 2, 3)
    print(tuple1 < tuple2)  # 输出True,因为tuple2的元素更多
    

    在实际应用中,当需要对包含列表或元组的数据进行排序时,这种比较规则就会发挥作用。比如对一个包含成绩列表的学生信息进行排序:

    students = [
        ("Alice", [85, 90, 78]),
        ("Bob", [76, 88, 80]),
        ("Charlie", [92, 89, 95])
    ]
    sorted_students = sorted(students, key=lambda x: x[1])
    print(sorted_students)  
    # 输出[('Bob', [76, 88, 80]), ('Alice', [85, 90, 78]), ('Charlie', [92, 89, 95])]
    

    四、赋值运算符:变量赋值的桥梁

    4.1 基本赋值运算符

    在 Python 中,“=” 是最基本的赋值运算符,它的作用是将右侧的值赋给左侧的变量 。在变量命名时,需遵循 Python 的命名规则,变量名只能包含字母、数字和下划线,且不能以数字开头,同时要避免使用 Python 的关键字,如 “if”“while” 等。例如:

    x = 10  # 将10赋给变量x
    y = 3.14  # 将浮点数3.14赋给变量y
    name = "Alice"  # 将字符串"Alice"赋给变量name
    

    在这个例子中,我们分别创建了三个变量x、y和name,并使用 “=” 运算符为它们赋予了不同类型的值。在实际编程中,基本赋值运算符是最常用的操作之一,它是构建复杂程序的基础。比如在开发一个简单的数学计算程序时,我们可以使用基本赋值运算符来存储计算结果:

    a = 5
    b = 3
    sum_result = a + b
    print(sum_result)  # 输出8
    

    4.2 复合赋值运算符

    为了简化代码编写,提高编程效率,Python 还提供了一系列复合赋值运算符,这些运算符是在基本赋值运算符的基础上,结合了其他算术运算符。常见的复合赋值运算符有加后赋值(+=)、减后赋值(-=)、乘后赋值(*=)、除后赋值(/=)、取模后赋值(%=)、幂赋值(**=)、整除赋值(//=)。
    加后赋值(+=):将变量自身与右侧的值相加,然后将结果重新赋给该变量。例如:

    x = 5
    x += 3  # 等价于x = x + 3
    print(x)  # 输出8
    

    在实际应用中,当我们需要对一个变量进行累加操作时,“+=” 运算符就非常方便。比如计算 1 到 10 的累加和:

    sum_num = 0
    for i in range(1, 11):
        sum_num += i
    print(sum_num)  # 输出55
    
  • 减后赋值(-=):将变量自身减去右侧的值,然后将结果重新赋给该变量。例如:
  • y = 10
    y -= 4  # 等价于y = y - 4
    print(y)  # 输出6
    
  • 乘后赋值(*=):将变量自身与右侧的值相乘,然后将结果重新赋给该变量。例如:
  • a = 7
    a *= 2  # 等价于a = a * 2
    print(a)  # 输出14
    
  • 除后赋值(/=):将变量自身除以右侧的值,然后将结果重新赋给该变量,结果为浮点数。例如:
  • b = 20
    b /= 4  # 等价于b = b / 4
    print(b)  # 输出5.0
    
  • 取模赋值(%=):计算变量自身除以右侧的值的余数,然后将结果重新赋给该变量。例如:
  • c = 17
    c %= 5  # 等价于c = c % 5
    print(c)  # 输出2
    
  • 幂赋值(=)**:将变量自身作为底数,右侧的值作为指数进行幂运算,然后将结果重新赋给该变量。例如:
  • d = 2
    d **= 3  # 等价于d = d ** 3
    print(d)  # 输出8
    
  • 整除赋值(//=):将变量自身除以右侧的值,然后将结果的整数部分(向下取整)重新赋给该变量。例如:
  • e = 17
    e //= 5  # 等价于e = e // 5
    print(e)  # 输出3
    

    五、逻辑运算符:条件判断的魔法棒

    5.1 逻辑与(and)

    “and” 运算符用于逻辑与操作,就像生活中我们说的 “并且”,只有当两个操作数都为 True 时,结果才为 True;只要有一个操作数为 False,结果就为 False。在 Python 中,“and” 采用短路计算,即如果第一个操作数为 False,就不会计算第二个操作数,直接返回 False,因为无论第二个操作数是什么,结果都已经确定为 False 了。例如:

    a = 5
    b = 3
    c = 10
    if a > b and c > a:
        print("两个条件都满足")
    else:
        print("至少有一个条件不满足")
    

    在这个例子中,首先判断a > b,结果为 True,然后继续判断c > a,结果也为 True,所以整个 “and” 表达式的结果为 True,输出 “两个条件都满足”。如果将c的值改为 2,那么a > b为 True,但c > a为 False,由于 “and” 的一假即假特性,整个表达式结果为 False,输出 “至少有一个条件不满足”。

    5.2 逻辑或(or)

    “or” 运算符用于逻辑或操作,类似生活中说的 “或者”,只要两个操作数中至少有一个为 True,结果就为 True;只有当两个操作数都为 False 时,结果才为 False。“or” 同样采用短路计算,如果第一个操作数为 True,就不会计算第二个操作数,直接返回 True,因为无论第二个操作数是什么,结果都已经确定为 True 了。例如:

    x = 8
    y = 12
    z = 5
    if x > 10 or z > y:
        print("至少有一个条件满足")
    else:
        print("两个条件都不满足")
    

    在这个例子中,x > 10为 False,接着判断z > y,结果也为 False,两个条件都不满足,所以整个 “or” 表达式的结果为 False,输出 “两个条件都不满足”。如果将z的值改为 15,那么x > 10为 False,但z > y为 True,由于 “or” 的一真即真特性,整个表达式结果为 True,输出 “至少有一个条件满足”。

    5.3 逻辑非(not)

    “not” 运算符用于对一个布尔值进行取反操作,如果操作数为 True,“not” 运算后的结果为 False;如果操作数为 False,“not” 运算后的结果为 True。例如:

    flag = True
    print(not flag)  # 输出False
    
    flag2 = False
    print(not flag2)  # 输出True
    

    在实际应用中,当我们需要判断某个条件不成立时,就可以使用 “not” 运算符。比如判断一个数是否不大于 10:

    num = 8
    if not num > 10:
        print("这个数不大于10")
    else:
        print("这个数大于10")
    

    5.4 逻辑运算符优先级

    在 Python 中,逻辑运算符的优先级顺序为:not > and > or。这意味着在一个包含多个逻辑运算符的表达式中,“not” 会先被计算,然后是 “and”,最后是 “or”。例如:

    a = True
    b = False
    c = True
    result = a or not b and c
    print(result)  # 输出True
    

    在这个例子中,首先计算not b,结果为 True;然后计算not b and c,即 True and True,结果为 True;最后计算a or (not b and c),即 True or True,结果为 True。如果我们想要改变运算顺序,可以使用括号。括号内的表达式会先被计算,就像数学运算中的括号一样,能够改变运算的优先级。例如:

    a = True
    b = False
    c = True
    result = (a or not b) and c
    print(result)  # 输出True
    

    在这个例子中,先计算括号内的a or not b,即 True or True,结果为 True;然后再计算(a or not b) and c,即 True and True,结果为 True。通过合理使用括号,可以使复杂的逻辑表达式更加清晰,避免因优先级问题导致的错误。

    六、位运算符:二进制世界的探索者

    在计算机的底层世界里,数据是以二进制的形式存储和处理的。位运算符就是直接对二进制位进行操作的特殊运算符,它们能够让我们深入到数据的最底层,实现一些高效且独特的功能。在 Python 中,位运算符包括按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。

    6.1 按位与(&)

    按位与运算符 “&” 的功能是对两个操作数的二进制位进行与运算。其运算规则是:当两个操作数对应位都为 1 时,结果位才为 1;否则,结果位为 0。这就好比两个开关串联,只有当两个开关都闭合(对应位为 1)时,电路才通(结果位为 1)。例如,计算 5 & 3 的过程如下:

    a = 5  # 二进制为 0b101
    b = 3  # 二进制为 0b011
    result = a & b
    print(result)  # 输出1
    

    在这个例子中,5 的二进制是 0b101,3 的二进制是 0b011,按位与运算过程如下:

      0b101
    & 0b011
    -------
      0b001  # 即十进制的1
    

    按位与运算在实际应用中常用于提取特定位信息。比如,在图像处理中,我们可以通过按位与运算来提取图像像素的某些颜色通道信息;在权限管理系统中,可以用按位与运算来判断用户是否具有某些特定权限。

    6.2 按位或(|)

    按位或运算符 “|” 用于对两个操作数的二进制位进行或运算。其运算规则是:只要两个操作数对应位中有一个为 1,结果位就为 1;只有当两个对应位都为 0 时,结果位才为 0。这类似于两个开关并联,只要有一个开关闭合(对应位为 1),电路就通(结果位为 1)。例如,计算 5 | 3 的过程如下:

    a = 5  # 二进制为 0b101
    b = 3  # 二进制为 0b011
    result = a | b
    print(result)  # 输出7
    

    5 的二进制是 0b101,3 的二进制是 0b011,按位或运算过程如下:

     0b101
    | 0b011
    -------
      0b111  # 即十进制的7
    

    按位或运算常用于设置某些标志位。比如,在文件系统中,可以通过按位或运算来设置文件的读写权限标志;在通信协议中,用按位或运算来组合不同的控制位信息。

    6.3 按位异或(^)

    按位异或运算符 “^” 对两个操作数的二进制位进行异或运算。其运算规则是:当两个操作数对应位不同时,结果位为 1;当两个对应位相同时,结果位为 0。这就好像一个异或门电路,只有输入不同时,输出才为 1。例如,计算 5 ^ 3 的过程如下:

    a = 5  # 二进制为 0b101
    b = 3  # 二进制为 0b011
    result = a ^ b
    print(result)  # 输出6
    

    5 的二进制是 0b101,3 的二进制是 0b011,按位异或运算过程如下:

      0b101
    ^ 0b011
    -------
      0b110  # 即十进制的6
    

    按位异或运算在数据加密、校验和纠错等领域有着广泛应用。比如,在简单的数据加密算法中,可以使用按位异或运算对数据进行加密和解密;在数据传输过程中,通过按位异或运算生成校验码来检测数据是否传输错误。

    6.4 按位取反(~)

    按位取反运算符 “~” 用于对操作数的二进制位进行取反操作,即将 0 变为 1,将 1 变为 0。在 Python 中,整数是以补码形式存储的,所以按位取反的结果需要考虑补码的转换。例如,计算~5 的过程如下:

    a = 5  # 二进制为 0b00000101
    result = ~a
    print(result)  # 输出 -6
    

    5 的二进制原码是 0b00000101,按位取反后得到 0b11111010,这是补码形式。对于负数的补码,我们需要先减 1,再取反得到原码,即 0b11111010 减 1 后为 0b11111001,取反后为 0b10000110,也就是十进制的 -6。

    按位取反运算在一些需要对二进制位进行反向操作的场景中很有用,比如在位掩码操作中,通过按位取反可以方便地对特定位的值进行操作。

    6.5 左移(<<)和右移(>>)

    左移运算符 “<<” 用于将操作数的二进制位向左移动指定的位数,右边空出的位用 0 填充。例如,计算 5 << 2 的过程如下:

    a = 5  # 二进制为 0b101
    result = a << 2
    print(result)  # 输出20
    

    5 的二进制是 0b101,左移 2 位后变为 0b10100,即十进制的 20。左移操作相当于将原数乘以 2 的移动位数次方,在这里 5 << 2 相当于 5 * 2 ** 2 = 20。
    右移运算符 “>>” 用于将操作数的二进制位向右移动指定的位数,左边空出的位用 0 填充(对于无符号数或正数)。例如,计算 20 >> 2 的过程如下:

    a = 20  # 二进制为 0b10100
    result = a >> 2
    print(result)  # 输出5
    

    20 的二进制是 0b10100,右移 2 位后变为 0b101,即十进制的 5。右移操作相当于将原数除以 2 的移动位数次方并取整,在这里 20 >> 2 相当于 20 // 2 ** 2 = 5。

    左移和右移运算在一些需要快速进行乘法和除法运算的场景中非常有用,因为位运算的速度通常比常规的乘除法运算要快。同时,在处理二进制数据时,左移和右移也常用于对数据进行移位操作,以满足特定的算法需求。

    七、成员运算符:集合成员的探测器

    在 Python 编程中,我们经常需要判断一个元素是否属于某个集合,比如一个单词是否在字符串中,一个数字是否在列表里,或者一个键是否在字典中。这时候,成员运算符就派上用场了。Python 中的成员运算符主要有两个:in 和 not in ,它们就像探测器一样,帮助我们快速准确地判断元素与集合之间的关系。

    7.1 in 运算符

    “in” 运算符用于检查一个对象是否存在于指定的集合中,比如字符串、列表、元组、字典等。如果对象存在于集合中,返回 True;否则,返回 False。

    # 字符串中检查子串
    text = "Hello, Python!"
    print("Python" in text)  # 输出True,因为"Python"在text字符串中
    
    # 列表中检查元素
    fruits = ["apple", "banana", "cherry"]
    print("banana" in fruits)  # 输出True,因为"banana"在fruits列表中
    
    # 元组中检查元素
    numbers = (1, 2, 3, 4, 5)
    print(3 in numbers)  # 输出True,因为3在numbers元组中
    
    # 字典中检查键
    person = {"name": "Alice", "age": 25}
    print("name" in person)  # 输出True,因为"name"是person字典的键
    

    在实际应用中,“in” 运算符常用于条件判断。比如在一个用户登录系统中,我们可以用 “in” 运算符检查用户输入的用户名是否在已注册用户列表中:

    registered_users = ["user1", "user2", "user3"]
    user_input = input("请输入用户名:")
    if user_input in registered_users:
        print("用户名已存在,请重新输入!")
    else:
        print("用户名可用")
    

    7.2 not in 运算符

    “not in” 运算符与 “in” 运算符相反,用于检查一个对象是否不存在于指定的集合中。如果对象不存在于集合中,返回 True;否则,返回 False。

    # 字符串中检查子串
    text = "Hello, Python!"
    print("Java" not in text)  # 输出True,因为"Java"不在text字符串中
    
    # 列表中检查元素
    fruits = ["apple", "banana", "cherry"]
    print("orange" not in fruits)  # 输出True,因为"orange"不在fruits列表中
    
    # 元组中检查元素
    numbers = (1, 2, 3, 4, 5)
    print(6 not in numbers)  # 输出True,因为6不在numbers元组中
    
    # 字典中检查键
    person = {"name": "Alice", "age": 25}
    print("gender" not in person)  # 输出True,因为"gender"不是person字典的键
    

    在开发一个文件管理系统时,我们可以用 “not in” 运算符检查某个文件是否不在指定的文件夹中:

    import os
    
    folder_files = os.listdir("your_folder_path")
    file_to_check = "example.txt"
    if file_to_check not in folder_files:
        print(f"{file_to_check} 不在该文件夹中")
    else:
        print(f"{file_to_check} 存在于该文件夹中")
    

    成员运算符 “in” 和 “not in” 在 Python 编程中非常实用,它们为我们提供了一种简洁高效的方式来处理元素与集合之间的关系,是每个 Python 开发者都应该熟练掌握的工具。

    八、身份运算符:对象身份的验证者

    在 Python 编程中,我们常常需要判断两个对象之间的关系,不仅仅是它们的值是否相等,还包括它们在内存中的身份是否相同。这时候,身份运算符就发挥了重要作用。Python 提供了两个身份运算符:is 和 is not ,它们就像是对象身份的验证者,帮助我们深入了解对象在内存中的存储和引用情况。

    8.1 is 运算符

    “is” 运算符用于比较两个对象的内存地址是否相同,也就是判断它们是否是同一个对象的引用。在 Python 中,每个对象都有其唯一的内存地址,就像每个人都有唯一的身份证号码一样。“is” 运算符就像是在检查两个对象的 “身份证号码” 是否一致。如果两个对象的内存地址相同,说明它们在内存中是同一个对象,“is” 运算结果为 True;否则,结果为 False。
    下面来看一些代码示例:

    a = [1, 2, 3]
    b = a
    c = [1, 2, 3]
    
    print(a is b)  # 输出: True,因为a和b指向同一个列表对象
    print(a is c)  # 输出: False,因为a和c指向不同的列表对象
    

    在这个例子中,a和b指向同一个列表对象,所以a is b返回 True;而c虽然和a的值相同,但它是一个新创建的列表对象,在内存中有不同的地址,所以a is c返回 False。

    这里需要特别注意 “is” 与 “” 运算符的区别。“” 运算符用于比较两个对象的值是否相等,它关注的是对象的内容;而 “is” 运算符关注的是对象的身份,即内存地址。例如:

    a = [1, 2, 3]
    b = [1, 2, 3]
    
    print(a == b)  # 输出: True,因为a和b的值相等
    print(a is b)  # 输出: False,因为a和b是不同的对象,内存地址不同
    

    在这个例子中,a和b的值相同,所以a == b为 True;但它们是不同的列表对象,内存地址不同,所以a is b为 False。

    8.2 is not 运算符

    “is not” 运算符与 “is” 运算符相反,用于判断两个对象的内存地址是否不同,即它们是否不是同一个对象的引用。如果两个对象的内存地址不同,“is not” 运算结果为 True;否则,结果为 False。
    以下是代码示例:

    a = [4, 5, 6]
    b = [4, 5, 6]
    c = a
    
    print(a is not b)  # 输出: True,因为a和b是不同的对象,内存地址不同
    print(a is not c)  # 输出: False,因为a和c指向同一个对象
    

    在这个例子中,a和b是不同的列表对象,内存地址不同,所以a is not b返回 True;而a和c指向同一个对象,所以a is not c返回 False。

    身份运算符在 Python 编程中有着重要的应用场景,比如在判断变量是否为 None 时,通常使用 “is” 运算符,因为 None 是一个单例对象,所有对 None 的引用都指向同一个内存地址。在比较两个对象是否为同一个实例时,身份运算符也能帮助我们快速准确地做出判断,为程序的逻辑控制提供有力支持。

    九、运算符优先级:运算顺序的指挥家

    在 Python 编程中,当一个表达式中包含多个运算符时,运算的先后顺序就显得尤为关键。运算符优先级就像是一位指挥家,它决定了各个运算符在表达式中的执行顺序,确保程序能够按照我们预期的方式进行计算。

    9.1 优先级规则

    Python 运算符的优先级从高到低大致如下:

  • 括号(()):括号内的表达式会被优先计算,这是改变运算顺序最直接的方式。就像在数学运算中,我们会先计算括号内的式子一样,在 Python 中也遵循同样的规则。例如(3 + 4) * 2,会先计算括号内的3 + 4,得到 7,再乘以 2,最终结果为 14。
  • 幂运算()**:计算一个数的指定次幂,优先级仅次于括号。例如2 ** 3 ** 2,会先计算3 ** 2,得到 9,再计算2 ** 9,结果为 512。
  • 正负号(+x, -x):表示一元加法(正号)或一元减法(负号),用于改变操作数的正负。例如-5 + 3,先处理负号,将 5 变为 -5,再进行加法运算,结果为 -2。
  • 算术运算符(*, /, //, %):乘法、除法、整除和取模运算,它们的优先级相同,按照从左到右的顺序依次计算。例如10 / 2 * 3,先计算10 / 2,得到 5,再乘以 3,结果为 15。
  • 算术运算符(+,-):加法和减法运算,优先级低于乘除取模,同样按照从左到右的顺序计算。例如5 + 3 – 2,先计算5 + 3,得到 8,再减去 2,结果为 6。
  • 位运算符(<<,>>, &, ^, |):位移运算(左移<<和右移>>)以及位与&、位异或^、位或|运算。这些运算符的优先级相对较低,并且位移运算的优先级略高于位与、位异或和位或运算。例如3 << 2 & 7,先计算3 << 2,得到 12,再与 7 进行按位与运算,结果为 4。
  • 比较运算符(<, <=,>, >=, ==,!=, is, is not, in, not in):用于比较两个值的大小或判断它们之间的关系,返回布尔值。这些运算符的优先级相同,低于位运算符。例如3 > 2 and 5 < 10,先分别计算3 > 2和5 < 10,得到两个布尔值 True,再进行逻辑与运算,最终结果为 True。
  • 逻辑运算符(not, and, or):逻辑非not、逻辑与and和逻辑或or运算。其中,not的优先级最高,and次之,or最低。例如not 3 > 5 and 4 < 6,先计算not 3 > 5,得到 True,再计算4 < 6,也得到 True,最后进行逻辑与运算,结果为 True。
  • 赋值运算符(=, +=, -=, *=, /=, //=, %=, = 等):用于给变量赋值,优先级最低。赋值运算符是从右到左进行计算的,例如a = b = c = 1,会先将 1 赋给c,再将c的值赋给b,最后将b的值赋给a,最终a、b、c的值都为 1。
  • 9.2 优先级示例

    为了更直观地理解运算符优先级对表达式计算结果的影响,我们来看几个复杂的表达式示例:

    # 示例1
    result1 = 2 + 3 * 4 ** 2
    print(result1)  # 输出 50
    

    在这个例子中,根据运算符优先级,先计算幂运算4 ** 2,得到 16;再计算乘法3 * 16,得到 48;最后计算加法2 + 48,结果为 50。

    # 示例2
    result2 = (2 + 3) * 4 ** 2
    print(result2)  # 输出 80
    

    这里使用了括号,改变了运算顺序。先计算括号内的加法2 + 3,得到 5;再计算幂运算4 ** 2,得到 16;最后计算乘法5 * 16,结果为 80。

    # 示例3
    result3 = 5 > 3 and 2 < 4 or 6 > 8
    print(result3)  # 输出 True
    

    根据逻辑运算符的优先级,先计算比较运算符,5 > 3为 True,2 < 4为 True,6 > 8为 False;然后计算and运算,True and True为 True;最后计算or运算,True or False为 True。

    从这些示例可以看出,运算符优先级直接影响着表达式的计算结果。在编写复杂的表达式时,一定要清楚各个运算符的优先级,避免因优先级问题导致计算结果错误。如果对运算顺序存在疑问,使用括号明确运算顺序是一个非常好的习惯,它可以使代码更加清晰易读,减少潜在的错误。例如,在一个金融计算程序中,计算复利的公式可能涉及多个运算符,如果不明确运算顺序,很可能得到错误的结果,给用户带来损失。因此,合理运用运算符优先级和括号,是编写高质量 Python 代码的重要保障。

    十、总结

    在 Python3 的编程世界里,运算符就像是一套强大的 “魔法工具包”,为我们提供了丰富多样的操作手段。从基础的算术运算符,到复杂的位运算符;从用于比较判断的比较运算符,到控制程序逻辑的逻辑运算符;还有用于检查成员关系的成员运算符,以及验证对象身份的身份运算符,每一种运算符都有其独特的功能和应用场景。

    算术运算符是我们进行数学计算的基础,无论是简单的加减乘除,还是复杂的幂运算、取模运算,它们都能轻松应对。比较运算符则在条件判断中发挥着关键作用,帮助我们决定程序的执行路径。赋值运算符是连接变量与值的桥梁,让我们能够灵活地存储和更新数据。逻辑运算符通过组合条件,实现复杂的逻辑判断,是构建程序逻辑的重要基石。位运算符深入到二进制层面,为我们提供了高效处理数据的能力,在一些底层开发和算法优化中有着不可替代的作用。成员运算符和身份运算符则从不同角度帮助我们处理对象之间的关系,使我们能够更准确地操作和管理数据。

    同时,了解运算符的优先级也是至关重要的。它就像交通规则一样,确保表达式中的运算符按照正确的顺序执行,避免因运算顺序混乱而导致的错误结果。在实际编程中,我们要根据具体的需求选择合适的运算符,并合理运用运算符的优先级和括号,使代码更加简洁、高效、易读。

    熟练掌握 Python3 运算符是成为优秀 Python 开发者的必备技能。它不仅能帮助我们更高效地解决各种编程问题,还能让我们编写出更加优雅、健壮的代码。希望大家在今后的 Python 编程实践中,不断练习和运用这些运算符,探索它们更多的潜力和用法,在 Python 的编程海洋中畅游得更加自如。

    作者:奔跑吧邓邓子

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python深入浅出⑧】Python3运算符:开启编程魔法的钥匙

    发表回复