Python零基础入门:从环境搭建到实战项目的完整学习路线
2026/9/19 16:46:55 网站建设 项目流程

次接触 Python 的朋友,也适合学过一点但始终没把基础打扎实的初学者。纯新手可以按顺序从头看,有基础的老哥可以直接跳到你薄弱的那节,比如文件操作或者异常处理。

1. 学习路线设计思路:为什么建议“半小时搭环境,一周打基础,三天做项目”

1.1 学习顺序的底层逻辑

我见过太多人学 Python 的时候犯同一个错误:上来就抓着一本厚书啃语法,或者直接跑去学爬虫、数据分析这种看起来很酷的方向,结果学到一半发现自己连列表和字典都分不清,代码报错也看不懂,最后只能放弃。

这里我想先聊一下学习顺序背后的逻辑。Python 的知识体系看起来散,实际上有一条非常清晰的主线:数据类型是砖块,流程控制是水泥,函数是预制板,文件操作是运输车,异常处理是安全帽。你得先有砖块和水泥,才能谈盖楼;你连砖块都没烧好,直接学装修(比如爬虫、Web 开发),那肯定会塌。

我建议的路线是:环境搭建(半天)→ 语法基础(3到4天)→ 数据结构(2天)→ 函数与模块(2天)→ 文件与异常(1到2天)→ 小项目实战(3天)。整个周期一周到十天左右,每天不用花太多时间,但一定要保证每天都有代码输出。

1.2 选择 Python 3 而不是 Python 2 的理由

有些老教程还在讲 Python 2,这个我必须专门拿出来说一下。Python 2 在 2020 年就已经正式停止维护了,你现在学它等于学一门“死语言”。网上搜到的大量旧代码如果是print 'hello'这种不带括号的写法,那大概率就是 Python 2 的语法,直接跳过就行,别浪费时间。

我遇到不少初学者会在 Windows 上装完 Python 后,在命令行里敲python发现打不开,结果是装的时候没勾选Add Python to PATH。这个选项默认是不勾的,你要是不小心漏了,后面装什么库都会提示“不是内部或外部命令”。这里先埋个伏笔,后面环境配置那节我会详细讲怎么处理。

2. 环境搭建与工具选型:把准备工作做到位

2.1 Python 安装的完整流程

在 Windows 上安装 Python 其实是全平台里最简单的,但也是最容易出问题的。我按步骤拆开来讲。

先去 Python 官网下载安装包,这里注意别下错版本。我个人的建议是选择 3.10 或 3.11 系列,这两个版本是当前开源社区兼容性最好的。3.12 和 3.13 虽然新,但部分第三方库可能还没跟上,装的时候容易踩兼容性的坑。下载的时候注意区分 64 位和 32 位,现在绝大多数电脑都是 64 位,直接选Windows installer (64-bit)那个就行。

安装的时候有一个非常关键的步骤:在安装界面第一页,务必勾选底部的“Add Python to PATH”选项,然后再点击 Install Now。这一步的作用是告诉 Windows:以后你在命令行里敲python的时候,系统去哪找这个程序。忘了勾的话,后患无穷。

安装完成后,验证环境是否正常,打开命令行工具——Windows 上按Win + R,输入cmd回车——然后执行:

python --version

如果看到类似Python 3.11.9的输出,那说明安装成功了。如果提示不是内部或外部命令,那大概率就是 PATH 没配好,去系统设置里手动把 Python 的安装目录加进环境变量就好。

2.2 代码编辑器选择:VSCode 还是 PyCharm

编辑器这块是新手最容易纠结的地方。我的建议是:如果你是纯新手,直接用 VSCode;如果你确定要往专业开发方向走,后面再换 PyCharm 也不迟。

为什么推荐 VSCode?因为它轻量、启动快、插件生态丰富,而且完全免费。装好 VSCode 之后,还需要装一个 Python 扩展,这个扩展会给你提供代码高亮、智能补全、调试功能,体验非常接近专业 IDE。

配置过程也简单:打开 VSCode,左侧扩展栏搜索 “Python”,找到微软官方出的那个(发布者是 Microsoft,下载量最高),点击安装。装完后新建一个.py文件,写一行print("hello"),然后右键选择 “Run Python File in Terminal”,就能看到输出结果了。

有些同学会问 PyCharm 怎么样。PyCharm 社区版其实也不错,功能更完整,但对电脑配置要求高一些,启动比较慢,而且它的很多高级功能(比如数据库工具、专业框架支持)是收费版才有的,新手用不上。所以我个人的经验是先 VSCode 入门、后期再切换,学习成本最低。

2.3 用虚拟环境隔离项目依赖

这是一项很多刚入门的朋友根本没听说过的操作,但我觉得必须从第一天就培养这个习惯。

虚拟环境(virtual environment)相当于给每个项目单独隔离出了一个独立的 Python 运行空间。什么意思呢?举个例子:项目 A 需要 Django 4.0,项目 B 只能用 Django 2.2,如果你把这两个装到同一个环境里,就会出现冲突;但如果你给 A 和 B 各建一个虚拟环境,它们就能互不干扰。

创建虚拟环境的命令非常简单,在项目文件夹下执行:

python -m venv venv

然后在 Windows 上激活:

venv\Scripts\activate

激活后,命令行前面会出现(venv)的提示符,这时候你再用pip install安装的包,就只会装进这个项目自己的环境里了。在 macOS 或 Linux 上激活方式是source venv/bin/activate

注意:如果你使用的是 VSCode,装完 Python 扩展后,打开一个项目文件夹,右下角通常会提示你选择 Python 解释器,这时候直接选刚才创建的venv环境就行,终端也会自动进入虚拟环境,非常方便。

3. 基础语法核心细节:变量、数据类型与运算符的易错点

3.1 变量与动态类型的理解

Python 的变量声明不需要写类型,这是它对比 C 或 Java 最大的特点之一。你看 C 语言要写int a = 3;,Python 里直接写:

a = 3 name = "张三" height = 1.75

这种“动态类型”机制确实降低了初学门槛,但也带来一个问题:新手往往不知道一个变量到底是什么类型了。好在我们有内置的type()函数可以随时查:

print(type(a)) # <class 'int'> print(type(name)) # <class 'str'> print(type(height)) # <class 'float'>

在实际项目里,变量命名是最容易被忽视却非常重要的一件事。我见过很多人写代码时用abc当变量名,过了三天回头看,完全忘了它们是什么意思。我个人的习惯是用动宾短语命名变量,比如user_counttotal_priceget_user_name(),这样代码本身就变成了文档。

3.2 数字类型与字符串的进阶操作

Python 里的数字类型主要有int(整数)、float(浮点数)和complex(复数)。初学者最容易踩的坑是整数除法和浮点数精度问题

先看整数除法。在 Python 3 里,/是真正意义的除法,返回浮点数;//是整除,向下取整。看这段代码:

print(5 / 2) # 2.5 print(5 // 2) # 2 print(-5 // 2) # -3,这里是向下取整,不是向零取整

第三个结果可能出乎很多人的意料:-5 // 2结果是-3,因为-2.5向下取整就是-3。如果你需要向零取整,得用int(-5 / 2),结果是-2

字符串的进阶操作也非常常用。比如格式化字符串,老手现在都用 f-string,性能好而且可读性高:

name = "小明" age = 18 print(f"名字:{name},年龄:{age}")

输出结果就是名字:小明,年龄:18。这个语法是 Python 3.6 之后引入的,写起来比旧式的%格式化和.format()方法都舒服得多。

3.3 流程控制:条件判断与循环的细节

条件判断的核心是if / elif / else,这里要特别注意:Python 用缩进来表示代码块,不是用大括号。这是初学者最容易跪的地方。

score = 85 if score >= 90: print("优秀") elif score >= 60: print("及格") else: print("不及格")

缩进建议统一用 4 个空格,不要混用 Tab 和空格,否则会直接报IndentationError。你可以在 VSCode 的设置里开启 “Render Whitespace”,把空格显示成小圆点,这样缩进就一目了然了。

循环有两种:for循环和while循环。for循环主要用于遍历可迭代对象,比如列表、字符串、字典的键;while循环主要用于你不知道循环次数的情况,比如实现一个猜数字游戏:

import random target = random.randint(1, 100) guess = 0 while guess != target: guess = int(input("请输入你猜的数字:")) if guess > target: print("猜大了") elif guess < target: print("猜小了") print("恭喜你猜对了!")

这段代码虽然简单,但把whileif/elif/else、用户输入、随机数生成全串起来了,跑起来的效果很直观。

4. 数据结构实战:列表、字典、元组与集合

4.1 列表:最常用的有序集合

列表是 Python 里使用频率最高的数据结构。它的特点是有序、可变、可以存任意类型的元素。定义方式用方括号:

fruits = ["苹果", "香蕉", "橙子"] print(fruits[0]) # 苹果 print(fruits[-1]) # 橙子,负索引表示从后往前数 fruits.append("西瓜") # 在末尾添加元素 fruits.insert(1, "草莓") # 在索引 1 的位置插入 fruits.remove("香蕉") # 删除指定元素

列表的切片操作list[start:end:step]和字符串是通用的,它是一个非常抓手的技巧。比如反转一个列表,最简单的写法不是写循环,而是:

reverse_fruits = fruits[::-1]

这个写法的意思是:从开头到末尾,步长为 -1,也就是倒数着取。很多基础面试题里都有反转列表的题目,一行切片搞定,非常加分。

另一个常用技巧是列表推导式,它可以在一行内完成循环和条件筛选。比如要生成 1 到 10 之间的偶数平方:

squares = [x**2 for x in range(1, 11) if x % 2 == 0] print(squares) # [4, 16, 36, 64, 100]

建议初学者先把普通的for循环写熟,再逐渐习惯推导式。推导式写起来简洁,但嵌套多了可读性会下降,实际工作中要把握好度。

4.2 字典:键值对的高效查找

如果说列表是 Python 里最常用的结构,字典就是最重要的结构。字典以键值对key: value的形式存储数据,查找速度极快,底层实现是哈希表。

user = { "name": "张三", "age": 25, "city": "上海" } print(user["name"]) # 张三 print(user.get("job")) # None,用 get 访问不存在的键不会报错 user["job"] = "工程师" # 新增或修改键值对

这里有一个强烈推荐的技巧:访问字典时优先用.get()而不是方括号user["job"]如果键不存在会直接抛出KeyError,程序崩溃;而user.get("job")返回None,你还可以给它一个默认值:

job = user.get("job", "未知")

遍历字典也有讲究。默认的for key in user遍历的是键;如果你需要同时拿键和值,用.items()

for key, value in user.items(): print(f"{key}: {value}")

在实际的数据处理场景里,字典经常用来做计数统计。比如统计一段文本中每个单词出现的次数,不用装任何第三方库,纯基础语法就能写:

text = "hello world hello python hello world" words = text.split() word_count = {} for word in words: word_count[word] = word_count.get(word, 0) + 1 print(word_count) # {'hello': 3, 'world': 2, 'python': 1}

这个例子是很多文本处理任务的雏形,理解它对你后面学数据分析、爬虫都有帮助。

4.3 元组与集合:适合特定场景的数据类型

元组(tuple)用圆括号定义,和列表很像,但不可变。这个“不可变”特性意味着元组一旦创建就不能修改,它在设计上表达的是“这个数据不会变”的语义,而且可以作为字典的键,比如用二维坐标作为键:

position = (3, 5) map_dict = {position: "宝藏"} print(map_dict[(3, 5)]) # 宝藏

集合(set)的特点是自动去重,并且支持数学上的交集、并集、差集操作。去重是一个极其常用的场景:

numbers = [1, 2, 2, 3, 3, 3, 4] unique_numbers = list(set(numbers)) print(unique_numbers) # [1, 2, 3, 4]

一行代码完成列表去重,这是基础面试里非常高频的考点。集合运算也很实用,比如你有两个好友列表,想找出共同好友:

friends_a = {"张三", "李四", "王五"} friends_b = {"李四", "赵六"} common = friends_a & friends_b # 交集,结果是 {"李四"}

5. 函数与模块:把代码组织起来的艺术

5.1 定义函数的基本规则与默认参数陷阱

函数是代码复用的最小单元。用def关键字定义:

def add(a, b): """两个数相加并返回结果""" return a + b result = add(3, 5) print(result) # 8

这里要强调函数文档字符串(docstring)的习惯。上面函数体里的"""两个数相加并返回结果"""就是文档字符串,它会显示在 VSCode 的智能提示里,让调用的人一眼就明白这个函数是干什么的。这个习惯在团队协作中尤其重要。

参数这块有一个非常经典的坑:不要在函数的默认参数中使用可变对象。看这个例子:

def add_item(item, items=[]): items.append(item) return items print(add_item(1)) # [1] print(add_item(2)) # [1, 2]

看到没,第二次调用的时候明明没有传items,结果却包含了第一次调用添加的1。原因是默认参数在函数定义时就被创建了,后面每次调用都复用了同一个列表对象。正确的写法是:

def add_item(item, items=None): if items is None: items = [] items.append(item) return items

5.2 匿名函数与高阶函数的应用

Python 有lambda表达式用来创建简单的匿名函数。它最常见的应用场景是配合sorted()filter()map()这些高阶函数使用。

比如有一个字典列表,想按年龄排序:

users = [ {"name": "张三", "age": 25}, {"name": "李四", "age": 19}, {"name": "王五", "age": 30} ] sorted_users = sorted(users, key=lambda u: u["age"]) print(sorted_users) # [{'name': '李四', 'age': 19}, {'name': '张三', 'age': 25}, {'name': '王五', 'age': 30}]

key参数指定排序依据,lambda u: u["age"]表示取每个字典的age字段作为排序的键。这个写法在数据分析、Web 开发里非常常见,务必掌握。

5.3 模块与包的导入方式

当你写的代码越来越多,把所有函数堆在一个文件里就会变得难以维护。这时候就需要模块化:把功能相关的函数拆分到多个.py文件中,用import导入使用。

比如你写了一个utils.py

def format_time(seconds): minutes = seconds // 60 remaining = seconds % 60 return f"{minutes}分{remaining}秒"

然后在另一个文件里使用:

import utils print(utils.format_time(125)) # 2分5秒

也可以局部导入:

from utils import format_time print(format_time(125))

导入第三方库也是这个逻辑。Python 强大的生态靠的就是 PyPI 上几十万个开源包,安装命令统一是pip install 包名。比如后面实战部分需要用到的requests库,安装就是:

pip install requests

注意:如果你安装了多个版本的 Python,或者使用了虚拟环境,执行pip install之前最好确认一下当前使用的是哪个pip。在 VSCode 的终端里,只要激活了虚拟环境,pip就会自动指向正确的 Python 解释器。

6. 文件操作与异常处理:让程序更健壮

6.1 读写文件的正确姿势

Python 操作文件的核心函数是open(),配合with语句使用是标准写法。为什么强调with?因为它能自动管理文件资源:不管代码执行成功还是失败,with块结束后文件一定会被正确关闭,不需要手动调用close()

# 写入文件 with open("note.txt", "w", encoding="utf-8") as f: f.write("第一行内容\n") f.write("第二行内容\n") # 读取文件 with open("note.txt", "r", encoding="utf-8") as f: content = f.read() print(content)

这里有一个新手经常犯的错:打开文件时不指定encoding="utf-8"。在 Windows 上,Python 默认的文件编码可能是 GBK,读一个用 UTF-8 保存的文件就会直接报UnicodeDecodeError。所以只要你处理的是文本文件,我都会建议你显式地写上encoding="utf-8",一劳永逸。

按行读取有时候更高效,尤其是处理大文件时:

with open("note.txt", "r", encoding="utf-8") as f: for line in f: print(line.strip()) # strip() 去掉行尾的换行符

注意:循环读取文件时,每一行会包含换行符\n,所以通常要调用.strip().rstrip()去掉它,否则打印出来会多一个空行。

6.2 异常处理:不要让程序莫名崩溃

程序运行中出现错误是不可避免的,关键是怎么优雅地处理它。Python 用try / except捕获异常。比如你让用户输入一个数字,但用户偏偏输入了字母:

try: num = int(input("请输入一个数字:")) print(f"你输入的数字是 {num}") except ValueError: print("输入无效,请输入数字")

ValueErrorint()在无法转换时抛出的异常类型。捕获到这个异常后,程序不会崩溃,而是打印一条友好的提示。

异常的捕获要尽量“精确”,不要把所有异常都一把抓(except Exception:也尽量少用)。因为如果所有错误都被吞掉,那么程序出问题时你根本不知道出了什么问题,排查起来极其痛苦。

一个更进阶的写法是try / except / else / finally

try: f = open("config.txt", "r", encoding="utf-8") except FileNotFoundError: print("配置文件不存在") else: content = f.read() f.close() finally: print("无论是否出错,这段代码都会执行")

elsetry没有异常时执行;finally是无条件执行,通常用来做资源清理。这个结构在实际项目中很常用,但基础阶段先记住try / except就够用了。

6.3 常用内置模块:os 与 json

Python 标准库自带了很多实用的模块,其中osjson是写工具类脚本时最高频用到的两个。

os模块用于文件和目录操作,比如检查文件是否存在、创建目录等:

import os if not os.path.exists("data"): os.makedirs("data") print(os.getcwd()) # 当前工作目录 print(os.listdir(".")) # 当前目录下的文件列表

json模块用于解析和生成 JSON 数据。现在几乎所有 Web API 都用 JSON 作为数据交换格式,所以这个模块一定要熟练。

import json data = {"name": "张三", "age": 25} # 字典转 JSON 字符串 json_str = json.dumps(data, ensure_ascii=False, indent=2) print(json_str) # JSON 字符串转回字典 data_back = json.loads(json_str) print(data_back["name"]) # 张三

注意ensure_ascii=False这个参数:如果不加,中文会被转成\u5f20\u4e09这样的 Unicode 转义序列,虽然不影响数据,但人眼看起来非常难受。

7. 实战项目:从理论到可运行的小工具

7.1 项目需求与功能拆解

在实战之前,我想先讲一个非常重要的理念:拿到一个需求,先拆解功能模块,再写代码。以我现在要带你做的一个“学生成绩管理系统”为例,需求是:

  • 能录入学生的姓名和成绩
  • 能显示所有学生的成绩列表
  • 能按成绩排序
  • 能统计平均分和最高分
  • 数据可以保存到文件,下次启动还能加载

拆解之后,这个项目大概分成这样几个模块:

模块功能涉及知识点
数据录入接收用户输入输入输出、类型转换
数据存储用字典/列表保存内存中字典、列表操作
持久化保存/加载 JSON 文件文件操作、json 模块
统计分析平均分、最高分循环、内置函数
菜单交互用户选择功能条件判断、循环

7.2 完整代码实现与逐段讲解

我把核心代码分模块写出来,你可以直接复制运行,但我更建议你亲手敲一遍。

首先是主程序框架和数据存储结构:

import json import os DATA_FILE = "students.json" students = [] def load_data(): global students if os.path.exists(DATA_FILE): with open(DATA_FILE, "r", encoding="utf-8") as f: students = json.load(f) print(f"已加载 {len(students)} 条学生数据") def save_data(): with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(students, f, ensure_ascii=False, indent=2) print("数据已保存")

students是一个列表,里面每个元素是一个字典,结构是{"name": "张三", "score": 85}load_data在程序启动时自动读取文件,save_data在做完每次增删改后调用,保证数据不丢。

然后是核心功能函数:

def add_student(): name = input("请输入学生姓名:") try: score = float(input("请输入成绩:")) except ValueError: print("成绩必须是数字") return students.append({"name": name, "score": score}) print(f"成功添加学生 {name},成绩 {score}") save_data() def show_students(): if not students: print("当前没有学生数据") return print("姓名\t成绩") for stu in students: print(f"{stu['name']}\t{stu['score']}") def show_stats(): if not students: print("当前没有学生数据") return scores = [stu["score"] for stu in students] avg_score = sum(scores) / len(scores) max_score = max(scores) min_score = min(scores) print(f"平均分:{avg_score:.1f}") print(f"最高分:{max_score}") print(f"最低分:{min_score}") def sort_students(): global students students = sorted(students, key=lambda stu: stu["score"], reverse=True) print("已按成绩从高到低排序") show_students() save_data()

这段代码里,sum()是 Python 内置的求和函数,max()min()分别找最大值和最小值,配合列表推导式[stu["score"] for stu in students]可以非常优雅地提取所有分数。

最后是主菜单循环:

def main(): load_data() while True: print("\n===== 学生成绩管理系统 =====") print("1. 添加学生") print("2. 显示所有学生") print("3. 统计成绩") print("4. 按成绩排序") print("5. 退出") choice = input("请选择功能:") if choice == "1": add_student() elif choice == "2": show_students() elif choice == "3": show_stats() elif choice == "4": sort_students() elif choice == "5": print("已退出系统") break else: print("无效选择,请重新输入") if __name__ == "__main__": main()

最后一行if __name__ == "__main__":是 Python 里一个很有特色的机制:当这个文件被作为主程序直接运行时,__name__的值是"__main__",所以会调用main();如果这个文件被其他模块导入,__name__是模块名,就不会执行,防止副作用。这个写法在实际项目中是规范,建议从第一天就养成。

7.3 项目中的几个重要设计决策

这个系统虽然小,但我特意埋了几个很关键的设计决策。

第一,global关键字修改全局列表。在 Python 里,函数内部直接对列表students调用.append()不需要声明global,因为你不是重新赋值;但像sort_students()里用了students = sorted(...)这种重新赋值的写法,就必须声明global students,否则 Python 会认为你只是在函数内部创建了一个局部变量。这类问题在面试里经常出现。

第二,数据持久化用 JSON 而不是自己造格式。JSON 天生就是 Python 字典的“亲戚”,序列化和反序列化都是一行代码的事,而且人眼可读,出了毛病方便排查。自己写文本格式虽然也行,但遇到复杂的嵌套结构会非常痛苦。

第三,异常处理要放在最容易出错的地方。用户输入成绩时,float()随时可能抛ValueError,所以只有这里用了try / except。其他地方的数据都是从 JSON 文件读出来的,格式固定,与其到处加错误处理,不如保证写入时不出错。这个“防守”的思路,等你写更大项目时会深有体会。

8. 常见问题速查与避坑实战手册

8.1 高频报错信息解读

初学者看到报错就慌,其实报错是 Python 在帮你,它能告诉你出了什么问题、在第几行。我列几个最高频的报错场景和处理办法:

报错信息原因分析解决办法
SyntaxError: invalid syntax语法错误,比如少了冒号、括号不匹配检查报错位置的行,通常是漏了英文符号或冒号
NameError: name 'x' is not defined使用了未定义的变量或函数确认变量名拼写是否正确,确认函数是否已定义、已导入
TypeError: can only concatenate str (not "int") to str字符串和数字直接拼接str()把数字转字符串,或直接使用 f-string
IndexError: list index out of range索引超出列表范围注意列表长度,使用len()判断后再取值
KeyError: 'name'访问字典里不存在的键.get()代替方括号,或先判断键是否存在
IndentationError: unexpected indent缩进有问题统一用 4 空格缩进,检查是否混用了 Tab
ModuleNotFoundError: No module named 'requests'没有安装对应的第三方库执行pip install requests

8.2 环境配置和依赖管理的常见坑

这部分我放在最后,因为很多人学完基础后,第一次独立安装第三方库就会卡住。最典型的三个坑:

第一个是pip 版本太旧。有时候执行pip install会提示你升级,如果你直接忽略,可能接下来安装某个库就会报一些看不懂的错误。可以先执行:

python -m pip install --upgrade pip

第二个是下载速度慢。默认的 pip 源在国外,国内直接下载速度可能会让你怀疑人生,而且极易超时失败。解决方案是换源到国内镜像,比如清华源:

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

后面加-i参数临时指定镜像源,也可以改全局配置文件永久生效。

第三个是全局装了一堆包,项目管理混乱。这就是第 2 节强调虚拟环境的原因。养成每个项目一个虚拟环境的习惯后,你会发现即使某天把环境搞坏了,删掉venv文件夹重建一个就行,对整个电脑零伤害。

8.3 我最后想单独强调的两个小技巧

第一个是关于print()函数调试法的边界认知。很多新手写代码报错了,就盯着代码干瞪眼。我建议你大胆地在关键位置加print(),把变量的值打出来,看看实际执行到哪一步、变量的值是否符合预期。这种调试方式虽然原始,但解决基础阶段的问题绰绰有余。等你熟练了,自然会发现 VSCode 里断点调试更高效,但一开始用print建立“程序是按行执行的”这个直觉非常重要。

第二个是关于如何高效利用搜索引擎。编程报错信息通常有很强的规律性,你直接把报错信息粘贴到搜索框里搜,基本都能找到答案和讨论帖。很多人搜的是“Python 报错怎么办”,这种错得太离谱了。正确的搜法是:复制完整的报错信息 + Python 版本 + 你正在用的库名,比如TypeError can only concatenate str not int python,精确匹配,效率会高非常多。学编程很重要的一项能力,就是能够精确地描述问题,然后靠搜索引擎自我解决问题。

写到这里,这个学生成绩管理系统虽然只有一百多行代码,但它把变量、列表、字典、循环、条件、函数、文件、异常、模块这些基础知识点全部串起来了,是一个很典型的“麻雀虽小五脏俱全”的入门实战项目。你把这段代码跑通了,再自己动手改一改——比如加一个“删除学生”功能,或者把数据从 JSON 换成数据库——基础就已经非常扎实了,后面的路走起来会顺畅得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询