查看: 197|回复: 0

Python算术赋值比较逻辑运算符详解与常见错误排查

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
背景与范围
Python 基础数据类型之后,实际开发中要对数据做计算、判断和赋值,就会频繁使用运算符。原文把 Python 内置运算符分为算术、赋值、比较、逻辑、位、成员、身份 7 类,本文只整理前四类常用运算符:算术、赋值、比较和逻辑。运算符是完成变量、数值运算的专用符号;操作数是参与运算的数据;表达式由操作数与运算符组合而成,例如 a + b 中 + 是运算符,a、b 是操作数。

一、算术运算符
算术运算符用于数字类型的数学运算,包括四则运算、整除、取余和幂运算。以 a=10、b=3 为例:+ 返回 13,- 返回 7,* 返回 30,/ 返回 3.3333333333333335,// 返回 3,% 返回 1,** 用于幂运算,a ** 2 返回 100。
  1. a = 10
  2. b = 3
  3. print(a / b) # 3.3333333333333335
  4. print(a // b) # 地板除向下取整:3
  5. print(a % b) # 取余数:1
  6. print(2 ** 5) # 2的5次方:32
复制代码

高频注意事项:
1. 浮点除法禁止除数为 0。分母为数字 0 会直接抛出 ZeroDivisionError,程序终止。异常是编程语言内置机制,表示程序运行时出现非法意外,无法继续向下执行。
2. Python3 中两个整数使用 / 运算,结果仍为浮点数,不会截断小数。例如 print(1 / 2) 得到 0.5,使用 f'{1 / 2:.3f}' 可格式化保留 3 位小数,输出 0.500。
3. % 只代表取余,不是百分号。原理和小学除法取余一致,7 % 2 返回 1。
4. 幂运算支持整数和小数次方。4 ** 2 返回 16,4 ** 0.5 返回 2.0,即开平方根。
5. 地板除 // 是向下取整,不是四舍五入。正数运算直观,负数会向下取更小整数,例如 7 // 2 返回 3,-7 // 2 返回 -4。

二、赋值运算符
赋值运算符的核心作用是把运算结果直接赋给变量。基础写法是 =,复合赋值包括 +=、-=、*=、/=、//=、%=、**=,它们分别等价于 a = a + b、a = a - b、a = a * b、a = a / b、a = a // b、a = a % b、a = a ** b。
  1. num = 6
  2. num += 4 # 等价 num = num + 4
  3. print(num) # 输出 10
复制代码

Python 不存在 ++、-- 自增自减运算符,如需增减 1,只能使用 num += 1、num -= 1 替代。

特殊用法一:连续赋值。多个变量可以绑定同一个值,从右向左依次赋值。
  1. a = b = 10
  2. print(f'a = {a}, b = {b}') # 输出:a = 10, b = 10
复制代码

特殊用法二:多元解包赋值。多个变量可同时赋值,一对一匹配。经典用途是无需中间变量交换两个变量值。
  1. a, b = 10, 20
  2. print(f'a = {a}, b = {b}') # 输出:a = 10, b = 20
  3. num1, num2 = 10, 20
  4. num1, num2 = num2, num1
  5. print(num1, num2) # 输出 20 10
复制代码

特殊用法三:+= 支持字符串、列表拼接。字符串和列表可以通过 += 完成拼接或合并,但字符串不支持 -= 等其他复合赋值。
  1. s = 'hello'
  2. s += ' python'
  3. print(s) # hello python
  4. lst = [1,2]
  5. lst += [3,4]
  6. print(lst) # [1, 2, 3, 4]
复制代码

赋值常见错误:
1. 区分赋值 = 和相等判断 ==。= 是把右侧值赋予左侧变量,== 是比较左右两边值是否相等。
  1. a = 5 # 赋值
  2. if a == 5: # 判断是否相等
  3.     pass
复制代码

2. /= 会自动把变量转为浮点类型,//= 则保留整型。
  1. n = 10
  2. n /= 2
  3. print(type(n)) # <class 'float'>
  4. m = 10
  5. m //= 2
  6. print(type(m)) # <class 'int'>
复制代码

3. 复合赋值运算符不可加空格拆分。a + = 2 属于非法语法,必须紧贴书写 a += 2。

三、比较运算符
比较运算符用于判断两个数据的大小、相等关系,运算结果固定为布尔值 True 或 False,多用于 if 判断和循环条件。常见运算符包括 >、<、>=、<=、==、!=。
  1. print(10 > 5) # True
  2. print(3 == 3.0) # True
  3. print('abc' == 'def') # False
复制代码

不同数据类型的比较规则:
1. 数字类型 int / float 直接对比数值大小,整数与等值浮点数判定相等。例如 3.5 > 2 返回 True,2.0 == 2 返回 True。
2. 字符串按 ASCII 码字典序逐字符对比。从第一个字符开始比较编码值,第一个不相等的字符直接决定整体结果,后续字符不再校验,并且区分大小写。例如 'apple' < 'banana' 返回 True,'9' > '88' 返回 True,因为首字符 9 的编码大于 8。
3. 列表、元组等序列逐元素依次对比,匹配规则和字符串字典序一致。例如 [1, 3] > [1, 2] 返回 True,(2,5) < (3,1) 返回 True。
4. Python3 禁止跨大类类型直接比较,数字与字符串、列表互相比较会直接报错。例如 print(5 > '3') 会抛出 TypeError。

Python 独有链式连续比较:常规多条件判断需要 and 连接,Python 支持直接连续拼接,两者完全等价。
  1. x = 5
  2. print(x > 1 and x < 10)
  3. print(1 < x < 10) # True
复制代码

浮点数易错点:计算机底层存储浮点数存在精度丢失,简单运算后可能产生极小误差,直接用 == 判定相等会出错。
  1. a = 0.1
  2. b = 0.2
  3. print(f'a = {a}')
  4. print(f'b = {b}')
  5. print(f'a + b = {a + b}')
  6. print(a == 0.3) # False,精度丢失导致判断错误
复制代码

正确解决方案是设置误差阈值,判断两个浮点数的差值绝对值是否小于阈值。
  1. a = 0.1 + 0.2
  2. b = 0.3
  3. eps = 1e-6 # 误差允许范围 0.000001
  4. print(abs(a - b) < eps) # True
复制代码

四、逻辑运算符
逻辑运算符用于联合多个布尔条件,多用于多分支和复合条件判断,共 and、or、not 三种。and 是逻辑与,两边全部为 True,结果才为 True,一假即假;or 是逻辑或,任意一边为 True,结果即为 True,一真即真;not 是逻辑非,属于单目运算符,对条件取反。
  1. print(3 > 1 and 5 < 10) # True
  2. print(2 > 5 and 4 < 6) # False
  3. print(2 > 5 or 4 < 6) # True
  4. print(10 < 2 or 3 > 8) # False
  5. print(not 5 > 2) # False
  6. print(not 3 < 1) # True
复制代码

核心特性是逻辑短路。a and b 中,若 a 为假,直接返回 a,不执行 b;a or b 中,若 a 为真,直接返回 a,不执行 b。利用短路可以避免执行后方表达式,也能优化运行效率。
  1. 0 and print('不会执行这句')
  2. 1 or print('不会执行这句')
复制代码

运算优先级从高到低为:not > and > or。复杂条件建议用括号 () 手动划分运算顺序,提升可读性。
  1. print(True or False and not True) # True
复制代码

全文总结
算术运算符负责数值数学运算,重点区分 /、//、% 三者差异,并警惕除数为 0 异常、负数取整规则和浮点数精度特性。赋值运算符用于变量赋值和复合赋值,需掌握连续赋值、多元解包交换变量等写法,明确区分 = 与 ==,注意 /= 会隐式改变变量数据类型。比较运算符结果固定为布尔值,不同数据类型对比规则不同,Python 支持链式比较简化多区间判断,浮点数不应直接用 == 判等,应通过误差阈值实现可靠判断。逻辑运算符用于组合多个判断条件,优先级遵循 not > and > or,核心特性是逻辑短路,满足判定条件后不再执行后续表达式。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-16 12:08 , Processed in 0.020441 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部