第1节:条件语句
在 Python 中,条件语句是控制程序流转的核心。它们根据表达式的真假(Boolean value)来决定执行哪一段代码。
以下是 if / elif / else 多分支判断的详细用法指南:
本节知识点到这里先打个分隔线,喝口水继续。
1. 基础语法结构
最标准的结构是从 if 开始,中间可以有任意多个 elif,最后以可选的 else 结尾。
if 条件A:
# 当条件A为 True 时执行
do_something()
elif 条件B:
# 当条件A为 False 且条件B为 True 时执行
do_another_thing()
else:
# 当以上所有条件都不满足时执行
do_default()
本节知识点到这里先打个分隔线,喝口水继续。
各种用法详解,单一条件判断 (Basic If)
这是最简单的形式,如果不满足条件,则什么都不做。
age = 18
if age >= 18:
print("你已经成年了")
② 二选一 (If-Else)
必须在两个逻辑分支中选其一执行。
score = 55
if score >= 60:
print("及格")
else:
print("不及格")
③ 多分支判断 (If-Elif-Else)
用于处理相互排斥的多个逻辑区间。注意:一旦某个分支满足并执行,后续的分支都会被跳过。
score = 85
if score >= 90:
level = "优秀"
elif score >= 80:
level = "良好"
elif score >= 60:
level = "及格"
else:
level = "不及格"
④ 嵌套条件判断 (Nested If)
在一个条件分支内部再嵌套另一个条件。
status = "管理员"
password_correct = True
if status == "管理员":
if password_correct:
print("准许进入后台")
else:
print("密码错误")
else:
print("普通用户无权限")
本节知识点到这里先打个分隔线,喝口水继续。
3. 高级与特殊用法
⑤ 条件表达式(三元运算符)
如果你只是想根据条件给变量赋值,可以用这一行搞定的简洁写法:
语法:
变量 = 值1 if 条件 else 值2# 传统写法
if x > y:
max_val = x
else:
max_val = y
# 三元运算符写法
max_val = x if x > y else y
⑥ 逻辑运算符结合 (and, or, not)
可以在一个 if 语句中组合多个判断条件。
* and: 两者皆为真。
* or: 只要有一个为真。
* not: 取反。
if (age > 18 and has_ticket) or is_vip:
print("允许入场")
隐式真值测试 (Truth Value Testing)
Python 中不需要显式写 if x == True,很多对象自带“真假”属性。
* 视为 False 的值:None, 0, 0.0, "" (空字符串), [] (空列表), {} (空字典), set()。
* 视为 True 的值:除了上述之外的所有内容。
items = []
if not items:
print("列表是空的")
本节知识点到这里先打个分隔线,喝口水继续。
4. 易错点提醒
* 缩进:Python 强依赖缩进(通常是 4 个空格)。缩进不对会导致 IndentationError。
* 冒号:每个 if, elif, else 后面必须带冒号 :。
* 执行顺序:多分支语句中,条件的顺序非常重要。如果把 score >= 60 放在 score >= 90 之前,那么 95 分的人也会进入“及格”分支。
* 多重 if vs elif:
* 使用多个 if:每个条件都会被独立判断。
* 使用 if-elif:只要一个满足,其他的就不看了。
本节知识点到这里先打个分隔线,喝口水继续。
5. 补充:Python 3.10+ 的新选择
如果你的分支非常多(例如根据不同的字符串执行不同操作),可以考虑使用 Match-Case (结构化模式匹配),它在某些场景下比 if-elif 更清晰:
status_code = 404
match status_code:
case 200:
print("成功")
case 404:
print("未找到")
case 500:
print("服务器错误")
case _:
print("未知状态码")
第2节:布尔逻辑
欢迎来到布尔逻辑(Boolean Logic)的奇妙世界!在代码的世界里,生活是非黑即白的。没有“大概”、“还行”或者“看心情”,只有纯粹的 True(真) 和 False(假)。
我们可以把布尔运算想象成一个极其毒舌且死板的裁判。下面是这位裁判在不同组合条件下的“判罚标准”:
1. AND(与):极致的挑剔狂
逻辑: 必须所有条件都为 True,结果才为 True。只要有一个是 False,全盘皆输。 口诀: “缺一不可,一票否决”。
| 场景 | 条件 A | 条件 B | 结果 | 毒舌点评 |
|---|---|---|---|---|
| 相亲门槛 | 有钱 | 长得帅 | True | 恭喜,你是偶像剧男主! |
| 相亲门槛 | 有钱 | 长得丑 | False | 只有钱?那叫“金主爸爸”,不叫“真爱”。 |
| 洗澡警告 | 浴缸有水 | 没停瓦斯 | True | 温暖的泡澡时光。 |
| 洗澡警告 | 浴缸有水 | 停瓦斯了 | False | 这叫“冬泳”,容易感冒,兄弟。 |
2. OR(或):随和的备胎王
逻辑: 只要有一个条件为 True,结果就为 True。只有全部都是 False,才彻底凉凉。
口诀: “给个理由,我就放行”。
| 场景 | 条件 A | 条件 B | 结果 | 逗比解读 |
|---|---|---|---|---|
| 出门借口 | 陪女朋友 | 老板加班 | True | 只要有一个理由,兄弟们的酒局你就可以心安理得地鸽了。 |
| 垃圾食品 | 它是炸的 | 它甜度爆表 | True | 只要占一样,我那该死的大脑就会分泌多巴胺。 |
| 起飞条件 | 准时出发 | 延误但有盒饭 | True | 既然有肉排饭,晚点两小时我也能原谅机长。 |
| 离职念头 | 钱给少了 | 心委屈了 | True | 哪怕占一个,我的简历就已经在招聘网站挂好了。 |
3. NOT(非):杠精的日常
逻辑: 也就是“反转”。True 变 False,False 变 True。
口诀: “你说的都对,但我偏不”。
场景 A: NOT (我很穷)
结果:我很富有。 (虽然现实中很难,但在代码里只需一个 ! 就能翻身)
场景 B: NOT (前任的电话)
结果:接听可能性 = True。(当你设置了“拒绝接听前任”,系统检测到是前任,结果就是“不接”)
4. 复杂组合:成年人的世界充满套路
在现实中,布尔逻辑通常是连环炮。我们来看看这些“套路组合”:
情况一:(有钱 AND 有颜) OR (真心)
实际场景: 择偶标准。
如果你既有钱又有颜,你是满分;
如果你是个穷光蛋但有一颗金子般的真心,你也能通关;
但是,如果你长得丑、没钱、还没心没肺——那就是 (False AND False) OR (False),系统直接弹出:“再见,慢走不送”。
情况二:(下雨 OR 降温) AND (NOT 没带伞)
实际场景: 是否会淋湿。
今天下雨了(True),但我带了伞(NOT 没带伞 = True)。
结果:虽然天气很烂,但我依然是个干爽的打工人。
情况三:(没写完作业 AND 老师没来) OR (写完了作业)
实际场景: 学生的心理状态(是否慌张)。
如果你作业写完了,你稳如老狗。
如果你没写完,但只要老师没来(双重 Buff),你也能暂时假装稳如老狗。
总结:布尔逻辑生存法则
AND 是极致的贪心:即要又要。
OR 是宽容的备选:东方不亮西方亮。
NOT 是无情的反转:把你的梦想(True)变成现实(False)……噢不,程序员一般用它来纠错。
下次当你女朋友问你:“你是不是觉得我胖了,还不爱我了?” 你可以冷冷地回答:NOT (胖了 OR 不爱了)。
免责声明:对该回答导致的任何跪搓衣板行为概不负责。
第3节:循环语句
Python 循环的“财富密码”
1. for 循环:勤劳的搬砖工
for 循环就像一个极其听话的员工,你给他一个清单(列表、字符串、区间),他就会按顺序把活儿干完。
情况 A:遍历列表/字符串
想象你在相亲,手里有一张候选人名单。
candidates = ["路人甲", "隔壁老王", "吴彦祖(分祖)"]
for person in candidates:
print(f"正在与 {person} 眼神交流...")
# 输出:
# 正在与 路人甲 眼神交流...
# 正在与 隔壁老王 眼神交流...
# 正在与 吴彦祖(分祖) 眼神交流...
情况 B:搭配 range() 使用
如果你想对生活大喊 5 次“我不干了!”,range() 是最好的计数器。
for i in range(5):
print(f"第 {i+1} 次尝试辞职,由于余额不足,操作撤回。")
2. while 循环:倔强的死心眼
while 循环只要条件成立,它能干到天荒地老。
情况 A:常规用法
只要还没追到女神,就一直发消息(容易被拉黑,请勿模仿)。
is_single = True
attempts = 0
while is_single:
attempts += 1
print(f"这是第 {attempts} 次告白:'你是我的优乐美吗?'")
if attempts >= 3:
print("女神:滚。")
is_single = False # 终于清醒了
情况 B:死循环 (慎用)
就像你的甲方,永远觉得方案还可以再改改。
# while True:
# print("改个颜色,还是觉得第一版好,再改回来。")
3. continue:战略性尿遁
continue 的作用是:“这一轮我不玩了,直接跳到下一轮。”
场景: 你在吃一盘凉拌折耳根,你只想挑出里面的花生米。
food_plate = ["花生米", "折耳根", "花生米", "折耳根", "生姜(伪装的花生)"]
for food in food_plate:
if food == "折耳根" or food == "生姜(伪装的花生)":
print(f"发现{food}!退!退!退!")
continue # 直接跳过,看下一个
print(f"吃到一颗香喷喷的 {food}")
4. break:掀桌子不干了
break 的作用是:“这日子没法过了,整个循环给我停掉!”
场景: 作为一个吃货,你吃自助餐,吃到扶墙出为止。
stomach_capacity = 100 # 胃容量
fullness = 0
while True:
fullness += 30
print(f"狂吃中,当前饱腹度:{fullness}%")
if fullness >= 100:
print("肚皮要炸了!撤退!")
break # 强行终止循环,账单都不看就跑
5. pass:优雅的“占着茅坑不拉屎”
pass 是空语句。它什么都不做,只是为了让代码不报错。
场景: 你写代码逻辑时,还没想好怎么处理“前任发来的消息”,先占个位置。
ex_message = "在吗?"
if ex_message == "在吗?":
pass # 还没想好怎么优雅地装死,先放个 pass 占位
else:
print("回复:不在,去火星了。")
6. 进阶玩法:for...else(冷门但有用)
这是一个常被误解的语法。else 块只有在循环正常结束(没有被 break 掉)时才会执行。
场景: 寻找真爱。
girls = ["拜金女", "海王姐", "普信女"]
for girl in girls:
if girl == "灵魂伴侣":
print("终于等到你,还好我没放弃!")
break
print(f"接触过 {girl},感觉八字不合。")
else:
# 如果把上面的名单翻遍了都没 break,就会执行这里
print("循环结束:我还是孤独终老吧。")
总结表格
| 关键字 | 通俗解释 | 搞笑比喻 |
|---|---|---|
| for | 按顺序一个一个来 | 军训报数 |
| while | 只要...就一直干 | 没钱就一直搬砖 |
| continue | 跳过本次,继续下个 | 遇到前任,绕道走,后面的街还要逛 |
| break | 彻底结束循环 | 遇到抢劫,直接收摊回家 |
| pass | 啥也不干,占个位 | 电影院里占座的空包 |
希望这套“循环全家桶”能让你不仅看懂,有什么想深入了解的吗?
第4节:列表与字典
列表(List)和字典(Dict)
今天就来聊聊 Python 里的两大“护法”:。
如果把 Python 比作一个江湖,列表就是你的“多宝阁”,东西按顺序摆放;而字典就是你的“藏经阁”,想找秘籍得靠“口令”(键)。
一、 列表 (List):有序的“排排坐”
列表就像是一串羊肉串,每个签位都有编号(索引),你可以随时换肉、加菜。
1. 查找:索引与切片
正向索引:从 0 开始。list[0] 是第一个。
反向索引:-1 是最后一个,专门给懒得数数的人准备的。
切片:[start:stop:step]。记住:包头不包尾。
# 你的前任名单 exes = ["翠花", "如花", "酸菜", "大锤"] print(exes[0]) # "翠花"(初恋总是难忘的) print(exes[-1]) # "大锤"(最近刚分的那个硬汉) print(exes[1:3]) # ["如花", "酸菜"](那段不堪回首的中期岁月) print(exes[::-1]) # 倒序排列,看看你的人生是怎么一步步走偏的
2. 增加:添砖加瓦
append():在末尾加一个。
insert():插队。虽然不文明,但在代码里合法。
extend():把另一个列表合并进来。
exes.append("建国") # 队伍壮大中
exes.insert(1, "小蝶") # 强行插入,如花被挤到了后面
exes.extend(["二狗", "旺财"]) # 引入了一批奇奇怪怪的生物
3. 修改:移花接木
直接赋值即可。
exes[2] = "翠兰" # 把"如花"换成"翠兰",心情瞬间好多了
4. 删除:毁尸灭迹
pop():弹出最后一个(或指定位置),还会告诉你删了谁。
remove():指定名字删人(只删第一个匹配的)。
clear():全军覆没。
gone = exes.pop() # 拜拜了旺财
exes.remove("大锤") # 指定踢走大锤
二、 字典 (Dictionary):精准的“对暗号”
字典不讲顺序,讲的是Key (键) 和 Value (值) 的映射。就像查字典,你得知道拼音(Key)才能找到解释(Value)。
1. 查找:按图索骥
dict[key]:直接查。如果 Key 不存在,程序会崩溃(很暴力)。
get(key, default):温柔查。没有就返回默认值,不会报错。
# 你的私房钱藏匿点
stashed_money = {"臭袜子": 50, "书架": 200, "花瓶": 1000}
print(stashed_money["书架"]) # 200
# print(stashed_money["老婆兜里"]) # 报错!KeyError,这地方绝对没钱
print(stashed_money.get("鞋盒", 0)) # 返回 0,虽然没钱但程序不崩
2. 增加与修改:简单粗暴
如果 Key 存在就是改,不存在就是增。
stashed_money["马桶水箱"] = 5000 # 新增(非常大胆)
stashed_money["臭袜子"] = 0 # 修改(可能被洗了)
3. 删除:断舍离
pop(key):删除指定的键值对。
popitem():删掉最后一个进去的(Python 3.7+ 保证有序)。
del:万能删除关键字。
del stashed_money["臭袜子"] # 彻底放弃这个阵地
4. 遍历:全盘托出
.keys():只要暗号。
.values():只要宝贝。
.items():暗号和宝贝全都要。
for spot, money in stashed_money.items():
print(f"在{spot}藏了{money}块钱")
三、 总结:该选哪一个?
为了方便记忆,请看下表:
| 操作 | 列表 (List) | 字典 (Dict) |
|---|---|---|
| 存储逻辑 | 靠位置排队(有序) | 靠名字索引(映射) |
| 查找速度 | 慢(得挨个找,像找人) | 极快(直接定位,像导航) |
| 增/改 | append, insert / list[i]=x | dict[key] = value |
| 适用场景 | 存一组名字、分数、清单 | 存用户信息、配置参数、对应关系 |
一句话总结:
如果你需要排队(谁先谁后很重要),选列表;
如果你需要查户口(通过名字找信息),选字典。
你是想往你的“多宝阁”里塞个新前任,还是想给你的“私房钱字典”换个更隐蔽的 Key?
第5节:函数定义
函数定义
函数其实就像是一张外卖订单或者一个自动炒菜机:你丢进去一些食材(参数),它噼里啪啦一顿操作,最后给你吐出一盘热腾腾的饭菜(返回值)。
为了让你不睡着,我们用“深夜食堂”的例子来串联这些知识点。
1. def 声明:招牌挂起来
定义函数就像开店,def 就是 "Define"(定义)的缩写。
def make_joke():
# 这里是函数体,记得缩进!
print("为什么程序员分不清万圣节和圣诞节?")
print("因为 Oct 31 == Dec 25。") # 这是一个只有大佬懂的冷笑话
用法: 没啥好说的,名字别起得太离谱(比如 def a():),不然一个月后的你自己会想穿越回来掐死现在的你。
2. 参数传递:把食材丢进去
函数如果不能传参数,就像只能点“随便”的饭馆,早晚倒闭。
A. 必需参数(位置参数)
你不给,它就罢工。
def feed_pet(pet_name, food):
print(f"正在给 {pet_name} 喂 {food}... 它看起来快撑死了。")
feed_pet("旺财", "战斧牛排") # 顺序不能乱,否则就是给牛排喂旺财了
B. 关键字参数:指名道姓
为了防止把“旺财”喂给“牛排”,你可以带上名字。
feed_pet(food="红烧肉", pet_name="富贵") # 顺序乱了也没关系,Python 聪明着呢
3. 默认参数:老板的“潜规则”
有些参数如果客人没要求,我们就按默认的来。
def buy_coffee(size="中杯", sugar="正常糖"):
print(f"您点的 {size} 咖啡,放了 {sugar},请慢用(小心烫嘴)。")
buy_coffee() # 默认中杯、正常糖
buy_coffee("大杯") # 大杯、正常糖
buy_coffee("特大杯", "不加糖") # 健身人士的自我救赎
注意: 默认参数必须放在非默认参数的后面。你不能先给个默认的,再来个必需的,Python 解释器会当场 CPU 烧干。
4. 不定长参数:老板,来个全家桶!
有时候你也不知道客人会点多少东西。
A. *args:打包成元组(Tuple)
如果你有很多个食材,但懒得一个一个起名字:
def make_hotpot(*ingredients):
print("火锅锅底正在翻滚,你丢进了:")
for item in ingredients:
print(f"- {item}")
make_hotpot("毛肚", "黄喉", "鸭血", "香菜(异端!)")
B. kwargs:打包成字典(Dictionary)
如果你想知道每个食材的具体信息(比如单价):
def hire_worker(**details):
for key, value in details.items():
print(f"求职者信息 - {key}: {value}")
hire_worker(name="小王", skill="写代码", salary="200k", hobby="加班")
5. 返回值:老板,货呢?
函数如果没有 return,它执行完就消失在空气中了。return 就是把结果“快递”回给调用者。
def check_wallet(money):
if money > 1000:
return "土豪,我们做朋友吧!"
elif money > 100:
return "够吃顿火锅,还行。"
else:
return "别看了,去搬砖吧。"
status = check_wallet(50)
print(status) # 输出:别看了,去搬砖吧。
进阶:返回多个值
Python 其实很慷慨,它可以一次性给你好几个东西。
def get_status():
mood = "想摸鱼"
battery = "2%"
return mood, battery # 实际上返回的是一个元组 (tuple)
current_mood, current_power = get_status()
print(f"当前状态:{current_mood},剩余电量:{current_power}")
总结:究极混合用法
如果你把这些全揉在一起,长这样:
def ultimate_function(required, default="默认值", *args, **kwargs):
print(f"必需参数: {required}")
print(f"默认参数: {default}")
print(f"多余的位置参数: {args}")
print(f"多余的关键字参数: {kwargs}")
# 调用它:
ultimate_function("必须给", "改掉默认", "赠品1", "赠品2", boss="马云", money=999)
⚠️ 避坑指南:
参数顺序:位置参数 > *args > 默认参数 > kwargs。(虽然这个规则有点复杂,但记住“必需的在前,杂碎的在后”就对了)。
默认参数的坑:千万别用可变对象(比如列表 [])当默认参数,否则你会发现你的列表在多次调用之间会“偷偷长大”,非常恐怖。
掌握了这些,你就是 Python 界的“米其林主厨”了!还有哪个部分想深入探讨的吗?
💎 综合练习
这是一个员工考勤自动化查询系统,适合综合复习条件判断、循环、列表、字典和函数。
练习目标:
输入员工姓名和打卡时间,让 Python 自动判断考勤状态。这一节就像把前面的知识点装进一个小饭盒,打开就能开练。
输入员工姓名和打卡时间,让 Python 自动判断考勤状态。这一节就像把前面的知识点装进一个小饭盒,打开就能开练。
完整脚本代码:
def check_attendance(name, time):
if time <= "09:00":
return f"{name}:{time} 打卡,正常上班,今天是打工小太阳!"
elif time <= "09:30":
return f"{name}:{time} 打卡,迟到了,老板的眉毛抬了一下。"
else:
return f"{name}:{time} 打卡,严重迟到,工位差点报警。"
employees = []
print("--- 欢迎使用考勤录入系统(输入 'quit' 结束录入) ---")
while True:
name = input("\n请输入员工姓名: ")
if name.lower() == 'quit':
break
time = input(f"请输入 {name} 的打卡时间 (格式如 08:30): ")
employee_data = {"name": name, "time": time}
employees.append(employee_data)
print("\n--- 正在生成考勤报告... ---")
for employee in employees:
result = check_attendance(employee["name"], employee["time"])
print(result)