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 比较运算符和逻辑运算符 —— 判断与组合
是什么?为什么学?
比较运算符(== != > < >= <=)比较两个值,结果只有 True 或 False;逻辑运算符(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("_", "")。 - 错误写法:
split和join的方向搞反 → 问题:"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 |
| 结果莫名是 False | and / or 优先级没搞清 | 拿不准就加括号:(a > 5) and (b < 10) |