| Day 3 | 运算符与表达式:加减乘除、整除、取余与优先级 |

1 算术运算符 —— 让程序会算数

是什么?为什么学?

算术运算符就是数学里的加减乘除在 Python 里的写法,外加三个「加强版」:整除 //、取余 %、幂 **。为什么零基础必学?因为程序的核心工作之一就是计算——算价格、算分数、算时间,全是算术运算符。而且 //% 的组合(商和余数)是很多经典算法的地基。

底层原理

几个容易懵的细节,原理是这样的:

  • / 除法永远返回小数(float),即使能整除:4 / 2 得到 2.0
  • // 整除是「向下取整」:7 // 2 是 3,而 -7 // 2-4(不是 -3)——因为它找的是「小于等于结果的最大整数」。
  • % 取余满足公式:被除数 = 商 × 除数 + 余数,即 7 = 3 × 2 + 1
  • 运算有优先级:先算乘方、再算乘除、最后算加减,和数学课学的一样;同级从左到右。

术语小词典:优先级(precedence)就是「多个运算符打架时谁先算」。括号 () 永远是最高优先级——拿不准就加括号。

生活类比

算术运算符像超市收银机+ 是合并价签,- 是折扣,* 是「3 瓶同价饮料」的总价,/ 是 AA 制平分。// 是「3 个人分 7 个苹果,每人先拿几个(3 个),剩下几个(1 个)就是 %」——商归商,余归余。

注意事项总结

1 四则运算

print(7 + 3)    # 加法:10
print(7 - 3)    # 减法:4
print(7 * 3)    # 乘法:21
print(7 / 2)    # 除法:3.5(结果是小数)
print(4 / 2)    # 注意:4 ÷ 2 = 2.0,除法结果总是小数

运行结果:

10
4
21
3.5
2.0

2 整除、取余、幂

print(7 // 2)     # 3:7 里面最多有几个完整的 2
print(7 % 2)      # 1:分完 2 之后剩多少
print(2 ** 10)    # 1024:2 的 10 次方
print(-7 // 2)    # -4:注意是向下取整,不是 -3

运行结果:

3
1
1024
-4

3 优先级与括号

print(2 + 3 * 4)      # 14:先乘后加
print((2 + 3) * 4)    # 20:括号优先
print(2 ** 3 * 2)     # 16:先算 2**3=8,再乘 2

括号是「插队卡」,想让谁先算就框住谁。

4 取余的经典用途——判断奇偶

num = 17
print(num % 2)          # 1:余 1 说明是奇数
print(num % 2 == 0)     # False:17 不是偶数
print(num % 2 == 1)     # True:17 是奇数

任何整数除以 2,余数只有 0 或 1——余 0 是偶数,余 1 是奇数,Day 4 学 if 时会直接用到。

易错点

  • 错误写法:print(7 / 2) 却以为结果是 3 → 问题:/ 永远返回小数,结果是 3.5 → 正确写法:想要整数结果用 7 // 2
  • 错误写法:print(2 ** 3) 却以为结果是 6 → 问题:** 是幂不是乘,2³ = 8 → 正确写法:2 ** 3 是 8,乘法用 *
  • 错误写法:print(3 + 4 * 2) 以为结果 14 是错的 → 问题:优先级是先乘后加,3 + 8 = 11 → 正确写法:想先加就写 (3 + 4) * 2
  • 错误写法:print(10 / 0) → 问题:除数不能为 0,报 ZeroDivisionError → 正确写法:除之前先判断除数不为 0(Day 4 学 if 后可以处理)。

记忆口诀:除号总是出小数,整除向下取整数;余数配合商使用,拿不准时加括号。

2 比较运算符和逻辑运算符 —— 判断与组合

是什么?为什么学?

比较运算符== != > < >= <=)比较两个值,结果只有 TrueFalse逻辑运算符and or not)把多个判断组合成一个结论。为什么必学?因为它们是「让程序做决定」的原料——Day 4 的 if 全靠它们。现在把原料备好,明天直接开火。

底层原理

比较运算符本质是「问一个问题」,Python 算完给你一个布尔答案:5 > 3 就是问「5 大于 3 吗?」,答案是 True。逻辑运算符是「组合开关」:and 像串联电路(一个断就全断),or 像并联电路(一个通就全通),not 像反相器(把真变假、假变真)。还有一个大坑:**= 是赋值(把值放进变量),== 是判断(比较两边是否相等)**——一个「动手」,一个「提问」,是新手最容易混的地方。

生活类比

比较运算符像体检报告上的判断:「身高 ≥ 170 吗?」——是,打勾(True),否,打叉(False)。逻辑运算符像选课规则and 是「必须数学及格并且英语及格才能毕业」,缺一不可;or 是「有 VIP 或者满 100 元免运费」,满足一个就行;not 是「下雨就出门」。

注意事项总结

1 比较运算符

age = 18
print(age >= 18)    # True:大于等于成立
print(age == 20)    # False:18 不等于 20
print(age != 20)    # True:不等于成立
print(age < 60)     # True

每个比较都是一次「提问」,Python 回答 True(成立)或 False(不成立)。

2 === 的区别

score = 80          # 赋值:把 80 存进 score(一个等号)
print(score == 80)  # 判断:score 是不是等于 80(两个等号)
print(score == 90)  # 判断:score 是不是等于 90

运行结果:

True
False

写法差一个等号,含义天差地别——写错是新手第一大 bug 来源。

3 逻辑运算符组合条件

score = 85
print(score >= 60 and score <= 100)   # True:既及格又在有效范围
print(score < 60 or score > 90)       # False:没挂科也不是优秀
print(not score >= 60)                # False:不是「没及格」的情况

and 两边都成立才 True;or 一边成立就 True;not 把结果反过来。

4 拿不准优先级就加括号

a, b = 8, 12
print(a > 5 and b < 10)          # False:b < 10 不成立
print((a > 5) and (b > 10))      # True:两边都成立
print(not (a > 5 and b > 10))    # False:整体取反

and 的优先级高于 or,混用多个逻辑运算符时极易出错——拿不准就加括号

易错点

  • 错误写法:if score = 80(一个等号) → 问题:这是赋值不是判断,语法上就错(后面学 if 时会报 SyntaxError: cannot assign to literal 之类) → 正确写法:if score == 80
  • 错误写法:print(5 < 3 < 1) 以为没问题 → 问题:Python 允许连比但含义是「3 介于 5 和 1 之间」,结果为 False,容易读错 → 正确写法:拆开写 5 < 3 and 3 < 1,或加括号。
  • 错误写法:True and False or True 直接算 → 问题:and 先于 or,结果容易想错 → 正确写法:加括号明确意图:True and (False or True)
  • 错误写法:"18" == 18 以为相等 → 问题:字符串和整数永远不相等(类型不同) → 正确写法:先转换再比较:int("18") == 18

记忆口诀:单等赋值双等问,比较出来是布尔;and 全真 or 一真,not 反转别记混。

3 字符串方法 —— 处理文本的瑞士军刀

是什么?为什么学?

方法(method)就是「挂在数据身上的函数」,字符串自带一堆现成技能:strip() 去空格、upper() 变大写、replace() 替换、split() 拆分、join() 拼接……为什么必学?因为真实程序里一半以上数据是文本——用户输入、文件内容、日志信息,不会处理字符串,寸步难行。

底层原理

调用格式是 字符串.方法名()——点和括号表示「让这个字符串用它的方法干活」。为什么方法能「记住」自己是哪个字符串?因为字符串在内存里是一个对象,方法天然知道「我是谁」,所以 text.upper() 会把 text 自己的内容变大写。注意:字符串是不可变(immutable)的——text.upper() 不会改掉 text 本身,而是返回一个「新的、变大写后的字符串」。想保存结果,必须用变量接住。

术语小词典:不可变(immutable)就是「改不了」:字符串一旦创建,内容就固定了,所有操作都是「造一个新的」,原来的原封不动。

生活类比

字符串方法像手机相册的一键美化strip() 是裁剪边缘(去掉空格),upper()/lower() 是滤镜(改大小写),replace() 是换脸(把 A 换成 B),split() 是把一张全家福按人裁剪成多张单人照,join() 是把多张照片合成一张拼图。每点一次「美化」都不会毁掉原图(字符串不可变),而是生成一张新图(新字符串)。

注意事项总结

1 常用方法

text = "  Hello, Python  "
print(text.strip())              # 去掉两端空格
print(text.upper())              # 全部大写
print(text.lower())              # 全部小写
print(text.replace("Python", "世界"))  # 替换
print(len(text))                 # 字符串长度(含两端空格)

运行结果:

Hello, Python
  HELLO, PYTHON  
  hello, python  
  Hello, 世界  
17

strip() 只去掉两端空格,中间的保留;len() 数的是字符个数。

2 split 拆分,join 拼接

sentence = "苹果,香蕉,西瓜"
fruits = sentence.split(",")      # 按逗号拆成列表
print(fruits)                     # ['苹果', '香蕉', '西瓜']

names = ["小明", "小红", "小刚"]
print("、".join(names))           # 用顿号把列表拼成字符串

运行结果:

['苹果', '香蕉', '西瓜']
小明、小红、小刚

split(",") 以逗号为「切点」把字符串切开,返回一个列表(list,方括号包着的多个元素,Day 5 详细学);"、".join(names) 反过来把列表元素连接成一句话。split 是「切」,join 是「粘」,方向相反,是一对镜像操作。

3 判断字符串内容(返回布尔)

phone = "13800138000"
print(phone.isdigit())    # True:全是数字
print("abc".isalpha())    # True:全是字母
print("a1".isalnum())     # True:字母或数字
print(" ".isspace())      # True:全是空白

「is 开头」的方法基本都是「提问」,返回 True/False,这个规律能帮你猜出很多方法的意思。

易错点

  • 错误写法:text.strip() 之后直接打印 text → 问题:字符串不可变,原变量没变,输出还是带空格的 → 正确写法:text = text.strip() 用变量接住返回值。
  • 错误写法:print(text.upper)(忘写括号) → 问题:没有括号只是「提到方法名」,不执行,输出一串看不懂的内存地址 → 正确写法:text.upper() 必须带括号才是调用。
  • 错误写法:"ABC".strip() 以为能去掉数字或字母 → 问题:strip() 只去空白(空格/换行/制表符) → 正确写法:去特定字符用 replace(),如 "A_B".replace("_", "")
  • 错误写法:splitjoin 的方向搞反 → 问题:"a,b".join(...)"...".split(",") 用错位置 → 正确写法:split 是字符串调用(切自己),join 是分隔符调用(粘别人)",".join(列表)

记忆口诀:字符串不可变,操作全靠返回值接住;split 切、join 粘,is 开头是提问。

4 f-string —— 优雅的格式化输出

是什么?为什么学?

f-string(格式化字符串)是在字符串前加一个 f,然后用 {变量} 把变量或表达式直接嵌进字符串里:f"我叫{name},今年{age}岁"。为什么必学?因为它是 Python 目前最推荐、最直观的格式化方式——不用再写 "我叫" + name + "今年" + str(age) 这种又长又容易漏引号的拼接。

底层原理

f 是 format(格式化)的意思。Python 看到以 f 开头的字符串,会扫描里面所有 {...} 花括号:把括号里的内容当成代码去求值(变量就取它的值,表达式就算出结果),再把求值结果转成字符串填回原位置。所以 {age + 1} 会先算 18 + 1 再显示 19。{price:.2f} 里的 :.2f 是格式说明——2f 表示「保留 2 位小数的浮点数」。

生活类比

f-string 像填空题模板:试卷上印着「我叫____,今年____岁」,你往空里填答案(变量值),填完就是完整句子。:2f 这种格式说明就像「答案请保留两位小数」的答题要求——模板规则写清楚,填出来的结果就整齐规范。

注意事项总结

1 把变量嵌进字符串

name = "小明"
age = 18
print(f"我叫{name},今年{age}岁")    # 花括号里放变量

运行结果:

我叫小明,今年18岁

f 和引号之间不能有空格f "..." 会报错)。

2 花括号里可以放表达式

age = 18
print(f"明年我就{age + 1}岁了")      # 先算 18+1 再填入
price = 3.14159
print(f"价格是{price:.2f}元")        # 保留 2 位小数

运行结果:

明年我就19岁了
价格是3.14元

{price:.2f} 把 3.14159 按「保留 2 位小数」格式化——注意是四舍五入到 3.14。

3 花括号里也能放字符串和表达式

print(f"他喜欢{'Python'}和{'篮球'}")    # 字符串字面量也能填
print(f"3 乘以 4 等于 {3 * 4}")          # 表达式直接算

运行结果:

他喜欢Python和篮球
3 乘以 4 等于 12

花括号里可以是任何「能算出值的代码」。

易错点

  • 错误写法:print(f"我叫{name}") 但字符串前忘记写 f → 问题:{name} 会被原样打印出来,不会替换 → 正确写法:字符串最前面加 f
  • 错误写法:print(f"{price:.2f}") 但 price 是字符串 → 问题:str 不支持 :2f 格式,报 ValueError → 正确写法:确保是数字类型,或先用 float(price) 转换。
  • 错误写法:花括号里直接放中文:f"{名字}" → 问题:名字 是变量名,没定义就报 NameError → 正确写法:变量名用英文,如 f"{name}"
  • 错误写法:print(f"答案是{10/3}") 想只留 2 位小数 → 问题:默认会输出超长小数 3.3333333333333335 → 正确写法:f"{10/3:.2f}" 输出 3.33

记忆口诀:字符串前加个 f,花括号里放变量;冒号点二 f 是两位小数,四舍五入刚刚好。

5 动手实践:字符串处理小工具

写一个程序:输入一句话,去掉首尾空格、统计字数、把指定词替换掉。

# string_tool.py —— 字符串处理小工具
text = input("请输入一句话:").strip()      # 顺便去掉首尾空格

words = text.split()                        # 按空格拆成单词列表
print(f"你输入了 {len(words)} 个词,共 {len(text)} 个字符")

word = input("想替换哪个词?").strip()
new_word = input("替换成什么?").strip()
print("替换结果:", text.replace(word, new_word))

运行示例(交互:依次输入后回车):

请输入一句话:  我喜欢 Python 编程
你输入了 3 个词,共 13 个字符
想替换哪个词?Python
替换成什么?C++
替换结果: 我喜欢 C++ 编程

想一想input() 后面直接链式调用 .strip()——因为 input() 返回的是字符串,字符串就能调用字符串方法,一步到位去掉首尾空格,这就是 Day 3 知识点的综合运用。

今日总结

算术运算符:+ - * / // % **;除法总出小数、整除向下取整、% 判断奇偶 运算符优先级:先乘方、再乘除、后加减,拿不准就加括号 比较运算符结果是 True / False;== 是判断、= 是赋值 and(都满足)/ or(满足一个)/ not(取反)组合条件 字符串方法:strip / upper / lower / replace / len / split / join / isdigit 随手会用 字符串不可变,方法返回值要用变量接住 f-string 格式化:f"{变量}"f"{表达式}"f"{数值:.2f}"(四舍五入) 完成「字符串处理小工具」并运行成功

报错原因修复
SyntaxError: invalid syntax=== 混用,或括号不配对判断用 ==,赋值用 =
AttributeError: 'str' object has no attribute 'Strip'方法名大小写写错(Python 区分大小写)方法都是小写:strip()
TypeError: unsupported operand type(s)字符串和数字混用运算符先转换类型或用 f-string
ZeroDivisionError除数为 0除之前先判断除数不为 0
结果莫名是 Falseand / or 优先级没搞清拿不准就加括号:(a > 5) and (b < 10)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇