ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

330道Python练习题,每天一练,夯实编程基础

330道Python练习题,每天一练,夯实编程基础 先问一个问题你是不是也收藏过很多 Python 教程、买过很多本入门书但一到自己写代码的时候脑子里还是一片空白如果是这样那你缺的其实不是资料而是一套能让你真正“动手”的练习过程。网上关于 Python 的练习题很多但大多零散不成体系刷起来没有章法很容易三天打鱼两天晒网。这篇文章围绕一个非常经典的训练思路展开用 330 道分类练习题按照“每天一练”的节奏把 Python 的核心语法、常用库、编程思维一步步练扎实。文中会给出完整的练习规划、题型拆解、示例代码和排错思路不管你是刚入门的新手还是学完基础但写代码发怵的同学都能直接照着做。坚持练完这 330 道题你的代码量、调试能力和解决问题的手感都会有一个肉眼可见的提升。1. 背景与核心概念1.1 为什么刷练习题是学 Python 的关键学编程和学游泳很像听懂理论只是第一步真正能游起来必须下水。Python 语法本身并不复杂变量、循环、函数这些概念看几遍视频就能明白。但如果你不亲自写代码不亲自遇到缩进报错、类型不匹配、列表越界这些问题你就永远停留在“看懂”的层面达不到“会用”的层次。练习题的作用就在这里。它不是让你死记硬背而是逼着你在真实场景中调用你学过的知识。每一次练习其实都是在模拟一次小型开发任务。举个例子你学会了 for 循环但如果不做“求列表最大值”“统计字符串中字母出现次数”这类练习你可能根本想不到 for 循环还能这么用只有在练习中反复使用它才会变成你的“肌肉记忆”。1.2 330 道练习题怎样分类更合理330 道题听起来很多但实际上只要按知识点分成几个大块每天每块抽几道节奏感就出来了。常见分类方式如下分类覆盖知识点建议题量占比基础语法与数据类型变量、运算符、类型转换、分支、循环约 20%字符串处理切片、常用方法、正则表达式约 15%列表、元组、字典、集合增删改查、遍历、推导式约 20%函数与模块定义、参数、返回值、递归、匿名函数约 15%文件操作与异常处理文件读写、with 语句、异常捕获约 10%Python 特性与常用库列表推导式、生成器、装饰器、random、datetime约 10%简单算法与编程逻辑排序、查找、去重、递归经典题约 10%这只是一个参考比例。你可以根据自己的薄弱环节动态调整。比如字符串切片不熟就可以多分配一点题量文件操作练得少就专门集中练习两三天。1.3 “每天一练”为什么比“集中突击”更有效很多人的学习误区是平时不写周末一口气刷 50 道题然后宣布自己“今天超努力”。但这种突击式的练习有两个问题大脑疲劳导致效率下降后面的题目基本是机械打卡。缺少间隔复习周日刷完下周三就忘得差不多了。真正见效快的做法是“少量多次”。每天花 40 到 60 分钟练 8 到 10 道题周末再集中复盘错题。这样做的好处很明显每天都有代码输入大脑每天都会在后台做总结而且你能更早发现自己哪里不会及时补漏洞。如果按每天 8 到 10 题计算330 道题大概需要一个多月。不要觉得慢一个月后你会感谢这个“慢”计划。2. 环境准备与版本说明2.1 电脑系统与 Python 版本这套练习题不需要很高配置Windows、macOS、Linux 都可以。你的电脑只需要安装一个 Python 解释器。官网下载地址python.org建议选择 Python 3.8 及以上版本。3.8、3.9、3.10、3.11 都能正常跑本文示例。如果你用的是 Python 2请尽快切换Python 2 已经停止维护很多语法和库的用法与 3.x 不兼容。安装时有一点需要注意在 Windows 安装向导的第一个界面一定要勾选“Add Python to PATH”。这一步配不好后面在命令行里会找不到 python 命令。2.2 开发工具怎么选初学者最推荐Thonny 或 IDLE。IDLE 是 Python 自带的小工具安装完就有适合写极短的代码。Thonny 对新手非常友好可以看到变量每一步的值对理解程序执行过程很有帮助。有几天基础后VS Code Python 插件。这是很多教程推荐的选择。重量适中插件丰富。安装好 Python 插件后可以直接在编辑器里右键运行代码。进阶阶段PyCharm Community Edition。PyCharm 的调试功能更强大适合练习写多文件、小项目。社区版免费功能足够练习用。不管用哪个工具核心思路只有一个把代码写出来跑起来看到结果。2.3 是否需要在线判题平台建议搭配使用在线练习平台比如 LeetCode、牛客网、洛谷等。它们自带测试用例能帮你自动判断答案是否正确。不过要提醒一点在线平台的判题标准比较严格有些题目会隐藏边缘测试用例这正好能帮你想得更全面。刷 330 道题时可以先在本地编辑器写好代码再粘贴到平台提交如果错了回到本地调试这样训练效果最好。3. 核心语法与题型拆解3.1 基础数据类型不要停留在“会用”要练习“转换”Python 的常用数据类型有 int、float、str、list、tuple、dict、set。练习时除了单独使用它们还特别要练“类型转换”。这一步是很多新手的盲区。比如这道题# 输入一个字符串例如 123 456 789 # 输出所有数字的和。 s 123 456 789 nums_str s.split() # 先用空格拆分成字符串列表 total 0 for item in nums_str: total int(item) # 关键把字符串转成 int print(total) # 输出 1368很多人在 int(item) 这一行报错原因可能是字符串里有非数字字符或者是空字符串。这提醒我们做类型转换时要考虑数据是否真的能转。后续学习异常处理时这也会是考点。3.2 流程控制if 和循环的嵌套逻辑流程控制是写代码的基础骨架。Python 里没有 switch 语句在 Python 3.10 之后有 match但练习题中还是 if-elif 更常见所以分支判断基本都用 if。来看一个经典的“成绩等级”题目score 85 if score 90: grade 优秀 elif score 80: grade 良好 elif score 70: grade 中等 elif score 60: grade 及格 else: grade 不及格 print(grade)这里有个很常见的误区有人会把判断顺序颠倒先写if score 60再写elif score 80。这样写就出问题了因为 85 分首先满足score 60后面的 elif 根本不会执行结果会变成“及格”而不是“良好”。练习题的意义就在这里不是让你记住代码而是让你明白判断条件的先后顺序会直接影响结果。3.3 字符串处理切片、格式化、常用方法字符串是 Python 中出现频率最高的数据类型。练习字符串重点不是背方法列表而是学会组合使用它们。看一个字符串反转的变体题# 判断一个字符串是否是对称字符串回文忽略大小写和空格。 def is_palindrome(s): s s.replace( , ).lower() return s s[::-1] print(is_palindrome(A man a plan a canal Panama)) # True print(is_palindrome(hello)) # False这里的[::-1]是切片反转非常常用。你可以在练习中加入更多的字符串题目比如统计单词个数、找出最长的单词、去掉首尾空格等。每道题都尽量用“一行代码 注释”的格式写锻炼精简表达能力。3.4 列表与字典数据结构的增删改查列表和字典是练习题里最常出现的数据结构。列表是“有序的序列”字典是“键值对映射”。这里重点提醒一个坑列表复制。a [1, 2, 3] b a # 这不是复制只是把 b 指向同一个列表 b.append(4) print(a) # [1, 2, 3, 4]如果你想让 b 成为 a 的独立副本应该用b a.copy()或b a[:]。这个知识点在练习题中经常出现特别是做“去重”“冒泡排序”等题目时很容易因为变量共享导致结果异常。字典练习的经典题目是统计字符频率s hello world freq {} for ch in s: freq[ch] freq.get(ch, 0) 1 print(freq)这里get(ch, 0)的用法很巧妙如果键不存在返回默认值 0然后再加 1。这样简化了判断也避免了 KeyError。3.5 函数与递归把复杂问题拆成小块函数是重复逻辑的封装。练习题里一般会要求你实现某个功能函数比如“写一个函数接收一个整数 n返回 n 的阶乘”。递归是编程学习的第一个小难点。很多人在脑子里转不过弯来其实只要记住两点递归必须有终止条件。递归调用时要让问题规模变小。以阶乘为例def factorial(n): if n 1: return 1 return n * factorial(n - 1) print(factorial(5)) # 120练习题中递归题不要贪多掌握经典的阶乘、斐波那契数列、目录遍历即可。更复杂的递归在项目里很少用到不要钻牛角尖。3.6 文件操作与异常处理写代码必须考虑的“边界情况”文件操作是练习题里比较实用的一类。比如# 读取 data.txt统计每一行的单词数量输出到 result.txt with open(data.txt, r, encodingutf-8) as f: lines f.readlines() with open(result.txt, w, encodingutf-8) as f: for i, line in enumerate(lines, start1): word_count len(line.split()) f.write(f第{i}行: {word_count}个单词\n) print(处理完成)with语句会自动关闭文件这是推荐写法。如果不加 encodingutf-8在 Windows 上可能因为默认编码问题导致中文乱码这是新手经常会遇到的坑。异常处理也是练习题里的常见项。练习时不要只是为了消除报错而写 try-except更要思考“这个程序在什么情况下可能出错”然后针对性地处理。try: num int(input(请输入一个数字: )) print(10 / num) except ValueError: print(输入不是有效数字) except ZeroDivisionError: print(不能除以0)在练习题里你可以把“用户输入”这类场景拿来做异常处理练习这样比单纯背语法有效得多。4. 完整实战案例学生成绩管理系统前面我们一直在拆解知识点。但练习题最终要能组合起来。下面通过一个“学生成绩管理系统”的小项目把字符串、列表、字典、函数、文件操作、异常处理都串起来。这个项目不依赖第三方库直接用 Python 标准库就能运行。4.1 项目结构建议在本地新建一个目录命名为student_grade_system。目录下只需要一个 Python 文件student_grade_system/ └── main.py如果你愿意也可以分成models.py、utils.py两个文件但练习阶段先用一个文件保持简单。4.2 需求分析程序需要支持五个基本功能添加学生成绩。显示所有学生成绩。统计平均分和最高分。保存成绩到文件。从文件加载成绩。学生在程序中使用字典表示键是学生姓名值是成绩列表。整体数据结构可以是这样students { 张三: [85, 90, 78], 李四: [60, 75, 80] }4.3 代码实现下面这个代码可以在命令行里直接运行。它不是最优解但很适合作为练习题的综合参考。# 文件路径student_grade_system/main.py import os # 数据文件 DATA_FILE grades.txt # 全局数据键为姓名值为成绩列表 students {} def load_data(): 从文件加载数据到 students 字典 if not os.path.exists(DATA_FILE): return try: with open(DATA_FILE, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue parts line.split(,) name parts[0] scores [int(x) for x in parts[1:]] students[name] scores except Exception as e: print(f读取文件出错: {e}) def save_data(): 将 students 保存到文件 try: with open(DATA_FILE, w, encodingutf-8) as f: for name, scores in students.items(): line name , ,.join(str(s) for s in scores) f.write(line \n) print(数据已保存) except Exception as e: print(f保存文件出错: {e}) def add_student(): 添加学生成绩 name input(请输入学生姓名: ).strip() if not name: print(姓名不能为空) return score_input input(请输入成绩用空格分隔: ) try: scores [float(x) for x in score_input.split()] except ValueError: print(成绩格式不正确) return if name in students: students[name].extend(scores) else: students[name] scores print(添加成功) def show_students(): 显示所有学生成绩 if not students: print(暂无学生数据) return for name, scores in students.items(): avg sum(scores) / len(scores) if scores else 0 print(f{name}: {scores}, 平均分: {avg:.2f}) def statistic(): 统计平均分和最高分 if not students: print(暂无学生数据) return all_scores [] for scores in students.values(): all_scores.extend(scores) if not all_scores: print(暂无成绩) return avg sum(all_scores) / len(all_scores) max_score max(all_scores) print(f所有学生平均分: {avg:.2f}) print(f所有学生最高分: {max_score}) def main(): load_data() print( 学生成绩管理系统 ) while True: print(\n1. 添加学生成绩) print(2. 显示所有学生成绩) print(3. 统计信息) print(4. 保存到文件) print(5. 退出) choice input(请输入选项: ).strip() if choice 1: add_student() elif choice 2: show_students() elif choice 3: statistic() elif choice 4: save_data() elif choice 5: save_data() print(退出程序) break else: print(无效选项) if __name__ __main__: main()4.4 运行与验证在命令行中进入student_grade_system目录运行python main.py然后按照提示操作输入 1填写张三成绩85 90 78。输入 1填写李四成绩60 75 80。输入 2查看学生信息。输入 3查看统计结果。输入 4保存数据到 grades.txt。输入 5退出。重新运行程序数据会自动加载可以直接查看之前录入的成绩。4.5 这个项目覆盖了哪些考点这个项目虽然小但它综合了变量和基本数据类型。input 输入与类型转换。列表的 extend、字典的成员判断。try-except 异常处理。文件读写、with 语句。函数的定义和调用。循环控制程序的流程。做这一类综合练习题时不要只满足于“能跑”。你可以在此基础上继续加功能比如按平均分排序。删除学生。查询某个学生的成绩。这些都是很好的练习题变体。以后在面试或实际项目中你会发现很多功能就是从这些基础操作组合出来的。5. 常见问题与排查思路刷题过程中很多问题具有共性。下面用表格整理一下最常见的几类错误和对应的排查方法。问题现象常见原因解决思路SyntaxError: invalid syntax少写冒号、括号不匹配、中英文符号混用检查出错行的标点特别注意在 if、for、def 等语句结尾加冒号IndentationError缩进不正确tab 和空格混用在编辑器中开启“缩进为 4 个空格”统一缩进风格NameError: name xxx is not defined变量名拼写错误或变量在使用前未定义从报错位置向上排查确认变量赋值语句已执行TypeError: unsupported operand type(s)数据类型不匹配例如字符串和整数相加打印变量的 type确认是否需要类型转换IndexError: list index out of range列表索引超出范围检查列表长度确认循环边界是否越界KeyError字典中不存在该键使用dict.get(key)代替dict[key]或先做判断FileNotFoundError要打开的文件不存在确认文件路径是否正确使用os.path.exists先判存在中文乱码文件编码不一致打开文件时指定encodingutf-8程序运行结果与预期不符逻辑顺序或边界条件考虑不周用 print 打印关键中间变量逐步缩小问题范围下面挑两个高频问题详细展开排查方法。5.1 缩进报错到底错在哪Python 用缩进表示代码块。常见错误页面上会直接提示“expected an indented block”。这种情况通常发生在你在if或for下面没有写缩进或者删除代码时不小心把缩进删了。建议在 VS Code 或 PyCharm 中开启“显示空格”。统一使用 4 个空格缩进不混用 tab。保存代码时选择“类型为 Python 文件”。如果你是从网上复制代码更要注意复制过来后缩进可能被破坏。一般情况下用编辑器“格式化文档”VS Code 里是 ShiftAltF可以帮上忙。5.2 缩进没错但结果不对的“逻辑型 Bug”这类问题不报错但输出和预期不一致。比如求 1 到 10 的奇数之和时有人可能把 if 判断写反导致算成了偶数之和。这类 Bug 很难直接定位。排查步骤缩小范围。先固定一个很小的输入比如程序要求输入列表你就手动写死nums [1, 2, 3]。在关键位置打印中间结果。把算法步骤在纸上手动走一遍和代码输出对比。例如nums [1, 2, 3, 4, 5] result 0 for n in nums: if n % 2 1: result n # 在这里 print(n, result) 可以看到每一步 print(result)加上打印后如果每一步的 n 和 result 都符合预期就说明逻辑没问题如果某一步不符合就能立刻锁定出错的循环分支。6. 最佳实践与工程建议6.1 制定滚动复习计划330 道题不是刷一遍就结束。第一次刷题是为了拓宽边界发现自己哪里不懂第二次刷题才是真正内化。建议这样安排第一遍按题型顺序做完遇到不会的题先思考 15 分钟然后看答案理解思路。第二遍只做第一遍的错题和“看了答案才做出来的题”隔两天再做一次。第三遍每个知识点随机抽 2 到 3 道题当做小测验。这种“滚动复习”比起盲目刷新题记忆留存率高得多。可以把每天做错的题记在笔记里用一句话写清楚错误原因。6.2 代码规范从一开始就认真练习题是养成代码习惯最好的机会。这些规范包括变量命名要能表达含义比如total_score而不是a或temp1。函数前面写一行 docstring说明功能。常量名用大写如MAX_RETRY 3。每行代码不超过 79 或 120 个字符根据团队规范调整。你在刷题时可能觉得这些不重要但以后进入项目开发代码是给别人看的也是给未来的自己看的。练习时多写几个注释多起几个有意义的变量名收益会非常大。6.3 拒绝复制粘贴尝试“盲写”练习题特别忌讳一边看答案一边敲代码。这样做的本质只是“抄”不是“练”。更有效的方法是看题之后把答案文件关掉。自己新建一个文件从零开始写。写不出来时可以看解题思路但不要看完整代码。写完后再对比标准答案关注有哪些地方可以优化。如果你在某道题上卡了很久这不是坏事。卡住说明你正在建立新的知识连接。只要最后理解了这道题就是你的收获。6.4 学会使用调试工具作为初学者最常见的调试方式就是 print。这个没问题但如果题目稍微复杂一点print 就很低效。尽早学会使用断点调试。在 PyCharm 或 VS Code 里都可以在代码行号旁边点一下设置一个红点然后以调试模式运行。程序会在红点处暂停你可以看到所有变量的当前值再按 F10 单步执行。这样你就能“看到”程序是怎么一步步跑的了。当你刷到一些需要递归或嵌套循环的题时调试工具能帮你少走很多弯路。6.5 先写伪代码再写 Python很多人拿到题目就直接写代码写着写着思路就乱了。一个更好的顺序是先把解题步骤写成伪代码。比如统计单词频率可以先写1. 把句子拆成单词列表 2. 遍历每个单词 3. 如果单词已经在字典里则计数加1 4. 否则在字典中新增该单词计数为1 5. 输出字典然后再把伪代码翻译成 Python。这个过程会强迫你把思路理清楚减少边写边改的情况。7. 总结与学习路线这 330 道题最终要练的并不是“会做题”本身而是提升你拆解问题、定位 Bug、选择正确数据结构的能力。这些能力是以后做爬虫、Web 开发、数据分析项目的地基。建议你把练习节奏拉长一些。用一周练完 330 道题这种说法本质上是一种激励真正执行时每天稳定练习 8 到 10 道题配合错题回顾效果会好很多。一个月后你会发现很多入门时的“难题”已经变成“简单题”。下一步你可以做什么把 330 道题中自己薄弱的题型再找 50 道练一遍。开始尝试写完整的控制台小项目比如记账本、猜数字游戏、文件整理脚本。学习常用标准库random、datetime、collections、functools。尝试玩一些在线判题网站给自己一点挑战。不要追求一次做到完美先做起来再说。哪怕每天只写一道题只要你坚持下来就已经超过很多只收藏不练习的人了。如果这篇文章对你有帮助可以收藏备用然后打开你的 Python 环境从第一道练习题开始吧。
返回列表