:条件判断、循环、函数与异常处理详解)
各位学习 Python 的朋友大家好。在上一篇【课程2.2】Python 基础语法上中我们已经梳理了 Python 的变量、数据类型、输入输出以及运算符。如果你还停留在“能写几行代码但程序稍微一复杂就不知道从哪下手”的阶段那这篇基础语法下就是为你准备的。这篇文章会继续带领大家攻克 Python 语法中最核心的几座大山条件判断、循环、函数、内置数据结构进阶用法以及异常处理。学完这篇内容你将有能力独立编写一个完整的、带交互逻辑的小型 Python 脚本而不只是打印几行“Hello World”了。为了让内容更有条理本文的示例依然会遵循“先看概念 → 再看代码 → 最后看运行结果”的方式尽量让零基础的读者也能跟上。有经验的开发者也可以直接跳到章节 4 和章节 5方便快速查阅常用写法与避坑建议。1. 为什么说这些语法是 Python 编程的“分水岭”初学者最容易产生的一个疑问是我明明已经学会了变量和 print为什么还是写不出一个像样的程序原因很简单变量和运算符只是静态的“数据存储与计算”而真正的程序逻辑需要“判断”和“循环”来驱动。举个例子你要开发一个登录验证功能。用户输入用户名和密码之后如果账号正确就显示“欢迎登录”如果账号不存在就提示“用户不存在”如果密码错误就提示“密码错误”。这种“根据不同条件执行不同分支”的逻辑正是通过条件判断语句实现的。如果程序需要反复读取用户输入直到满足条件为止就需要循环语句。另外当代码量逐渐增加时如果所有代码都挤在一起程序会变得难以阅读和维护。函数就是用来解决这个问题的。它可以让你把一段有独立功能的代码封装起来需要时反复调用。Python 内置的数据结构例如列表、字典则是组织和管理数据的重要工具。因此本篇的内容是 Python 学习路径中必须跨过的一道分水岭。掌握之后你才真正开始具备“用代码解决实际问题”的能力。2. 条件判断让程序拥有“思考”能力2.1 if / elif / else 的基本结构Python 的条件判断语句非常直观不需要使用大括号而是依赖缩进来表示代码块。这一点和 C 语言、Java 区别很大也是新手最容易出错的地方。最基本的语法结构如下if 条件表达式: 条件成立时执行的代码 else: 条件不成立时执行的代码如果存在多个判断条件则使用elif它是“else if”的缩写表示“否则如果”。score 85 if score 90: grade 优秀 elif score 80: grade 良好 elif score 60: grade 及格 else: grade 不及格 print(成绩等级, grade)运行结果成绩等级 良好这里需要注意的是Python 会从上到下依次判断每个条件。一旦某个条件成立执行完对应的代码块后不会再继续执行后面的 elif 或 else 分支。所以多个条件的顺序是有讲究的。通常我们会把范围更精确的条件放在前面例如score 90放在最前面。2.2 条件表达式里的布尔判断在 if 的条件中不一定要写比较运算式。Python 允许直接将一个变量作为条件它会自动判断这个变量是“真”还是“假”。username input(请输入用户名) if username: print(你好, username) else: print(用户名不能为空)当username是非空字符串时条件为真当字符串为空时条件为假。同样的规则适用于数字0 为假非 0 为真。列表、字典等容器为空时为假非空时为真。这种写法在项目开发中非常常见可以简化代码。2.3 三元表达式单行条件判断如果条件判断只是为了给某个变量赋一个值可以使用三元表达式让代码更加简洁。age 20 result 成年人 if age 18 else 未成年人 print(result)三元表达式的语法格式是值1 if 条件 else 值2。条件成立时返回值1否则返回值2。这种写法虽然简洁但不宜嵌套过深。如果需要判断多个条件或者分支内部逻辑较多还是建议使用完整的 if / elif / else 结构。2.4 常用逻辑运算符复杂场景下一个判断条件往往由多个子条件组合而成。Python 提供了三个逻辑运算符运算符含义示例and与两边都为真时结果才为真age 18 and age 60or或任一边为真时结果就为真score 60 or score 100not非取反not is_loginnum 10 if num 0 and num % 2 0: print(这是一个正偶数)2.5 常见误区忘记冒号if、elif、else这一行末尾必须有英文冒号。如果漏掉程序会直接报语法错误。缩进不一致同一个代码块内的缩进必须保持一致推荐统一使用 4 个空格。不要混用 Tab 和空格否则即使肉眼看起来对齐解释器也可能报错。误用赋值运算符判断是否相等时应使用而不是。是赋值操作。3. 循环让重复的事情交给机器去做计算机最擅长的就是重复劳动。Python 提供了for循环和while循环分别适用于不同场景。3.1 for 循环遍历可迭代对象for循环通常用来遍历字符串、列表、字典等可迭代对象。fruits [苹果, 香蕉, 橘子] for fruit in fruits: print(我喜欢吃, fruit)运行结果我喜欢吃 苹果 我喜欢吃 香蕉 我喜欢吃 橘子for循环还可以搭配range()函数用于生成一串连续的整数非常适合控制循环次数。for i in range(1, 5): print(第, i, 次循环)运行结果第 1 次循环 第 2 次循环 第 3 次循环 第 4 次循环这里需要注意range(1, 5)生成的是1, 2, 3, 4不包含结尾的 5即“左闭右开”区间。3.2 while 循环按条件执行while循环适合在无法提前预知循环次数只知道循环条件的情况下使用。它会在每次循环开始前判断条件是否为真条件为真则继续执行否则退出。count 0 while count 3: print(当前 count 的值, count) count 1运行结果当前 count 的值 0 当前 count 的值 1 当前 count 的值 2一定要记得在循环体内部修改循环条件中涉及的变量否则可能造成死循环。3.3 break 与 continue控制循环走向break立即终止当前整个循环。continue跳过本次循环剩余的代码直接进入下一次循环。for i in range(1, 10): if i 3: continue # 跳过 i3 这次循环 if i 7: break # 当 i7 时终止整个循环 print(i)运行结果1 2 4 5 63.4 for / while 与 else 配合这是 Python 中比较特殊的一种语法。循环正常结束时会执行else块中的代码如果循环是因为break被终止的则else块不会执行。for i in range(1, 5): if i 10: break else: print(循环正常结束没有被 break)这个特性在查找程序中非常有用可以用于判断“是否成功找到目标”。不过新手刚接触时可能不太习惯实际项目中可以酌情使用也可以改用标志位来达到同样效果。3.5 循环中的常用函数enumerate()可以在遍历时同时拿到元素的索引和值非常常用。languages [Python, Java, Go] for index, language in enumerate(languages): print(index, language)运行结果0 Python 1 Java 2 Gozip()可以并行遍历多个列表。它会把多个可迭代对象中对应位置的元素打包成一个个元组。names [小明, 小红, 小刚] scores [92, 85, 78] for name, score in zip(names, scores): print(name, score)运行结果小明 92 小红 85 小刚 784. 函数把功能封装成可复用的积木4.1 为什么需要函数当一段代码需要被多次使用或者一段逻辑比较复杂、希望单独抽出来维护时就可以把它封装成函数。函数能让代码结构更清晰避免重复编写也方便后期修改。它的基本定义方式如下def 函数名(参数列表): 函数体 return 返回值一个最简单的函数示例def greet(name): message 你好 name return message print(greet(小明))运行结果你好小明4.2 参数传递的几种形式Python 函数的参数种类比较多初学者最容易接触到的有以下几种位置参数调用时按顺序传入。def add(a, b): return a b print(add(3, 5))默认参数参数可以在定义时指定默认值调用时不传则使用默认值。def greet(name, greeting你好): return greeting name print(greet(小明)) print(greet(小红, 早上好))关键字参数调用时通过参数名指定可以调整传入顺序。def introduce(name, age, city): print(f我是{name}今年{age}岁来自{city}) introduce(city北京, name小明, age18)可变参数当传入的参数个数不确定时使用。在参数名前面加一个*接收的是一个元组加两个**接收的是一个字典。def total(*nums): return sum(nums) print(total(1, 2, 3, 4, 5)) def show_info(**info): print(info) show_info(name小明, age18, city上海)4.3 返回值 returnreturn用于结束函数并返回结果。如果函数中没有写return函数默认返回None。def say_hello(): print(Hello) result say_hello() print(result)运行结果Hello None返回值也可以有多个此时会自动打包成一个元组。def get_min_max(nums): return min(nums), max(nums) result get_min_max([1, 5, 3, 9, 2]) print(result)运行结果(1, 9)4.4 变量作用域函数内部定义的变量是局部变量函数外部无法直接访问。在函数内可以读取全局变量但修改全局变量需要使用global关键字声明。count 0 def change_count(): global count count 1 change_count() print(count)在实际项目中建议尽量避免在函数内部用global修改全局变量因为这会降低代码的可读性和可维护性。优先通过参数传递和返回值来交换数据。4.5 匿名函数 lambdaPython 支持使用lambda关键字创建简单的匿名函数。它适合那种逻辑非常简单的场景。square lambda x: x ** 2 print(square(5))运行结果25lambda常用在sorted()、map()、filter()等函数中作为排序或筛选规则。students [(小明, 85), (小红, 92), (小刚, 75)] students.sort(keylambda x: x[1], reverseTrue) print(students)运行结果[(小红, 92), (小明, 85), (小刚, 75)]5. 常用内置数据结构进阶在上一篇中我们已经接触了列表、字典、元组等基本数据类型。这里再补充一些高频使用的基础语法和方法。5.1 列表切片切片可以快速截取列表中的部分元素格式是列表[起始位置:结束位置:步长]。nums [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(nums[2:6]) # [2, 3, 4, 5] print(nums[:5]) # [0, 1, 2, 3, 4] print(nums[5:]) # [5, 6, 7, 8, 9] print(nums[::2]) # [0, 2, 4, 6, 8] print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]切片在数据处理时非常实用。需要注意的是切片得到的是一个新的列表不会修改原列表。而且切片同样遵循“左闭右开”规则。5.2 列表推导式列表推导式是一种非常 Pythonic 的写法用于快速生成新的列表。它可以把原来需要四五行的 for 循环压缩到一行。基本格式[表达式 for 变量 in 可迭代对象 if 条件]示例生成 1 到 10 之间的偶数平方。squares [x ** 2 for x in range(1, 11) if x % 2 0] print(squares)运行结果[4, 16, 36, 64, 100]类似地还可以用字典推导式快速生成字典。word_length {word: len(word) for word in [apple, banana, cherry]} print(word_length)运行结果{apple: 5, banana: 6, cherry: 6}列表推导式虽然简洁但如果嵌套层次过多可读性会明显下降。建议只在逻辑简单的场景下使用如果表达式非常复杂还是用普通的 for 循环更清晰。5.3 字典的常用操作字典是 Python 中使用率极高的数据结构它通过键值对来存储数据。常用的方法包括student {name: 小明, age: 18, city: 北京} # 获取键值 print(student.get(name)) print(student.get(score, 暂未录入)) # 遍历键值对 for key, value in student.items(): print(key, value) # 修改或添加 student[age] 19 student[score] 90 print(student) # 删除 student.pop(city) print(student)get()方法在键不存在时不会报错而是返回指定的默认值这是日常开发中推荐使用的安全查询方式。5.4 集合的基本特点集合set是一种不包含重复元素、且无序的数据结构。主要用来做去重和集合运算。a [1, 2, 2, 3, 3, 3] b list(set(a)) print(b) set1 {1, 2, 3, 4} set2 {3, 4, 5, 6} print(set1 set2) # 交集输出 {3, 4} print(set1 | set2) # 并集输出 {1, 2, 3, 4, 5, 6} print(set1 - set2) # 差集输出 {1, 2}6. 异常处理让程序更健壮6.1 什么是异常程序运行过程中出现的错误统称为异常。例如读取文件时文件不存在、用户输入了无法转换的数字、列表索引越界等。如果不对异常进行处理程序会直接崩溃退出。对于面向用户的项目来说这是非常不友好的体验。6.2 try / except 基本用法Python 使用try / except来捕获并处理异常。try: num int(input(请输入一个整数)) print(你输入的是, num) except ValueError: print(输入无效请输入整数)当用户输入abc时int()转换会抛出ValueError异常此时程序会进入except分支而不会崩溃。6.3 多个 except 与 else / finally一个try块可以跟多个except分支用于捕获不同类型的异常。try: nums [1, 2, 3] index int(input(请输入索引)) print(nums[index]) except ValueError: print(请输入有效的数字) except IndexError: print(索引超出范围)else块在try中所有代码都正常执行后运行finally块无论是否发生异常都会执行通常用来做资源清理例如关闭文件、释放连接等。try: f open(data.txt, r, encodingutf-8) content f.read() except FileNotFoundError: print(文件不存在) else: print(文件读取成功) finally: print(无论是否发生异常都会执行这段代码)6.4 手动抛出异常在某些场景下当检测到非法参数时可以主动抛出异常。使用raise关键字即可。def check_age(age): if age 0: raise ValueError(年龄不能为负数) return age try: check_age(-1) except ValueError as e: print(捕获到异常, e)7. 模块与文件读写7.1 import 引入模块Python 拥有丰富的标准库和第三方库通过import可以引入现成的模块避免重复造轮子。import math import random from datetime import datetime print(math.sqrt(16)) print(random.randint(1, 100)) print(datetime.now())7.2 文件读写基础文件读写是日常开发中的常见需求。推荐使用with语句它可以自动管理文件资源即使发生异常也能正确关闭文件。with open(output.txt, w, encodingutf-8) as f: f.write(第一行内容\n) f.write(第二行内容\n) with open(output.txt, r, encodingutf-8) as f: content f.read() print(content)读取文件时还可以按行读取。with open(output.txt, r, encodingutf-8) as f: for line in f: print(line.strip())strip()方法用于去除字符串首尾的换行符和空白字符这里很常用。8. 综合实战学生成绩管理系统为了把前面讲到的语法串联起来我们一起来完成一个小项目学生成绩管理系统。系统支持添加学生成绩、查看所有成绩、修改成绩、删除成绩并以文件形式持久化保存数据。8.1 需求分析与功能拆分整体功能拆成几个部分用字典存储学生数据键是学生姓名值是成绩。循环显示操作菜单让用户选择功能。根据用户输入执行添加、查看、修改、删除操作。程序退出前将数据写入文件下次启动时自动加载。8.2 代码实现# 文件路径student_system.py import os DATA_FILE students_data.txt def load_data(): 从文件加载学生数据 students {} if os.path.exists(DATA_FILE): with open(DATA_FILE, r, encodingutf-8) as f: for line in f: line line.strip() if line: name, score line.split(,) students[name] int(score) return students def save_data(students): 保存学生数据到文件 with open(DATA_FILE, w, encodingutf-8) as f: for name, score in students.items(): f.write(f{name},{score}\n) def add_student(students): name input(请输入学生姓名) if name in students: print(该学生已存在请使用修改功能) return try: score int(input(请输入成绩)) except ValueError: print(成绩必须为整数) return students[name] score print(f添加成功{name} - {score}分) def show_students(students): if not students: print(暂无学生数据) return for name, score in students.items(): print(f姓名{name}成绩{score}分) def update_student(students): name input(请输入要修改的学生姓名) if name not in students: print(该学生不存在) return try: score int(input(请输入新的成绩)) except ValueError: print(成绩必须为整数) return students[name] score print(f修改成功{name} - {score}分) def delete_student(students): name input(请输入要删除的学生姓名) if name not in students: print(该学生不存在) return students.pop(name) print(f删除成功{name}) def main(): students load_data() while True: print(\n 学生成绩管理系统 ) print(1. 添加学生成绩) print(2. 查看所有成绩) print(3. 修改学生成绩) print(4. 删除学生成绩) print(5. 退出系统) choice input(请输入操作序号) if choice 1: add_student(students) elif choice 2: show_students(students) elif choice 3: update_student(students) elif choice 4: delete_student(students) elif choice 5: save_data(students) print(数据已保存再见) break else: print(无效序号请重新输入) if __name__ __main__: main()8.3 运行与验证在命令行中执行python student_system.py运行后按照菜单提示输入序号即可操作。程序退出后students_data.txt文件中会保存数据下次启动会自动加载。在这个项目中我们用到了if / elif / else实现菜单分支用while True实现持续交互用函数封装每个功能用字典存储数据用 try / except 处理输入异常用文件读写实现数据持久化。可以说它把本篇所有核心语法都串了起来。9. 常见错误与排查思路问题现象常见原因解决思路SyntaxError: invalid syntax漏写冒号、括号不匹配、中英文符号混用检查报错行优先排查冒号与括号IndentationError: unexpected indent缩进不一致可能混用 Tab 和空格统一使用 4 个空格进行缩进NameError: name xx is not defined变量名拼写错误或变量未定义检查变量拼写确认定义位置IndexError: list index out of range访问了列表中不存在的索引确认索引范围或使用迭代方式访问KeyError: xx字典中不存在该键使用get()方法安全取值ValueError: invalid literal for int()将非数字字符串转换为 int转换前先校验输入或捕获异常FileNotFoundError要打开的文件路径不存在确认文件路径使用os.path.exists()判断如果你在运行代码时遇到不认识的报错建议按照以下顺序排查先看报错信息最后一行明确异常类型。找到提示的文件名和行号定位出错位置。查看该行变量是否已定义、缩进是否正确、符号是否是英文格式。把复杂表达式拆开逐步打印中间结果缩小排查范围。10. 基础语法学习建议Python 基础语法是后续学习爬虫、数据分析、自动化办公等方向的地基有几个建议大家可以参考。第一不要只看不练。语法知识只有经过敲代码才能真正记住建议每学一个小节就自己动手写代码验证。遇到报错不要害怕报错是学习过程中最正常的反馈。第二重视代码规范。Python 官方提供了 PEP 8 编码规范例如变量名使用小写字母加下划线、函数之间空两行、缩进统一使用 4 个空格等。初学者从第一天就养成良好习惯后续写项目时会轻松很多。第三学会查看官方文档。Python 官方文档虽然内容很多但当你对某个方法或语法不确定时官方文档是最权威的查阅渠道。平时也可以多使用help(函数名)在交互式环境中查看帮助信息。第四尽量用 Python 风格写代码。Python 提供了列表推导式、切片、enumerate()等灵动语法这些写法的执行效率通常更高可读性也更好。不过不要为了炫技而过度使用清晰明了始终是第一位。在完成本篇课程后建议的下一步学习路线是面向对象编程类与对象 → 文件操作进阶 → 常用标准库如os、json、re→ 通过一个小型项目整合所学内容。等到这些内容都掌握得差不多了就可以根据自己的兴趣选择爬虫、数据分析、Web 后端或自动化脚本等方向继续深入。学编程是一条需要持续积累的路坚持亲手写代码才是进步最快的方式。