对话实录
小白:(崩溃)我写了1 + '1',为什么 Python 会报错?
专家:(推眼镜)Python 是强类型语言,数字和字符串不能直接相加!想拼接?先转类型!
算术运算符三连击
1. 基础运算
# 标准操作
print(5 + 3) # → 8 加法运算,将两个数字相加
print(5 - 3) # → 2 减法运算,计算两个数字的差值
print(5 * 3) # → 15 乘法运算,得到两个数字的乘积
print(5 / 3) # → 1.666... 除法运算,结果为浮点数,即使两个操作数都是整数
print(5 // 3) # → 1(整除) 整除运算,只保留商的整数部分
print(5 % 3) # → 2(取余) 取余运算,得到除法运算后的余数
print(5 ** 3) # → 125(幂运算) 幂运算,计算5的3次方
专家提醒:/总是返回float类型,这意味着无论操作数是整数还是浮点数,结果都会以浮点数形式呈现;而//返回int类型,其结果是整除后的整数部分。
2. 类型转换
# 字符串转数字
num = int("42") # 将字符串"42"转换为整数42,前提是字符串内容为合法数字格式
price = float("3.14") # 将字符串"3.14"转换为浮点数3.14
# 数字转字符串
text = str(42) # 将整数42转换为字符串"42"
# 拼接字符串
result = "答案是:" + str(42) # → "答案是:42" 通过将数字转换为字符串,实现字符串与数字的拼接
result = f"答案是:{42}" # → "答案是:42"(推荐) 使用f-string格式化字符串,更简洁直观
比较运算符三连击
1. 基础比较
print(5 > 3) # → True 判断5是否大于3,结果为真
print(5 < 3 false 53 print5='= 3)' false 53 print5 true 53 print5>= 3) # → True 判断5是否大于或等于3,结果为真
print(5 <= 3) # → False 判断5是否小于或等于3,结果为假
2. 链式比较
# 传统写法
if 1 < x and x < 10:
print("x在1到10之间") 传统方式通过逻辑与运算符`and`,分两步判断x是否在1到10之间
# 链式写法
if 1 < x < 10:
print("x在1到10之间") 链式比较更加简洁直观,直接表达x大于1且小于10的逻辑,在Python中这种写法是合法且高效的
3. 对象比较
a = [1,2,3]
b = [1,2,3]
print(a == b) # → True(值相等) 判断a和b的值是否相等,因为它们包含相同的元素,所以结果为真
print(a is b) # → False(不是同一对象) 判断a和b是否是同一对象,虽然值相同,但它们在内存中是不同的对象,所以结果为假
逻辑运算符三连击
1. 基础逻辑
print(True and False) # → False 逻辑与运算,只有当两个操作数都为真时,结果才为真
print(True or False) # → True 逻辑或运算,只要有一个操作数为真,结果就为真
print(not True) # → False 逻辑非运算,将操作数的布尔值取反
2. 短路求值
def expensive_call():
print("我被调用了!")
return True
# 短路求值
False and expensive_call() # → False(不调用函数) 在逻辑与运算中,如果第一个操作数为假,由于整个表达式结果必然为假,所以不会执行第二个操作数(即不会调用expensive_call函数)
True or expensive_call() # → True(不调用函数) 在逻辑或运算中,如果第一个操作数为真,由于整个表达式结果必然为真,所以不会执行第二个操作数(即不会调用expensive_call函数)
3. 三元运算符
# 传统写法
if x > 0:
result = "正数"
else:
result = "非正数" 传统的if-else语句,根据x的值判断并赋值
# 三元写法
result = "正数" if x > 0 else "非正数" # 三元运算符用更简洁的方式实现了相同的逻辑,先判断条件,条件为真时返回冒号前的值,为假时返回冒号后的值
逻辑运算符像交通灯,控制程序流程。and、or、not等逻辑运算符根据不同的条件组合,决定程序下一步的走向,如同交通灯通过不同颜色控制车辆的通行与停止。
闭坑指南(血泪总结)
类型错误:
print(1 + "1") # TypeError 在Python中,数字和字符串属于不同的数据类型,不能直接进行加法运算,会引发类型错误
print(str(1) + "1") # → "11" 通过将数字1转换为字符串,再进行字符串拼接,可得到正确结果
浮点精度:
print(0.1 + 0.2 == 0.3) # → False 由于计算机对浮点数的存储和运算采用二进制表示,会存在精度问题,所以0.1 + 0.2的结果在计算机中并不精确等于0.3
print(abs((0.1 + 0.2) - 0.3) < 1e-9) # → True 通过计算差值的绝对值并与一个极小值(如1e-9)比较,可以更准确地判断两个浮点数是否近似相等
链式比较陷阱:
print(1 < 2 < 3) # → True 链式比较正确表达了1小于2且2小于3的逻辑,结果为真
print(1 < (2 < 3)) # → False(括号改变语义) 加上括号后,先计算2 < 3,结果为True,再计算1 < True,在Python中True被当作整数1,所以1 < True为假
专家终极总结
- /返回float,//返回int,在进行除法运算时要注意结果的数据类型。
- 链式比较让代码更简洁,能直观表达复杂的比较逻辑,提高代码可读性。
- 短路求值提升性能,在逻辑运算中避免不必要的计算,尤其是在涉及函数调用等开销较大的操作时。
- 三元运算符替代简单if-else,用更紧凑的语法实现条件赋值,使代码更加简洁明了。
小白:懂了!我现在就用运算符重构代码!
专家:(竖大拇指)下次我们讲【条件判断】,关注不迷路!