电子学会 🐍 Python 🔧 C++ GESP 🐍 Python 🔧 C++
Python 等级考试 / 知识点手册

青少年软件编程(Python)等级考试 · 知识点手册

依据《青少年软件编程(Python)等级考试大纲(2026 年修订版)》整理。全册共六大等级,从编程基础入门到数据结构与算法,逐级递进、能力叠加。每个知识点均配有详细讲解、代码示例、易错点提示,并尽量结合真题/模拟题讲解。

共 6 个等级 上机考试 客观题 50~70% + 编程题 附一级真题与五级模拟题

考纲总览

等级逻辑关系 · 能力要求 · 试题结构 · 分值分布

一、等级逻辑关系总览

六个等级之间呈现逐级递进、能力叠加的关系:

  • 低等级(一、二级):注重基础语法和流程控制,为后续学习打下基础。
  • 中等级(三、四级):引入算法思维和模块化编程,提升代码组织和问题分解能力。
  • 高等级(五、六级):强调数据处理、系统设计和数据结构,为专业化编程学习做准备。
一级 → 二级
从基础语法和顺序结构,过渡到核心数据类型和循环/分支结构,增强程序控制能力。
二级 → 三级
从数据类型操作提升到算法实现,引入推导式和内置函数,培养算法思维。
三级 → 四级
从算法基础过渡到函数封装和模块化设计,引入递归、分治和标准库使用。
四级 → 五级
从模块化编程扩展到文件操作、数据处理和可视化,引入数据库基础。
五级 → 六级
从数据处理提升到面向对象编程和数据结构,掌握类、线性与非线性结构及其算法。

二、各级别能力要求与核心知识点总览

等级能力描述核心知识点
一级熟悉编程环境,具备编写顺序与单分支结构的简单程序的基本编程能力简单数学运算与 Turtle 库
二级掌握核心数据类型的概念与操作,具备编写顺序、分支、循环结构的简单程序的基本编程能力核心数据类型:列表、元组、字符串、字典、集合
三级具有基本的算法思维,具备以算法为目标的基本编程能力推导式,常用内置函数,算法:解析、枚举、排序,数制转换
四级具有初步的模块编程思维,具备以函数形式代码复用的基本编程能力自定义函数,递归与分治,查找,模块及常用标准库
五级具有初步的数据意识与思维,具备以数据处理为目的的基本编程能力简单文件读写、数据统计与可视化、数据库
六级掌握简单的数据结构概念与操作,具备选择合理的数据结构与算法编程处理问题的基本编程能力类与对象,简单数据结构与算法:数组、字符串、队列、栈、二叉树

三、试题结构与各等级分值分布总览

评价采用上机考试形式,由客观题(单选、多选、判断)和编程题两部分构成。

等级客观题占比编程题占比核心考察重点
一级至二级约 60%~70%约 40%~30%基础语法、流程控制、核心数据类型的基本操作
三级至四级约 60%~70%约 40%~30%算法思维、函数使用、模块应用、代码调试能力
五级至六级约 50%~70%约 50%~30%数据处理、系统设计、数据结构与算法综合应用能力

各级别题型配比及分值(节选自考纲)

等级知识体系(分值)单选判断编程合计
一级编程环境(10)64050/20/30
编程基础(26)10124
Turtle 库(24)1446
数学运算(30)18012
计算思维(10)208
二级列表(21)1425
元组(10)640
字符串(15)645
字典(10)820
流程控制(34)16810
计算思维(10)0010
三级编码数制(10)640
推导式(12)840
解析算法(8)620
枚举算法(18)6210
排序算法(32)8420
核心函数(20)1640
计算思维(—)
四级函数概念(16)1240
自定义函数(26)12410
递归与递推(22)8410
分治算法(18)6210
算法效率(6)420
库与模块(12)840
五级文件操作(26)2060
数据处理(16)1060
数据可视化(8)620
数据库(20)1460
计算思维(30)0030
六级类与对象(26)12410
数组(22)8410
字符串(19)1045
队列(17)845
栈(8)620
二叉树(8)620
说明:各级别题目数量大致为 25 道单选(每道 2 分,共 50 分)、10 道判断(每道 2 分,共 20 分)、2~3 道编程题(共 30 分)。

四、使用说明与备考建议总览

  • 本手册按考纲顺序,将各级别知识点拆分为若干卡片,左侧导航可快速跳转。
  • 每个知识点都包含概念讲解 → 代码示例 → 易错点 → 真题/模拟题的完整闭环。
  • 代码块右上角有“复制”按钮,答案可点击“查看答案”展开。
  • 一级真题直接取自考纲样题;二至六级因考纲未附样题,配以贴合考点的模拟题讲解。
1

一级 · 编程入门

编程环境 · 编程基础 · Turtle 库 · 数学运算 · 计算思维
能力目标:顺序 + 单分支结构简单程序 核心:简单数学运算 + Turtle 库 客观题 50 分 / 编程题 30 分 2 道编程题

1.1 编程环境10 分

① Python 常见开发环境

Python 有多种开发环境(IDE),一级考试要求了解并会使用其中至少一种

  • IDLE:Python 官方自带的编程环境,最常用、最基础,考试通常用这个。
  • Thonny:面向初学者的图形化 IDE,界面友好。
  • Visual Studio Code(VS Code):微软开发的代码编辑器,功能强大,需安装 Python 插件。
  • Jupyter Notebook:网页式交互环境,适合数据分析、教学演示。
易考点:“Python 自带/默认的编程环境是 IDLE”;Scratch、Word 等不能编写运行 Python 程序。

② Python 版本与迭代

Python 主要有 Python 2Python 3 两大版本方向,目前主流与考试使用 Python 3。Python 2 已停止维护,两者的语法存在差异(例如 Python 2 中 print "hi",Python 3 中必须写 print("hi"))。

③ IDLE 的操作与两种模式

  • 交互模式(命令行模式):打开 IDLE 后看到的 >>> 提示符,输入一行代码回车立即执行,适合快速测试。看到 >>> 就代表进入了逐行运行的模式。
  • 脚本模式(文件模式):通过“File → New File”新建 .py 文件,写完整程序后按 F5(或 Run → Run Module)运行。
  • 文件默认后缀名为 .py(不是 .idle,也不仅是 .txt)。

④ 代码缩进与注释

Python
# 井号开头是单行注释(注释不会被执行)
print("Hello")   # 注释也可以写在代码后面

"""
三个双引号或三个单引号
可以写成多行注释
"""
易错点:Python 使用缩进(通常 4 个空格)表示代码块层次,缩进不一致会报 IndentationError;注释用 #,不是 ():/

1.2 编程基础26 分

① “输入—处理—输出”三步法

任何程序都可以拆成三步:输入(用 input() 得到数据)→ 处理(计算/判断)→ 输出(用 print() 显示结果)。

Python
# 输入
name = input("请输入你的名字:")
# 处理(把输入的内容拼成一句话)
message = "你好," + name
# 输出
print(message)

② print() 输出语句

print() 在屏幕上打印文本或数字。字符串要用引号括起来:单引号 '...'、双引号 "..."、三引号 '''...''' / """..."""(三引号可换行)。

Python
print("hello")     # 正确:双引号
print('hello')     # 正确:单引号
print("""多行
内容""")            # 正确:三引号可换行
print(3 + 4)       # 正确:打印数字 7
# print"hello"     # 错误:漏了括号

③ input() 输入语句

最关键易错点:input() 返回的永远是字符串!参与数学运算前必须用 int()float() 转换。
生活小例子:邮递员送来的纸条

input() 想成邮递员:它只会送来写满字(数字)的纸条。纸条上的"12"只是两个文字符号,不是能算数的数字。

你想做加法,就得先拿 int() 这台翻译机把纸条上的文字"12"翻译成真正的数字 12。不翻译直接相加,就是在"拼接纸条":"12" + "5" 变成 "125",而不是 17!

所以口诀是:要算数,先 int()!

Python
a = input()          # a 是字符串,比如 "12"
b = input()          # b 是字符串,比如 "5"
print(a + b)         # 输出 "125"(字符串拼接!不是 17)
print(int(a) + int(b))  # 输出 17(先转成整数再相加)

④ 变量:命名、赋值与保留字

  • 变量就是给数据起一个名字,用来存储值。不需要提前声明,第一次赋值就是定义。
  • 命名规则:由字母、数字、下划线组成;不能以数字开头;区分大小写;不能使用保留字(如 if、else、for、class、or、is 等)。
  • 变量第二次赋值后,原来的值会被覆盖删除。
Python
score = 90        # 合法:字母开头
score_1 = 95      # 合法:包含下划线
# 2score = 10     # 非法:数字开头
# class = 100     # 非法:class 是保留字
# my-name = 5     # 非法:含减号

a = 10            # a 先存 10
a = 20            # 再赋值后,a 存 20,10 被覆盖
print(a)          # 20
生活小例子:给东西贴标签的储物箱

变量想成贴了名字标签的储物箱score = 90 就是在一个叫 score 的箱子里放进数字 90。

箱子有 3 条规矩:

  • 名字不能乱起:不能以数字开头(不能叫"2score"),不能用保留字(不能叫"if"),就像超市货架编号不能乱编;
  • 一箱一物:再往同一个箱子放新东西,旧东西就被换掉(a = 10 后再 a = 20,a 里只剩 20);
  • 什么都能装:数字、文字、列表……箱子不挑食,都能装。

⑤ 字符串与数值类型转换

  • int():转整数,如 int("12") → 12
  • float():转小数,如 float("3.5") → 3.5
  • str():转字符串,如 str(12) → "12"
  • 字符串可以转成数值,数值也可以转成字符串(考题常见判断题)。
Python
s = "3.14"
pi = float(s)      # 3.14(小数)
n = int("100")     # 100(整数)
t = str(3.14)      # "3.14"(字符串)
print(type(pi), type(n), type(t))
# 输出:<class 'float'> <class 'int'> <class 'str'>

1.3 Turtle 库24 分

Turtle(海龟)库是 Python 自带的绘图库。想象屏幕上一只“海龟”,你指挥它前进、后退、转弯、提笔落笔,它走过的痕迹就是画出来的线。

① 导入库文件

使用前必须先导入:import turtle。导入后所有命令都要用 turtle.xxx() 的形式调用。

② 常用命令速查表

命令作用
turtle.forward(d) / fd(d)前进 d 步(朝向屏幕右方为初始方向)
turtle.backward(d) / bk(d)后退 d 步
turtle.left(angle)左转 angle 度
turtle.right(angle)右转 angle 度
turtle.penup() / up()抬起画笔(移动不划线)
turtle.pendown() / down() / pd()落下画笔(移动划线)
turtle.goto(x, y)移动到指定坐标 (x, y)
turtle.setup(w, h)设置窗口大小;默认坐标原点在窗口正中心
turtle.screensize()设置画布大小(不属于画笔控制命令)
turtle.color("红", "黄")第 1 个参数设画笔颜色,第 2 个参数设填充颜色
turtle.fillcolor("red")设置填充颜色
turtle.begin_fill()开始填充
turtle.end_fill()结束填充
turtle.circle(r, 角度)画半径为 r 的圆;第二个参数是圆心角(circle(120,180) 是半径 120 的半圆)
turtle.dot(size, color)画一个圆点
turtle.pensize(n)设置画笔粗细
turtle.speed(n)设置绘制速度
turtle.clear()清空画面,但海龟位置和状态不变
turtle.done()结束绘制,保持窗口打开

③ 完整示例:画一个正方形

Python
import turtle              # 导入库
turtle.pensize(3)          # 画笔粗细
turtle.color("blue")       # 画笔蓝色
for i in range(4):         # 重复 4 次
    turtle.forward(100)    # 前进 100
    turtle.right(90)       # 右转 90 度
turtle.done()              # 保持窗口

④ 画正方形内嵌圆(考纲样题思路)

Python
import turtle
turtle.penup()                  # 抬笔
turtle.goto(-100, 100)          # 移到正方形左上角
turtle.pendown()                # 落笔
for i in range(4):              # 画边长为 200 的正方形
    turtle.forward(200)
    turtle.right(90)
turtle.penup()
turtle.goto(0, -100)            # 移到圆的起点
turtle.pendown()
turtle.fillcolor("red")         # 填充红色
turtle.begin_fill()
turtle.circle(100)              # 画半径 100 的圆
turtle.end_fill()
turtle.done()
关键易错点:turtle.setup() 默认坐标原点在窗口正中间;② turtle.circle(120, 180) 第一个参数是半径,第二个是角度,所以它是“半径为 120 的半圆”;③ turtle.clear() 只清画面、不改海龟位置状态;④ 海龟初始朝向是屏幕右方。

1.4 数学运算30 分

① 算术运算符

运算符含义示例结果
+加 / 字符串拼接35 - 10 / "py"+"thon"25 / "python"
-35 - 1025
*乘(乘法符号是 *,不是 x30 * 10300
/除(结果恒为小数)30 / 103.0
//整除(取商的整数部分)7 // 23
%取余(取余数)7 % 21
**幂(乘方),优先级最高2 ** 38

② 赋值运算符

= 表示“把右边的值赋给左边”。还有复合赋值:+=-=*=/= 等。

Python
a = 10
a += 5        # 等价于 a = a + 5,现在 a = 15
a *= 2        # 等价于 a = a * 2,现在 a = 30
print(a)      # 30

③ 关系(比较)运算符

运算符含义示例结果
==判断是否相等(注意是两个等号)5 == 5True
!=判断是否不相等20 != 10True
>大于10 > 20False
<小于10 < 20True
>=大于等于10 >= 10True
<=小于等于20 <= 10False
易错点:= 是赋值,== 是比较是否相等,二者绝不能混用。比较运算的结果是布尔值 True / False

④ 逻辑运算符 and / or / not

运算符含义说明
and与(且)两边都为真才为真;有一边为假(如 0、空),结果为假的那一边
or有一边为真就为真;结果为第一个真值
not非(取反)not True → False
数值逻辑运算规则(重要考点):在 Python 中,0、空字符串、空列表等被视为“假”,其他非零数值视为“真”。 a and b:如果 a 为假,结果是 a;否则结果是 b。 a or b:如果 a 为真,结果是 a;否则结果是 b。
例:0 and 10 → 030 and 10 → 1030 or 10 → 30
生活小例子:去游乐场的三个"门卫"

想象游乐园门口有三个门卫,你要进门必须回答他们的问题:

  • and(而且):像"要有门票 而且 要满 120cm 才能玩过山车"。一个不满足,就整件事泡汤,游戏直接失败(结果是"假"的那一边);
  • or(或者):像"有学生证 或者 生日当天可以半价"。只要占一条就能优惠
  • not(不):像"门卫说:不是周末不开园"。它专门把话反着说:真的变假的,假的变真的。

所以 0 and 10 就像"0 是假的(没票),后面再说什么都白搭",结果直接是 0

⑤ 运算符优先级

() 括号 ** 幂 * / // % 乘除取余 + - 加减 比较 > < == != not and or
生活小例子:先做什么菜?

运算符优先级就像做菜的先后顺序,谁"大"谁先动手:

  • 括号 () 是总指挥:喊"先做我里面的!"没人敢不听;
  • 幂 ** 是灶台大火2 * 3**2 先烧开 3**2=9,再做 2*9
  • 乘除 * /加减 + - 先做,就像买菜时"先算单价再算总价";
  • 比较、not、and、or 最后才出场,像饭后甜点慢慢上。

记不住顺序?那就给想先算的加上括号,让"总指挥"帮你搞定!

Python
# 例 1:c = a * b - 5(a=30, b=10)
c = 30 * 10 - 5        # 先乘再减 = 300 - 5 = 295

# 例 2:幂运算优先级高于乘除
x = 2 * 3 ** 2         # 先算 3**2=9,再 2*9=18

# 例 3:and 优先级高于 or
print(3 > 4 or 4 < 3 and 1 == 1)
# 先算 and:4<3 为假,所以整个 and 结果为假值 0 方向 → False
# 再算 or:3>4 为 False,结果 False

1.5 计算思维10 分

一级的计算思维,要求能编写顺序执行的程序、能分析简单的逻辑运算和比较运算结果,并会使用这些结果。主要落实在以下两方面:

① 顺序结构

程序从上到下一行一行执行。经典考题:输入两个数,输出它们的和与积。

Python
a = int(input())      # 输入第 1 个数
b = int(input())      # 输入第 2 个数
print("和是:", a + b)
print("积是:", a * b)

② 单分支结构(if)

条件成立才执行缩进的代码块。

Python
score = int(input("请输入成绩:"))
if score >= 60:
    print("及格")      # 只有条件成立才执行
print("程序结束")      # 无条件都会执行
做题心法:看到“输入→输出和/积/差”这类题,先想三步:input() 输入 → int() 转换 → print() 输出。评分通常按“输入语句、类型转换、计算语句、输出语句、整体正确”逐项给分。

1.6 一级真题讲解考纲样题

以下题目均选自《大纲》附录的一级样题,覆盖编程环境、编程基础、Turtle 库、数学运算、计算思维五大块。点击“查看答案”展开解析。

1. 关于 Python 的编程环境,下列哪个表述是正确的?单选编程环境
A. Python 的编程环境是图形化的B. Python 只有一种编程环境 ipythonC. Python 自带的编程环境是 IDLED. 用 Windows 自带的文本编辑器可以给 Python 编程,并且也可以在该编辑器下运行
答案:C
IDLE 是 Python 官方自带环境。A 错:Python 不要求图形化;B 错:环境不止一种;D 错:记事本可以写代码,但不能直接运行
2. 下列哪个软件不可以编程 Python 程序?单选编程环境
A. ipythonB. Visual Studio CodeC. JupyterNotebookD. scratch 标准版
答案:D
Scratch 是图形化积木式编程工具,不是 Python 编程环境;前三个都可以。
3. 下面哪个符号是 Python 用来给代码做注释的?单选编程基础
A. #B. ( )C. :D. /
答案:A
Python 单行注释用 #: 用于语句末尾表示代码块开始,/ 是除法。
4. 下面 print 语句,哪一个是正确的用法?单选编程基础
A. print"(hello!)"B. print("hello!")C. print("hello!')D. print("hello"!)
答案:B
print() 必须带括号,且引号要成对闭合。A 漏括号;C、D 引号不配对。
5. print 的作用是?单选编程基础
A. 在屏幕上打印出相应的文本或者数字等B. 在打印机里打印相关文本或数字等C. 可以用来画图D. 输出一个命令行
答案:A
print() 是把内容显示在屏幕上,不是物理打印。
6. 下面的哪一个命令是将数值转换为字符串?单选编程基础
A. print()B. text()C. int()D. str()
答案:D
str() 转字符串,int() 转整数,print() 是输出。
7. 下面哪一个不是 Python 的保留字?单选编程基础
A. classB. ifC. abcD. or
答案:C
class、if、or 都是保留字;abc 不是,可以作为变量名。
8. 关于变量的说法,错误的是( )。单选编程基础
A. 变量必须要命名B. 变量第二次赋值后,第一次赋的值将被删除C. 变量只能用来存储数字,不能存储文字D. 在同一个程序里,变量名不能重复
答案:C
变量既可以存数字,也可以存字符串、列表等任意数据,所以“只能存数字”错误。注意题目问的是“错误的是”。
9. turtle.setup() 命令中坐标的起始点是( )。单选Turtle 库
A. 屏幕桌面的左上角B. 屏幕桌面的右上角C. 屏幕桌面的正中间D. 屏幕桌面的最上方正中间
答案:C
Turtle 画布的坐标原点 (0,0) 默认在窗口正中心,向右 x 增大,向上 y 增大。
10. 下面的哪一个命令不是画笔控制的命令( )。单选Turtle 库
A. turtle.up()B. turtle.pd()C. turtle.pensize()D. turtle.screensize()
答案:D
up()、pd()(落笔)、pensize()(笔粗细)都是画笔控制;screensize() 是设置画布大小,不属于画笔控制。
11. turtle.clear() 命令的作用是( )。单选Turtle 库
A. 清空 turtle 窗口,但是 turtle 的位置和状态不会改变B. 清空 turtle 窗口,turtle 的位置和状态会初始化C. 清空 turtle 中的变量,但是 turtle 的位置和状态不会改变D. 清空 turtle 中的变量,turtle 的位置和状态会初始化
答案:A
clear() 只擦除画面,海龟的位置、方向、画笔属性都不变reset() 才会全部重置。
12. turtle.color("red", "yellow") 命令中定义的颜色分别为( )。单选Turtle 库
A. 背景为红色,画笔为黄色B. 背景为黄色,画笔为红色C. 画笔为红色,填充为黄色D. 画笔为黄色,填充为红色
答案:C
color(a, b) 的第一个参数是画笔颜色,第二个是填充颜色
13. 下面哪一段代码是海龟走到指定坐标然后左转 90 度?单选Turtle 库
A. goto(90,0) 然后 left(90)B. left(90) 然后 goto(90,0)C. goto(90,0) 然后 right(90)D. right(90) 然后 goto(90,0)
答案:A
“先走到坐标再左转”→ 先 goto(90,0),再 left(90)。顺序不能颠倒。
14. turtle.circle(120, 180) 是绘制一个什么样的图形( )。单选Turtle 库
A. 半径为 180 的扇形B. 半径为 120 的半圆C. 半径为 120 的圆形D. 半径为 180 的圆形
答案:B
circle(半径, 角度):半径 120,圆心角 180° = 半圆。
15. turtle 的前进是往哪个方向?单选Turtle 库
A. 屏幕窗口的右边B. 屏幕窗口的左边C. 屏幕窗口的上边D. 屏幕窗口的下边
答案:A
海龟初始朝向屏幕右方,所以前进(forward)默认往右。
16. Python 中的乘法是用哪个符号表示?单选数学运算
A. *B. xC. /D. #
答案:A
乘法用 *x 是英文字母不是运算符,/ 是除法,# 是注释。
17. print(35-10) 输出的结果是( )。单选数学运算
A. 35-10B. 35C. 10D. 25
答案:D
括号里先计算 35-10=25,然后输出 25。
18. Python 中的 == 代表的是( )。单选数学运算
A. 把左边的值赋值给右边B. 把右边的值赋值给左边C. 比较左右两边是否相等D. 左右两边值进行交换
答案:C
== 是比较是否相等;赋值是单个 =
19. 假设 a=10,b=30,那么 b/a 的值是( )。单选数学运算
A. 300B. 20C. 3D. 0.333333
答案:C
30 / 10 = 3。注意:虽然结果是 3.0(小数形式),但数值大小是 3。
20. 假设 a=0,b=10,那么 a and b 的结果是( )。单选数学运算
A. 1B. 10C. 11D. 0
答案:D
and 两边都为真才为真,0 为“假”,所以直接短路返回左边的假值 0
21. 假设 a=30,b=10,c=a*b-5,那么 c 的值是( )。单选数学运算
A. 150B. 295C. 300D. 25
答案:B
先乘后减:30 * 10 = 300300 - 5 = 295
22. a=10,b=20,那么 b!=a 运算的结果是( )。单选数学运算
A. 2B. TrueC. FalseD. 0.5
答案:B
20 != 10 成立,结果为 True
23. 下面的运算符中,按照运算优先级哪一个是最高级?单选数学运算
A. **B. *C. +D. <
答案:A
幂运算 ** 优先级最高(括号除外),其次 * / // %,再 + -,比较运算最低。
24. a="python2",b="python3",c=a+b,print(c) 的结果是( )。单选数学运算
A. a+bB. python5C. cD. python2python3
答案:D
两个字符串用 +拼接,不是数学相加,结果是 python2python3
25. print(3>4 or 4<3 and 1==1) 结果是( )。单选计算思维
A. FalseB. TrueC. 3D. 4
答案:A(False)
先算 and(优先级高):4<3 为 False,所以 4<3 and 1==1 结果为 False;再算 3>4 or FalseFalse or FalseFalse

判断题(10 题)

判断 1. 在编程环境中,>>> 代表进入了逐行运行的命令行模式。判断编程环境
答案:正确
>>> 是 IDLE 交互模式(命令行模式)的提示符。
判断 2. IDLE 默认的文件保存名后缀为 .idle。判断编程环境
答案:错误
Python 文件后缀是 .py,不是 .idle。
判断 3. 字符串不可以转化为数值。判断编程基础
答案:错误
字符串可以用 int() / float() 转换为数值,例如 int("12") → 12
判断 4. 变量名可以随便命名。判断编程基础
答案:错误
变量名不能以数字开头、不能含空格/运算符、不能是保留字。
判断 5. 在 Python 中变量不需要提前定义,第一次出现就是定义变量。判断编程基础
答案:正确
Python 变量是动态的,首次赋值即完成定义。
判断 6. 程序 a=b 中,a 是变量,b 是值。判断编程基础
答案:正确
赋值语句把右边的值赋给左边的变量。
判断 7. input() 语句是用来输入一个指令。判断编程基础
答案:错误
input() 是接收用户输入的数据,不是“输入指令”。
判断 8. is 是 Python 的保留字。判断编程基础
答案:正确
is 用于判断两个对象是否同一,属于保留字。
判断 9. Turtle 库主要是用来进行绘图的库。判断Turtle 库
答案:正确
Turtle(海龟)库是 Python 的绘图库。
判断 10. 使用 Turtle 库之前必须要用 import turtle 导入库文件。判断Turtle 库
答案:正确
任何第三方/标准库使用前都必须先 import。
2

二级 · 核心数据类型与流程控制

列表 · 元组 · 字符串 · 字典 · 流程控制 · 计算思维
能力目标:顺序 + 分支 + 循环结构程序 核心:列表 / 元组 / 字符串 / 字典 流程控制 34 分(占比最高) 2 道编程题

2.1 列表 list21 分

① 概念与声明

列表是最常用的可变序列,用方括号 [] 括起来,元素之间用逗号分隔,可以存放任意类型的数据。

Python
a = []                # 空列表
b = [1, 2, 3, 4, 5]   # 整数列表
c = ["苹果", "香蕉", "梨"]  # 字符串列表
d = [1, "hello", 3.5, True]  # 混合列表
e = list("abc")       # 用 list() 把字符串转成列表 → ['a','b','c']
print(len(b))         # 元素个数:5

② 访问、更新与索引

索引从 0 开始,也可以从后往前用负数索引(-1 是最后一个)。

Python
b = [10, 20, 30, 40]
print(b[0])     # 10(第一个)
print(b[-1])    # 40(最后一个)
b[1] = 99       # 更新第 2 个元素
print(b)        # [10, 99, 30, 40]
print(99 in b)  # True:判断是否包含某元素
print(100 in b) # False
生活小例子:一排带编号的储物柜

列表想成一排带编号的储物柜,编号从 0 开始!

lst = ["小红帽", "灰姑娘", "白雪公主"] 就像:

0 号柜:小红帽 1 号柜:灰姑娘 2 号柜:白雪公主
  • 取东西就报柜号:lst[0] = "小红帽",lst[2] = "白雪公主";
  • 从后往前数也能报:lst[-1] 就是最后一个柜子(白雪公主);
  • append()在队伍末尾再加一个柜子pop()搬走最后一个柜子里的东西

记牢:第一个柜子是 0 号,不是 1 号!这是新手最容易踩的坑。

③ 添加与删除

方法作用示例
append(x)在末尾添加一个元素b.append(50)
insert(i, x)在指定位置插入b.insert(1, 15)
extend(列表)批量追加(连接)b.extend([60, 70])
remove(x)删除第一个值为 x 的元素b.remove(20)
pop()删除并返回末尾元素last = b.pop()
pop(i)删除并返回指定位置元素b.pop(0)
del b[i]删除指定位置元素del b[0]
clear()清空所有元素b.clear()

④ 排序、连接与遍历

Python
nums = [5, 2, 8, 1]
nums.sort()          # 原地升序排序 → [1, 2, 5, 8]
nums.sort(reverse=True)  # 降序 → [8, 5, 2, 1]
a = [1, 2]; b = [3, 4]
print(a + b)         # 连接 → [1, 2, 3, 4](不改变 a、b)

for x in nums:       # 遍历列表
    print(x)
易错点:① 索引越界会报 IndexError;② sort() 是原地修改,sorted(列表) 返回新列表不修改原列表;③ list("abc") 是把字符串拆成字符列表。

2.2 元组 tuple10 分

① 概念与元组/列表的异同

对比项列表 list元组 tuple
符号方括号 [ ]圆括号 ( )
是否可变可变(可增删改)不可变(创建后不能修改)
常用场景需要频繁修改的数据固定不变的数据、保护数据
生活小例子:写了名字的便利贴 vs 冷冻保鲜盒

列表想成能擦改的便利贴:想改就改,想撕一张加一张都行。

元组想成贴了密封条的冷冻保鲜盒:东西放进去就封死了,不能再换

  • 比如一年 12 个月的名称、一个星期 7 天的名字——这些是固定的,用元组正合适;
  • 万一真想"改"怎么办?只能重新做一个新的保鲜盒(用拼接生成新元组),旧的那个永远不变。

口诀:列表像便利贴(随便改),元组像保鲜盒(封死不拆)。

② 声明、访问与遍历

Python
t = (1, 2, 3, 4)
print(t[0])      # 1
print(t[-1])     # 4
print(len(t))    # 4
t2 = (5,)        # 只有一个元素必须加逗号!
for x in t:      # 遍历
    print(x)

# 元组不可修改:
# t[0] = 100     # 报错:TypeError

③ 变通修改元组 / 删除元组

  • 元组本身不能改,但可以通过拼接生成新元组t = t + (5,)
  • 如果元组里有列表,该列表元素仍可修改;
  • 删除整个元组用 del t(不能再使用 t)。
易错点:① 单元素元组 (5) 只是数字 5,必须写成 (5,);② 元组不可变,任何试图修改元组元素的操作都会报错;③ 元组也支持切片、索引、in 判断。

2.3 字符串 str15 分

① 概念、声明与访问

字符串是字符的序列,用引号括起来,不可变。可以像列表一样用索引访问、切片、遍历。

Python
s = "hello"
print(s[0])      # 'h'
print(s[-1])     # 'o'
print(len(s))    # 长度:5
print(s[1:4])    # 切片 → 'ell'
for ch in s:     # 遍历每个字符
    print(ch)
生活小例子:切生日蛋糕(切片)

字符串切片想成切蛋糕s[起:止] 就像"从第 起 块切到第 止 块(但不包括第 止 块)":

一块写着 "hello" 的蛋糕,分成 5 小块:h(0) e(1) l(2) l(3) o(4)

  • s[1:4] = 从 1 号切到 3 号(不含 4 号)→ "ell"
  • s[:2] = 从开头切到 1 号 → "he"
  • s[2:] = 从 2 号一直切到末尾 → "llo"
  • s[::-1] = 倒着切,从最后一块往前 → "olleh"(反转!)。

口诀:含头不含尾,忘了止点切到底,步长 -1 就反转。

② 分割、组合、替换、格式化

方法作用示例结果
split(分隔符)按分隔符分割成列表"a,b,c".split(",")['a','b','c']
join(列表)把列表拼成字符串"-".join(["a","b"])"a-b"
replace(旧, 新)替换"abc".replace("b","x")"axc"
strip()去掉首尾空白" hi ".strip()"hi"
upper()/lower()转大写/小写"aB".upper()"AB"
count(x)统计出现次数"aaa".count("a")3

③ 格式化输出

Python
name = "小明"; score = 95
# 方式一:% 格式化
print("姓名:%s,成绩:%d" % (name, score))
# 方式二:format()
print("姓名:{},成绩:{}".format(name, score))
# 方式三:f-string(最推荐)
print(f"姓名:{name},成绩:{score}")
# 三种都输出:姓名:小明,成绩:95

④ 转义字符

转义符含义转义符含义
\n换行\t制表符(Tab)
\\反斜杠本身\' / \"单/双引号
易错点:① 字符串不可变,s[0] = "x" 会报错;② split 结果永远是列表;③ + 是拼接,* 是重复("ab"*3 → "ababab")。

2.4 字典 dict10 分

① 概念与声明

字典用花括号 {} 表示,由若干“键:值”对(key: value)组成,通过来查找对应的。键必须是不可变类型(如字符串、数字、元组)。

Python
d = {}                  # 空字典
stu = {"name": "小明", "age": 10, "score": 95}
print(stu["name"])      # 用键访问 → 小明
print(len(stu))         # 键值对个数:3
print("age" in stu)     # True:判断是否有某个键
生活小例子:翻电话号码本查电话

字典想成学校发的电话号码本:本子上记的是"谁"(键)的"号码"(值)。

想查小明的电话,你直接翻到"小明"那一栏就读出号码了——不用从头一页页找!这就是字典比列表的原因。

  • 查号码:stu["name"] 像"翻到 name 这一栏";
  • 记新号码:stu["newkey"] = 新值 像"本子上没这个人?那就新加一行";
  • 划掉号码:del stu["key"] 像"把这一行撕掉";
  • 怕查不到报错?用 get():像"先翻翻看有没有,没有就给你张便利贴写上'不存在'"。

一句话:列表靠"位置"找,字典靠"名字"找。

② 追加元素与删除元素

Python
stu = {"name": "小明"}
stu["age"] = 10          # 追加:键不存在则新增
stu["score"] = 95
print(stu)               # {'name':'小明','age':10,'score':95}

del stu["score"]         # 删除指定键
print(stu)               # {'name':'小明','age':10}
score = stu.pop("age")   # 删除并返回对应值 → 10

# 常用方法
print(stu.keys())        # 所有键
print(stu.values())      # 所有值
print(stu.items())       # 所有(键,值)对
print(stu.get("name", "不存在"))  # get() 找不到返回默认值,不报错

③ 遍历字典

Python
stu = {"name": "小明", "age": 10}
for k in stu:            # 遍历键
    print(k, stu[k])
for k, v in stu.items(): # 遍历键值对
    print(k, v)
易错点:① 直接 stu["不存在键"] 会报 KeyError,建议用 get();② 字典的键不能重复(重复会覆盖);③ len() 得到的是键值对个数。

2.5 流程控制34 分

① 单分支 / 二分支 / 多分支

Python
# 单分支:只判断一次
if score >= 60:
    print("及格")

# 二分支:if...else
if score >= 60:
    print("及格")
else:
    print("不及格")

# 多分支:if...elif...else(从上到下依次判断)
if score >= 90:
    print("优秀")
elif score >= 60:
    print("及格")
else:
    print("不及格")

② for 循环

Python
# 遍历 range(n):0 ~ n-1
for i in range(5):       # 0,1,2,3,4
    print(i)

# range(起, 止, 步长)
for i in range(1, 10, 2):   # 1,3,5,7,9
    print(i)

# 累加求和经典题
total = 0
for i in range(1, 101):  # 1 加到 100
    total += i
print(total)             # 5050

③ while 循环

Python
# 条件成立就一直循环
n = 1
while n <= 5:
    print(n)
    n += 1          # 千万别忘改条件,否则死循环

# 输入若干个数,输入 0 结束(经典)
s = 0
while True:
    x = int(input())
    if x == 0:
        break       # 跳出循环
    s += x
print("总和", s)

④ break 与 continue

语句作用
break立即终止整个循环(跳出循环体)
continue跳过本次循环,进入下一次迭代
Python
for i in range(1, 6):
    if i == 3:
        continue     # i=3 时跳过,不打印
    print(i)         # 输出 1 2 4 5

for i in range(1, 6):
    if i == 3:
        break        # i=3 时终止整个循环
    print(i)         # 只输出 1 2
生活小例子:吃食堂的三种情况

for 想成食堂阿姨打饭,一份一份来

  • for 循环:像"这一排同学一个一个轮着打饭",打完全部人才结束;
  • while 循环:像"只要饭盆里还有饭,阿姨就继续打"——条件不满足才停
  • continue:像"轮到小红,她说我不吃茄子,阿姨跳过她,继续给下一个打饭"(跳过本次,不结束);
  • break:像"广播说食堂马上关门!阿姨立刻收摊,后面的人都不打了"(直接结束整个循环)。

区别记牢:continue 是"跳过一个人",break 是"整队解散"。

死循环警告:while 循环必须保证条件最终会变为 False,否则程序卡死(如忘写 n += 1)。

2.6 计算思维10 分

二级要求能编写二分支、多分支结构程序;能编写含循环、中断(break/continue)及条件语句的程序。综合题示例:

Python
# 例:统计 1~100 中能被 3 整除的数的个数与和
count = 0
total = 0
for i in range(1, 101):
    if i % 3 == 0:      # 条件:能被 3 整除
        count += 1
        total += i
print("个数:", count)   # 33
print("总和:", total)   # 1683

# 例:输入成绩判断等级(多分支)
score = int(input())
if score >= 90: grade = "优秀"
elif score >= 80: grade = "良好"
elif score >= 70: grade = "中等"
elif score >= 60: grade = "及格"
else: grade = "不及格"
print(grade)

2.7 二级模拟题讲解模拟题

考纲未附二级样题,以下为贴合考点的模拟题。

1. 执行 lst = [3, 1, 2] 后,再执行 lst.sort(),lst 的值是?单选列表
A. [3,1,2]B. [1,2,3]C. [3,2,1]D. 报错
答案:B
sort() 默认升序原地排序,[3,1,2] → [1,2,3]
2. 元组与列表最大的区别是?单选元组
A. 元组用圆括号,列表用方括号B. 元组不可变,列表可变C. 元组不能存数字D. 列表不能遍历
答案:B
最本质区别是不可变性:元组创建后不可修改。
3. "a-b-c".split("-") 的结果是?单选字符串
A. "abc"B. ["a","b","c"]C. "a-b-c"D. "abc"-"abc"
答案:B
split() 按分隔符把字符串切成列表
4. 字典 d = {"a": 1, "b": 2},执行 d["c"] = 3 后字典有几个键值对?单选字典
A. 2B. 3C. 4D. 报错
答案:B
"c" 不存在时赋值即新增,变成 3 个键值对。
5. 下面哪个语句可以终止整个 while 循环?单选流程控制
A. continueB. breakC. passD. exit
答案:B
break 终止整个循环;continue 只跳过本次。
6. 判断:列表 lst 中可以同时存储数字和字符串。判断列表
答案:正确
列表可存放任意混合类型数据。
7. 判断:t = (1) 创建了一个包含 1 的元组。判断元组
答案:错误
(1) 就是整数 1,要写成 (1,) 才是单元素元组。
8. 编程题:输入 n 个数,求它们的和与平均值(保留 1 位小数)。编程流程控制
参考程序:
n = int(input("请输入个数:"))
s = 0
for i in range(n):
    x = float(input())
    s += x
print("和:", s)
print("平均:", round(s / n, 1))
解析:先输入个数 n,再用 for 循环累加,最后 round(值, 1) 保留 1 位小数。
3

三级 · 算法入门

编码数制 · 推导式 · 解析/枚举/排序算法 · 核心函数
能力目标:算法思维,会 Debug 排序算法 32 分(重点) 枚举算法 18 分 核心函数 20 分(69 个常用函数) 3 道编程题

3.1 编码与数制10 分

① 常见数制

数制基数使用的数字示例
二进制 Binary20, 11010 = 十进制 10
八进制 Octal80~717 = 十进制 15
十进制 Decimal100~9255
十六进制 Hex160~9, A~FFF = 十进制 255

② 进制转换方法

其他进制 → 十进制:按权展开相加。二进制 1010 = 1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8+0+2+0 = 10
十进制 → 其他进制:除基取余,倒序排列。十进制 13 转二进制:13÷2 余 1,6÷2 余 0,3÷2 余 1,1÷2 余 1 → 倒序得 1101
生活小例子:二进制就是"开关灯"

二进制为什么只有 0 和 1?因为电脑只会"开"和"关"——1 = 灯亮,0 = 灯灭

就像楼道里的 4 盏灯,每盏代表一个"位",从右往左分别是 1、2、4、8 分:

8 分灯4 分灯2 分灯1 分灯

想表示 10 分,就把"8 分灯"和"2 分灯"打开:1 0 1 0(亮=1,灭=0)→ 1010

再教你个手指妙招:把手指当灯,1=伸直、0=弯下,从大拇指到小指是 1、2、4、8、16 分。想表示 13,就弯下代表 2 分的手指:1101!考试时能当场"比划"出来。

③ Python 数制转换函数

函数作用示例结果
bin(n)转二进制(返回字符串,带 0b)bin(10)'0b1010'
oct(n)转八进制(带 0o)oct(15)'0o17'
hex(n)转十六进制(带 0x)hex(255)'0xff'
int(s, base)把 base 进制的字符串转十进制int("1010", 2)10
Python
print(bin(10))          # 0b1010
print(oct(15))          # 0o17
print(hex(255))         # 0xff
print(int("1010", 2))   # 10(二进制字符串 → 十进制)
print(int("ff", 16))    # 255
print(int("17", 8))     # 15
易错点:① bin/oct/hex 返回的是字符串且带前缀 0b/0o/0x;② int("...", base) 的 base 是原字符串的进制,转换目标是十进制;③ 二级还要求掌握二进制与八进制、十六进制互转(可先转十进制再转目标进制)。

3.2 推导式12 分

① 列表推导式

用一行代码快速生成列表:[表达式 for 变量 in 可迭代对象 if 条件]

Python
# 生成 0~9 的平方列表
squares = [x * x for x in range(10)]
print(squares)   # [0,1,4,9,16,25,36,49,64,81]

# 加 if 条件:只保留偶数
evens = [x for x in range(20) if x % 2 == 0]
print(evens)     # [0,2,4,...,18]

# 双层循环
pairs = [x * y for x in range(1, 4) for y in range(1, 4)]
print(pairs)     # [1,2,3,2,4,6,3,6,9]
生活小例子:糖果加工厂流水线

推导式想成糖果加工厂的流水线,一行代码就是一条传送带:

[x * x for x in range(10)] 读作:

for x in range(10):原料一颗颗送来(0~9) x * x:加工机把每颗糖"平方"一下 [ ]:包装盒收集成品

如果加个 if,就像质检员拦下不合格的糖[x for x in range(20) if x % 2 == 0] 只放行偶数糖。

用大白话翻译 [表达式 for 变量 in 序列 if 条件]对序列里的每一个,加工一下,符合条件才收进盒子。

② 字典推导式

Python
# 生成 {数字: 平方} 字典
d = {x: x * x for x in range(1, 5)}
print(d)   # {1:1, 2:4, 3:9, 4:16}

③ 生成器推导式

把方括号换成圆括号就得到生成器(惰性求值,节省内存,用 list() 可转列表):

Python
g = (x * 2 for x in range(5))   # 生成器对象,不是列表
print(list(g))   # [0, 2, 4, 6, 8]

④ 序列解包

Python
a, b, c = (1, 2, 3)      # 元组解包
print(a, b, c)           # 1 2 3
a, b = b, a              # 交换两个变量
first, *rest = [10, 20, 30, 40]
print(first, rest)       # 10 [20, 30, 40]

⑤ 切片

切片语法 序列[起:止:步长](含头不含尾):

Python
lst = [0, 1, 2, 3, 4, 5]
print(lst[1:4])     # [1, 2, 3](含 1 不含 4)
print(lst[:3])      # [0, 1, 2](从头到 3)
print(lst[::2])     # [0, 2, 4](步长 2)
print(lst[::-1])    # [5, 4, 3, 2, 1, 0](倒序)
s = "hello"
print(s[::-1])      # "olleh"(字符串反转)
易错点:① 列表推导式是 [],生成器推导式是 (),集合推导式是 {}(去重);② 切片“含头不含尾”;③ lst[::-1] 是反转的经典写法。

3.3 解析算法8 分

① 概念与特征

解析算法是指通过已知的条件和公式,一步步推导出答案的算法。它不“猜”,而是按数学关系直接计算。适合有明确公式、递推关系的问题。

明确已知量与公式 按公式逐步计算 得到唯一结果

② 典型例子

Python
# 例 1:已知圆的半径求面积(公式解析)
import math
r = 5
area = math.pi * r * r
print(round(area, 2))      # 78.54

# 例 2:等差数列求和:首项 1,公差 2,前 n 项和
n = 10
a1 = 1
an = a1 + (n - 1) * 2      # 通项公式
s = n * (a1 + an) // 2     # 求和公式
print(s)                   # 100

# 例 3:分段计费(出租车)——按区间公式计算
dist = 8.0                 # 公里
if dist <= 3:
    fee = 8
else:
    fee = 8 + (dist - 3) * 2.4
print(round(fee, 1))       # 20.0
判断技巧:题目给的是“公式/数量关系,求具体数值”→ 解析算法;题目是“找满足条件的所有可能”→ 枚举算法。
生活小例子:数学应用题与"找零钱"的区别

解析算法想成做数学应用题:题目给你公式和条件,你照着算就行——比如"已知每本书 12 元,买 5 本,一共多少钱?"直接 12 × 5 得出答案,不用挨个试。

枚举算法是"挨个试":比如"口袋里有 10 元、5 元、1 元硬币,怎么凑出 13 元?"你得一枚枚试不同的组合,直到凑出来为止。

记不住?看题目关键字:有公式、有数量关系 → 解析(算出来);要找"有哪些/多少种可能" → 枚举(试出来)。

3.4 枚举算法18 分

① 概念与特征

枚举算法(也叫穷举)把问题的所有可能情况一一列举出来,逐个检验是否满足条件。特征是范围明确、逐一验证

确定枚举范围 逐个枚举(for) if 判断条件 输出满足者
生活小例子:翻遍抽屉找钥匙

枚举算法想成丢了三天的钥匙,一个一个抽屉翻

  • 确定范围:家里有 5 个抽屉,从 1 号翻到 5 号;
  • 逐个检查:翻到 1 号抽屉,看钥匙在不在?不在就翻 2 号……
  • 找到就停:在 4 号抽屉找到钥匙,马上拿出来,后面的 5 号就不用翻了。

枚举的特点就是不偷懒、一个不漏地试,但要保证:范围别漏(每个抽屉都翻到)、条件别错(看清楚是不是钥匙)。

鸡兔同笼就是"挨个猜鸡有几只,再验证脚数对不对",猜对了就赢!

② 典型例子

Python
# 例 1:求 100~999 的所有水仙花数(各位立方和等于自身)
for n in range(100, 1000):
    a = n // 100          # 百位
    b = n // 10 % 10      # 十位
    c = n % 10            # 个位
    if a**3 + b**3 + c**3 == n:
        print(n)          # 153 370 371 407

# 例 2:鸡兔同笼。笼中 35 个头、94 只脚,求鸡兔各几只
for ji in range(36):      # 枚举鸡的数量
    tu = 35 - ji          # 兔由总数确定
    if ji * 2 + tu * 4 == 94:
        print("鸡", ji, "兔", tu)   # 鸡 23 兔 12

# 例 3:百钱买百鸡(经典三重枚举)
for x in range(0, 21):      # 公鸡 5 元
    for y in range(0, 34):  # 母鸡 3 元
        z = 100 - x - y     # 小鸡 1/3 元
        if 5*x + 3*y + z/3 == 100 and z % 3 == 0:
            print(x, y, z)
易错点:① 枚举要保证范围不漏不重;② 判断条件要写全(如百钱百鸡中 z 必须能被 3 整除);③ 尽可能缩小范围提高效率。

3.5 排序算法32 分

三级要求掌握 冒泡、选择、插入 三种排序算法的特征与程序实现。这是三级分值最高的重点。

① 冒泡排序

思路:相邻元素两两比较,大的往后“冒”。每轮结束后,最大的数被放到最后;n 个元素共需 n-1 轮,每轮比较次数递减。

Python
def bubble_sort(a):
    n = len(a)
    for i in range(n - 1):          # 轮数
        for j in range(n - 1 - i):  # 每轮比较范围逐步缩小
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]  # 交换

lst = [5, 3, 8, 1, 2]
bubble_sort(lst)
print(lst)   # [1, 2, 3, 5, 8]
生活小例子:体育课按身高排队

冒泡排序想成体育老师让全班按从矮到高排队

老师让相邻的两位同学比较身高,高的往后站,然后一对一对往后比过去。

第一轮走完,全班最高的人被"挤"到了队伍最后面,就像水里的气泡冒到水面——这就是"冒泡"!

第二轮再从排头开始比较,但最后一个已经排好不用管了,所以每轮少比一次。几轮下来,队伍就整整齐齐了。

口诀:相邻比大小,大的往后跑,一轮沉底一个,n-1 轮就排好。

② 选择排序

思路:每一轮从剩余元素中选出最小值,放到当前轮次的起始位置。

Python
def select_sort(a):
    n = len(a)
    for i in range(n - 1):
        min_idx = i                # 假设当前最小
        for j in range(i + 1, n):  # 找真正的最小值下标
            if a[j] < a[min_idx]:
                min_idx = j
        a[i], a[min_idx] = a[min_idx], a[i]  # 放到 i 位置

lst = [5, 3, 8, 1, 2]
select_sort(lst)
print(lst)   # [1, 2, 3, 5, 8]
生活小例子:老师点名挑最矮的

选择排序想成体育老师一个个点名挑人排队:

  • 第一轮:老师从全班里找出最矮的同学,让他站到第 1 位;
  • 第二轮:在剩下的人里再找出最矮的,站到第 2 位;
  • ……一直挑到只剩最后一个人,队伍就排好了。

和冒泡的区别:冒泡是"两两比较、慢慢挪",选择是"直接点名挑最小的、一次到位",所以选择排序的交换次数更少。

口诀:每轮挑最小,站到最前面。

③ 插入排序

思路:像整理扑克牌。把当前元素与前面已排好的部分从后往前比较,找到合适位置插入。

Python
def insert_sort(a):
    for i in range(1, len(a)):
        key = a[i]                 # 当前要插入的元素
        j = i - 1
        while j >= 0 and a[j] > key:
            a[j + 1] = a[j]        # 大的往后移
            j -= 1
        a[j + 1] = key             # 插入合适位置

lst = [5, 3, 8, 1, 2]
insert_sort(lst)
print(lst)   # [1, 2, 3, 5, 8]
生活小例子:抓扑克牌理牌

插入排序想成你打扑克时一张张抓牌、边抓边理

  • 手里已经抓了几张牌,是从小到大排好的(3、5、8);
  • 又抓到一张 1,你会把 1 和手里的牌从后往前比:8?大,往后挪;5?大,往后挪;3?大,往后挪……
  • 直到遇到比它小的,就把 1 到那个位置前面(最前面)。

整个过程就是:手里的牌始终保持有序,新牌从后往前找位置插入。数据基本有序时,这种方法特别快。

口诀:手里牌已排序,新牌从后往前插。

④ 三种排序对比

算法核心思想稳定性适用特点
冒泡排序相邻两两比较,大数后移稳定简单直观,适合理解
选择排序每轮选最小值放前面不稳定交换次数少
插入排序前面有序,新元素插入合适位置稳定数据基本有序时效率高
记忆口诀:冒泡“相邻比较、大的沉底”;选择“每轮挑最小”;插入“像理扑克牌、边拿边插”。

3.6 核心内置函数20 分

考纲要求掌握 69 个常用函数中的大多数,按类别整理如下:

① 数学运算类(7 个)

Python
abs(-5)         # 绝对值 → 5
divmod(7, 2)    # 商和余数 → (3, 1)
max(1, 5, 3)    # 最大值 → 5
min([4, 2, 8])  # 最小值 → 2
round(3.14159, 2)  # 四舍五入保留 2 位 → 3.14
sum([1, 2, 3])  # 求和 → 6
pow(2, 3)       # 幂 → 8

② 类型转换类(14 个)

Python
bool(0)         # False
int("10")       # 10
float("2.5")    # 2.5
str(100)        # "100"
ord("A")        # 字符转 ASCII → 65
chr(65)         # ASCII 转字符 → 'A'
bin(5)          # '0b101'
oct(9)          # '0o11'
hex(15)         # '0xf'
tuple([1,2])    # (1, 2)
list("ab")      # ['a', 'b']
dict([("a",1)]) # {'a': 1}
set([1,1,2])    # {1, 2}(去重)
list(enumerate(["a","b"]))  # [(0,'a'),(1,'b')]

③ 序列操作类(6 个)

Python
all([1, 2, 3])      # 全真才 True → True
any([0, 1])         # 有真就 True → True
list(filter(lambda x: x > 2, [1,2,3,4]))  # [3, 4] 过滤
list(map(lambda x: x*2, [1,2,3]))         # [2,4,6] 映射
next(iter([1,2]))   # 取下一个 → 1
sorted([3,1,2])     # 返回新排序列表 → [1,2,3](不修改原列表)

④ 对象 / 交互 / 文件操作类

Python
type(10)        # <class 'int'>
format(3.14, ".2f")  # "3.14"(格式化)
print("hi")     # 输出
input("输入:")  # 输入
f = open("a.txt", "w")  # 打开文件(五级详讲)
易错点:sorted() 返回新列表、不改原列表;list.sort() 原地修改、返回 None;② ord()/chr() 一对一相反;③ set() 自动去重但无序

3.7 计算思维综合

三级要求综合应用解析、枚举、排序等算法,会进行冒泡、选择、插入排序的算法分析(如判断某轮排序后的中间状态)。

Python
# 综合题:统计一句话中各字母出现次数(字典+枚举)
text = "hello python"
count = {}
for ch in text:
    if ch.isalpha():          # 只统计字母
        count[ch] = count.get(ch, 0) + 1
print(count)

# 综合题:冒泡排序第 1 轮后的结果(手算)
# 原列表 [5, 3, 8, 1, 2]
# 第 1 轮:5,3 交换 → [3,5,8,1,2];5,8 不换;8,1 换 → [3,5,1,8,2];8,2 换 → [3,5,1,2,8]
# 第 1 轮结束:最大的 8 已到最后 → [3, 5, 1, 2, 8]

3.8 三级模拟题讲解模拟题

1. int("1101", 2) 的值是?单选编码数制
A. 13B. 1101C. 12D. 1101 的十进制写法
答案:A
二进制 1101 = 1×8 + 1×4 + 0×2 + 1×1 = 13。
2. [x for x in range(10) if x % 2 == 1] 的结果是?单选推导式
A. [0,2,4,6,8]B. [1,3,5,7,9]C. [0,1,2,...,9]D. 报错
答案:B
条件 x % 2 == 1 保留奇数。
3. 鸡兔同笼:35 个头、94 只脚。用枚举算法,下列哪项是实现的核心步骤?单选枚举算法
A. 用公式直接算出兔的数量B. 枚举鸡的数量并用条件判断验证C. 随机猜一个数D. 只枚举兔的数量,鸡不用枚举
答案:B
枚举算法的核心是穷举所有可能 + 条件验证
4. 列表 [5, 3, 8, 1, 2] 冒泡排序第 1 轮结束后是?单选排序算法
A. [3, 5, 1, 2, 8]B. [1, 2, 3, 5, 8]C. [3, 1, 2, 5, 8]D. [5, 3, 8, 1, 2]
答案:A
第 1 轮冒泡把最大值 8 冒到最后:[3,5,1,2,8]。注意只排完一轮,其余未完全有序。
5. ord("A")chr(97) 的结果分别是?单选核心函数
A. 65 与 'a'B. 'A' 与 97C. 97 与 'A'D. 'a' 与 65
答案:A
ord() 字符→编码,'A'=65;chr() 编码→字符,97='a'。
6. 判断:sorted() 会修改原列表的顺序。判断核心函数
答案:错误
sorted() 返回新列表,不改原列表;list.sort() 才原地修改。
7. 判断:冒泡排序每一轮结束后,最大的数一定到达最终位置。判断排序算法
答案:正确
升序冒泡中,每轮会把当前未排序部分的最大值“冒”到最后,该轮最大数即归位。
8. 编程题:统计 1~1000 中所有“完数”(因子之和等于自身,如 6=1+2+3)。编程枚举算法
参考程序:
for n in range(2, 1001):
    s = 0
    for i in range(1, n):
        if n % i == 0:
            s += i
    if s == n:
        print(n)   # 6 28 496
解析:枚举 n,内层枚举所有小于 n 的因子并累加,判断因子和是否等于自身。
4

四级 · 函数与模块

函数概念 · 自定义函数 · 递归递推 · 分治算法 · 算法效率 · 库与模块
能力目标:模块编程思维,代码复用 自定义函数 26 分 + 递归递推 22 分 分治算法 18 分 3 道编程题

4.1 函数概念16 分

① 什么是函数

函数是把一段可重复使用的代码封装起来,给它一个名字,需要时调用即可。好处:避免重复代码、程序结构清晰、便于维护。

生活小例子:妈妈的拿手菜谱

函数想成妈妈抄在卡片上的拿手菜谱

  • 写一次,用无数次:菜谱写好一次,今天做、明天做、来客人也照着做——不用每次重新发明;
  • 参数 = 配料的量def 番茄炒蛋(鸡蛋几个, 番茄几个),做 2 人份传 (2, 1),做 5 人份传 (5, 3),菜谱不用改,改配料就行;
  • return = 端上桌的菜:菜做好后端出来给大家吃(把结果返回给调用者);
  • 默认参数:菜谱写着"盐少许(默认 1 勺)",你不特别说就按默认放。

所以:写函数 = 写菜谱,调用函数 = 照着做菜。这就是"代码复用"。

② 函数参数

  • 形参(形式参数):定义函数时的参数,如 def add(a, b) 中的 a、b;
  • 实参(实际参数):调用时传入的具体值,如 add(3, 5) 中的 3、5;
  • 默认参数:定义时给默认值 def f(x, y=10),调用时可不传 y;
  • 关键字参数:调用时用 f(y=1, x=2) 指名道姓传参,顺序可打乱。

③ 函数返回值

return 把结果返回给调用者;没有 return 的函数返回 None

④ 变量作用域

类型定义位置作用范围
全局变量函数外部整个程序都能用
局部变量函数内部只在函数内有效,函数结束即消失
Python
x = 10                # 全局变量
def demo():
    y = 20            # 局部变量
    print(x)          # 函数内可以读取全局变量 → 10
    print(y)          # 20
demo()
# print(y)            # 报错!y 在函数外不可见

def change():
    global x          # 声明要修改全局变量
    x = 100
change()
print(x)              # 100(全局变量被修改了)
生活小例子:教室里的东西 vs 学校里的东西

变量作用域想成教室里和学校里的物品

  • 全局变量 = 学校公共区域的物品(比如操场上的旗杆):全校哪个班都能用,走到哪儿都看得到;
  • 局部变量 = 你们班教室里的粉笔:只在你们班教室里有效,出了教室门就找不到——就像函数结束,局部变量就"消失"了;
  • 你在教室里能看见操场的旗杆(函数内能读取全局变量),但想搬动旗杆得先跟校长打招呼(要修改全局变量必须先 global 声明)。

一句话:教室里的东西出不了教室,学校里的东西全校都能用。

⑤ 匿名函数 lambda

Python
f = lambda a, b: a + b      # 匿名函数
print(f(3, 5))              # 8
# 常配合 sort 的关键字参数使用
lst = [("b", 2), ("a", 3), ("c", 1)]
lst.sort(key=lambda t: t[1])  # 按第二个元素排序
print(lst)                  # [('c',1),('b',2),('a',3)]

4.2 自定义函数26 分

① 定义与调用

Python
# 定义:def 函数名(参数):  缩进为函数体
def add(a, b):
    result = a + b
    return result

# 调用
s = add(3, 5)
print(s)              # 8

# 无返回值示例(只做事)
def greet(name):
    print("你好,", name)
greet("小明")          # 你好, 小明
print(greet("小明"))   # 无 return,打印 None

② 带默认参数 / 关键字参数

Python
def power(x, n=2):      # n 有默认值 2
    return x ** n
print(power(3))         # 9(用默认 n=2)
print(power(3, 3))      # 27
print(power(x=2, n=5))  # 32(关键字参数,顺序可换)

③ 函数解决实际问题的例子

Python
def is_prime(n):        # 判断素数
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def sum_digits(n):      # 求各位数字之和
    return sum(int(ch) for ch in str(n))

print(is_prime(17))     # True
print(sum_digits(123))  # 6
易错点:① 函数体内要修改全局变量必须先 global 声明;② return 之后的代码不会执行;③ 一个函数可返回多个值(本质是元组):return a, b

4.3 递归与递推22 分

① 递归的概念

递归:函数调用自身。必须有两个要素:

  • 递归出口(边界条件):什么时候停止,否则无限递归报 RecursionError
  • 递归体:把大问题拆成更小的同类问题。
生活小例子:俄罗斯套娃排队报数

递归想成俄罗斯套娃:打开一个大娃,里面有个小一号的娃,再打开,里面又有一个更小的娃……直到最小的那个娃,再也打不开了——那个"打不开的小娃"就是递归出口

另一个好懂的例子:教室里最后一排同学想知道自己排第几

  • 他问前面同学:"你是第几个?" 前面同学又问再前面……
  • 一直问到第一排:第一排说"我是第 1 个"(这就是出口,不用再问了!);
  • 然后答案一个个传回来:第 2 排 = 1+1 = 2,第 3 排 = 2+1 = 3……最后传回给最后一排。

阶乘 fact(n) = n × fact(n-1) 就是这个道理:先一路问下去,问到出口,再一路算回来。注意!没有出口(没人知道自己是第 1 个)就会一直问下去——那就是死循环,程序会报错。

Python
# 求 n!(阶乘):n! = n × (n-1)!
def fact(n):
    if n == 0:        # 递归出口
        return 1
    return n * fact(n - 1)   # 递归体
print(fact(5))        # 120

# 斐波那契数列:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)
def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)
print(fib(10))        # 55

② 由递归变递推

递推:从已知的初始项出发,用循环从前往后一步步推出后面的项。递推比递归效率高(递归有大量重复计算)。

Python
# 用递推(循环)求斐波那契第 n 项
def fib_iter(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
print(fib_iter(10))   # 55

# 爬楼梯:每次爬 1 或 2 级,到 n 级有多少种方法
# f(n) = f(n-1) + f(n-2),f(1)=1, f(2)=2
def climb(n):
    if n <= 2:
        return n
    a, b = 1, 2
    for _ in range(3, n + 1):
        a, b = b, a + b
    return b
print(climb(10))      # 89
易错点:① 递归必须有出口;② 递归每调用一次占用一层栈空间,层数太深会溢出;③ 看到“自己调用自己”是递归,看到“循环递推”是递推,二者可相互转换。

4.4 分治算法(对分查找)18 分

① 分治思想

分治:把大问题分成若干小问题分别解决,再合并结果。三级/四级最典型的分治是 对分查找(二分查找)

② 二分查找

前提:序列必须有序。每次取中间元素比较,比中间值大就只查右半,小则查左半,把查找范围每次缩小一半

生活小例子:1~100 猜数字游戏

二分查找想成老师心里想了个 1~100 的数字,你来猜

  • 聪明的你每次都说"大了还是小了?",然后砍掉一半范围;
  • 先猜 50:老师说"小了"→ 排除 1~50,只剩 51~100;
  • 再猜 75:老师说"大了"→ 只剩 51~74;
  • ……每次都砍一半,最多 7 次就能猜到(因为 2⁷ = 128 > 100)。

傻傻地从 1 挨个猜(顺序查找),最多要猜 100 次!这就是二分查找快 15 倍的秘密。

注意前提:数字必须按顺序排好,否则你"中间砍一半"的方法就失灵了。

Python
def binary_search(a, target):
    low, high = 0, len(a) - 1
    while low <= high:
        mid = (low + high) // 2
        if a[mid] == target:
            return mid        # 找到,返回下标
        elif a[mid] < target:
            low = mid + 1     # 目标在右半
        else:
            high = mid - 1    # 目标在左半
    return -1                 # 未找到

a = [1, 3, 5, 7, 9, 11, 13]
print(binary_search(a, 7))    # 3
print(binary_search(a, 4))    # -1
查找次数估算:n 个有序元素二分查找,最多比较 log₂n 次。n=1024 时最多查 10 次,远快于顺序查找(最多 1024 次)。

③ 分治排序举例(快排思想)

Python
def quicksort(a):
    if len(a) <= 1:
        return a
    pivot = a[0]                        # 基准
    less = [x for x in a[1:] if x <= pivot]
    greater = [x for x in a[1:] if x > pivot]
    return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([5, 3, 8, 1, 2]))      # [1, 2, 3, 5, 8]
易错点:二分查找前提是有序,无序数据不能直接二分;mid 计算用 (low + high) // 2 防止溢出。

4.5 算法效率6 分

① 时间复杂度和空间复杂度

  • 时间复杂度:衡量算法运行时间随数据规模增长的速度(大 O 表示法);
  • 空间复杂度:衡量算法占用内存随数据规模增长的速度。

② 常见复杂度从快到慢

O(1) 常数< O(log n) 对数< O(n) 线性< O(n log n)< O(n²) 平方
代码结构时间复杂度
普通语句(赋值、输出)O(1)
一次循环(n 次)O(n)
双重循环(n×n)O(n²)
二分查找O(log n)
冒泡/选择/插入排序O(n²)
生活小例子:全班同学两两握手

想知道复杂度 O(n²) 有多慢?想象全班 30 个同学,每两个人都要握一次手

  • 第 1 个同学要和 29 个人握手,第 2 个再和剩下 28 个握……
  • 总共要握 30 × 29 ÷ 2 ≈ 435 次!人数翻一倍到 60 人,握手次数却变成约 1770 次——翻了 4 倍
  • 这就是"平方级增长":数据多一倍,工作量多四倍(n²)。

对比一下:一层循环 O(n) 像"老师挨个点名,30 人点 30 次",人数翻倍点 2 倍次数;O(1) 像"看时钟直接知道时间",数据再多也只要 1 下。所以选算法要挑增长慢的!

记忆要点:一层循环 O(n),两层嵌套 O(n²);排序的冒泡/选择/插入都是 O(n²);二分查找 O(log n)。

4.6 库与模块12 分

① 模块概念与导入方式

  • 模块(module)就是一个 .py 文件,包含函数、类、变量,供其他程序使用;
  • import math:导入整个模块,用 math.sqrt() 调用;
  • from math import sqrt:只导入某个函数,直接 sqrt() 调用;
  • import random as r:起别名。

② math 标准库

Python
import math
print(math.pi)          # 圆周率 3.14159...
print(math.sqrt(16))    # 开方 → 4.0
print(math.floor(3.7))  # 向下取整 → 3
print(math.ceil(3.2))   # 向上取整 → 4
print(math.fabs(-5))    # 绝对值 → 5.0
print(math.pow(2, 3))   # 幂 → 8.0

③ random 标准库

Python
import random
print(random.random())          # [0, 1) 的随机小数
print(random.randint(1, 10))    # [1, 10] 的随机整数(含两端)
print(random.randrange(0, 10, 2))  # 0~9 之间的随机偶数
print(random.choice(["a", "b", "c"]))  # 随机选一个
lst = [1, 2, 3, 4]
random.shuffle(lst)             # 原地打乱顺序
print(random.sample(range(1, 50), 6))  # 不重复抽 6 个

④ 安装第三方库

pip install 库名 安装(考纲提到 pip、wheel、exe 三种安装方式),如 pip install pandaspip install matplotlib(五级使用)。

易错点:① 导入后才能使用,否则报 NameError;② randint(1,10) 包含 10,而 randrange(1,10) 不包含 10;③ math 里的开方是 sqrt(),Python 内置没有开方运算符。

4.7 四级模拟题讲解模拟题

1. 定义 def f(x, y=5): return x + y,则 f(3) 的结果是?单选自定义函数
A. 8B. 5C. 3D. 报错
答案:A
y 使用默认值 5,3+5=8
2. 递归函数必须具有的两个要素是?单选递归递推
A. 循环和判断B. 递归出口和递归体C. 参数和返回值D. 全局变量和局部变量
答案:B
递归必须能终止(出口)并能自我调用推进(递归体)。
3. 在有序列表 [1,3,5,7,9,11,13] 中二分查找 7,第 1 次比较的是哪个元素?单选分治算法
A. 1B. 7C. 5D. 11
答案:B
共 7 个元素,中间下标 (0+6)//2=3,a[3]=7,正好第一次就找到。
4. 下列哪个代码的时间复杂度是 O(n²)?单选算法效率
A. 一条赋值语句B. 一层 for 循环C. 两层嵌套 for 循环D. 二分查找
答案:C
双层嵌套循环执行约 n×n 次,为 O(n²)。
5. 下列哪个表达式能生成 [1,10] 的随机整数(含 1 和 10)?单选库与模块
A. random.random()B. random.randint(1, 10)C. random.randrange(1, 10)D. random.choice(10)
答案:B
randint(1,10) 两端都含;randrange(1,10) 不含 10;random() 是小数;choice 需传序列。
6. 判断:函数内部定义的变量,函数外部可以直接使用。判断函数概念
答案:错误
局部变量只在函数内有效,外部无法访问。
7. 判断:二分查找对无序列表同样适用。判断分治算法
答案:错误
二分查找前提是列表有序
8. 编程题:用函数实现求 1~n 中所有偶数之和。编程自定义函数
参考程序:
def even_sum(n):
    total = 0
    for i in range(1, n + 1):
        if i % 2 == 0:
            total += i
    return total

print(even_sum(10))   # 2+4+6+8+10 = 30
解析:封装成函数,遍历 1~n 判断偶数累加,return 返回结果。
5

五级 · 数据处理

文件操作 · pandas 数据处理 · matplotlib 可视化 · SQLite 数据库
能力目标:数据意识与思维 文件操作 26 分 + 数据库 20 分 计算思维(编程题)30 分 3 道编程题

5.1 文件操作26 分

① 文件编码与文件类型

  • 文本文件:纯文字,如 .txt,用 open() 直接读写;
  • 二进制文件:图片、音频、视频等,读写需用 "rb" / "wb" 模式;
  • 编码:常见 UTF-8、GBK。读写中文建议指定 encoding="utf-8"

② open() 的模式

模式含义文件不存在时
"r"只读(默认)报错
"w"写入(覆盖原有内容)创建
"a"追加(在末尾添加)创建
"r+"读写报错

③ 读取文件

Python
# 方式一:最规范(with 自动关闭文件)
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()          # 一次读全部
    print(content)

with open("data.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()       # 读成行列表,每行含 \n
    for line in lines:
        print(line.strip())     # strip() 去掉首尾换行

# 方式二:逐行读取(省内存)
f = open("data.txt", "r", encoding="utf-8")
for line in f:
    print(line, end="")
f.close()                       # 记得关闭

④ 写入与追加

Python
# 覆盖写入
with open("out.txt", "w", encoding="utf-8") as f:
    f.write("第一行\n")
    f.write("第二行\n")

# 追加写入(不清空原内容)
with open("out.txt", "a", encoding="utf-8") as f:
    f.write("追加的一行\n")
生活小例子:写作业本和记日记

文件读写想成你的作业本 / 日记本

  • "r" 只读:像"翻开本子看看",不能乱写,本子不存在还会说"找不到"(报错);
  • "w" 写入:像"用新的作业本",把旧内容全部擦掉重写——所以小心,w 会覆盖!
  • "a" 追加:像"在日记本末尾接着写今天的日记",不破坏前面写过的内容
  • with open():像"用完本子顺手合上收进书包",自动帮你 close(),不会忘。

口诀:看用 r,重写用 w,接着写用 a。

⑤ 文件定位(指针)操作

Python
with open("data.txt", "r", encoding="utf-8") as f:
    print(f.tell())     # 当前指针位置
    f.seek(0)           # 把指针移回开头
    print(f.read())

⑥ 一维 / 二维数据的表示与存储

  • 一维数据:列表 [a, b, c],每行一个元素,逐行写入/读取;
  • 二维数据:列表的列表 [[a1,b1],[a2,b2]],常以CSV(逗号分隔)形式存储:每行一条记录,字段间用逗号隔开。
Python
# 把二维数据写入 CSV 文件
data = [["姓名", "成绩"], ["小明", 95], ["小红", 88]]
with open("scores.csv", "w", encoding="utf-8") as f:
    for row in data:
        f.write(",".join(str(x) for x in row) + "\n")

# 读取 CSV 并处理
with open("scores.csv", "r", encoding="utf-8") as f:
    for line in f:
        parts = line.strip().split(",")   # 分割字段
        print(parts)
易错点:"w"覆盖原文件,追加用 "a";② 读文件要防止编码错误,建议带 encoding;③ readlines() 每行带 \n,常用 strip() 清理;④ 用 with open() 可自动关闭文件,避免忘记 close()。

5.2 数据处理 pandas16 分

① 认识 DataFrame

pandas 是 Python 最常用的数据分析库,核心数据结构是 DataFrame(二维表格,类似 Excel)。使用前先 import pandas as pd

生活小例子:会算数的 Excel 成绩表

DataFrame 想成老师电脑里的成绩表(就像 Excel 表格):

  • 一张表有列名(姓名、语文、数学)和一行行数据
  • df["语文"] 像"只看语文这一列";
  • df.mean() 像"点一下自动算出每列平均分";df["数学"].max() 像"找数学最高分";
  • sort_values() 像"按成绩从高到低重新排一下表格"。

pandas 的厉害之处:几百行成绩,它一行代码就能算出平均分、最高分、排序——手算得算一节课,它一眨眼就好。

Python
import pandas as pd
# 用字典创建 DataFrame
df = pd.DataFrame({
    "姓名": ["小明", "小红", "小刚"],
    "语文": [90, 85, 78],
    "数学": [95, 88, 92]
})
print(df)

② 常用统计方法(考纲要求)

方法作用
df.count()非空值个数
df.sum()求和
df.mean()平均值
df.max() / df.min()最大值 / 最小值
df.groupby(列)按列分组后统计
df.sort_values(列)按列排序
df.drop(列)删除列/行
df.append() / df.insert() / df.rename()追加 / 插入 / 重命名
Python
df = pd.DataFrame({"语文": [90, 85, 78], "数学": [95, 88, 92]})
print(df.mean())        # 各列平均值
print(df["语文"].max()) # 语文最高分 → 90
print(df["数学"].sum()) # 数学总分 → 275
print(df.sort_values("数学", ascending=False))  # 按数学降序
print(df.rename(columns={"语文": "Chinese"}))   # 列重命名
易错点:① pandas 要先安装:pip install pandas;② groupby 之后要接统计函数(如 .mean())才有结果;③ 读取 CSV 用 pd.read_csv("文件.csv")

5.3 数据可视化 matplotlib8 分

① 基本绘图流程

Python
import matplotlib.pyplot as plt

# 折线图 plot
x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 5, 3]
plt.plot(x, y)
plt.title("成绩变化")      # 标题
plt.xlabel("月份")        # x 轴标签
plt.ylabel("分数")        # y 轴标签
plt.show()               # 显示

# 柱状图 bar
plt.bar(["一班", "二班", "三班"], [80, 90, 85])
plt.show()

# 横向柱状图 barh
plt.barh(["一班", "二班", "三班"], [80, 90, 85])
plt.show()

# 散点图 scatter
plt.scatter(x, y)
plt.show()

② 常用设置(考纲要求)

函数/参数作用
plt.figure()创建画布
plt.plot()折线图
plt.bar() / plt.barh()柱状图 / 横向柱状图
plt.scatter()散点图
plt.title()标题
plt.xlabel() / plt.ylabel()坐标轴标签
plt.xlim() / plt.ylim()设置坐标轴范围
plt.legend()图例
plt.show()显示图形
Python
plt.figure(figsize=(6, 4))     # 画布大小
plt.plot([1, 2, 3], [1, 4, 9], label="平方", color="red")
plt.legend()                   # 显示图例
plt.xlim(0, 4); plt.ylim(0, 10)
plt.title("y = x²")
plt.show()
易错点:① 记得 plt.show() 才能显示图形;② 折线图用 plot,柱状图用 bar,横向柱状图是 barh,散点图用 scatter;③ label 要与 legend() 配合。

5.4 SQLite 数据库20 分

① 什么是 SQLite

SQLite 是一个轻量级嵌入式数据库,Python 内置 sqlite3 模块,无需安装。数据存储在单个 .db 文件中。

② 基本操作流程

connect() 连接 cursor() 创建游标 execute() 执行 SQL fetch 取数据 commit 提交 / close 关闭
Python
import sqlite3

# 1. 连接数据库(不存在则自动创建)
conn = sqlite3.connect("school.db")

# 2. 创建游标
cur = conn.cursor()

# 3. 执行 SQL:建表
cur.execute("""CREATE TABLE IF NOT EXISTS student(
    id INTEGER PRIMARY KEY,
    name TEXT,
    score INTEGER)""")

# 插入数据
cur.execute("INSERT INTO student(name, score) VALUES('小明', 95)")
cur.execute("INSERT INTO student(name, score) VALUES('小红', 88)")
conn.commit()          # 4. 提交事务(写操作必须 commit)

# 5. 查询
cur.execute("SELECT * FROM student")
print(cur.fetchone())     # 取一条 → (1, '小明', 95)
cur.execute("SELECT * FROM student")
print(cur.fetchall())     # 取全部 → [(1,'小明',95),(2,'小红',88)]
cur.execute("SELECT * FROM student")
print(cur.fetchmany(1))   # 取指定条数

# 6. 关闭
cur.close()
conn.close()

③ 游标对象常用方法

方法作用
execute(sql)执行一条 SQL 语句
fetchone()取查询结果的第一条
fetchmany(n)取 n 条
fetchall()取全部结果(列表)
close()关闭游标
Python
# 条件查询 / 排序
cur.execute("SELECT * FROM student WHERE score >= 90")
print(cur.fetchall())
cur.execute("SELECT name FROM student ORDER BY score DESC")
print(cur.fetchall())   # 按成绩降序
易错点:① 增删改(写操作)后必须 commit(),否则不生效;② 用完要 close() 游标和连接;③ fetch 系列方法把“读取指针”向前移动,重复调用可能取不到数据(可重新 execute)。

5.5 计算思维30 分

五级的编程题(30 分)要求综合解决文件操作、数据处理、数据可视化、数据库处理等相关生活问题。典型综合流程:

Python
# 综合示例:读取成绩文件 → 用 pandas 统计 → 画图
import pandas as pd
import matplotlib.pyplot as plt

# 1. 读文件(假设 scores.csv 有 姓名,语文,数学 三列)
df = pd.read_csv("scores.csv", encoding="utf-8")

# 2. 数据处理
print("平均分:")
print(df.mean())                    # 各科平均
top = df.sort_values("数学", ascending=False)
print("数学最高:", df["数学"].max())

# 3. 可视化
plt.bar(df["姓名"], df["语文"], label="语文")
plt.title("语文成绩对比")
plt.xlabel("姓名"); plt.ylabel("分数")
plt.legend()
plt.show()

# 4. 写入数据库
import sqlite3
conn = sqlite3.connect("scores.db")
df.to_sql("score", conn, if_exists="replace", index=False)
conn.close()

5.6 五级模拟题讲解模拟题

1. 用 open("a.txt", "w") 打开文件后写入,若 a.txt 已有内容,会怎样?单选文件操作
A. 追加到末尾B. 覆盖原内容C. 报错D. 不写入
答案:B
"w" 模式会清空并覆盖原文件;追加要用 "a"
2. pandas 中计算某列平均值的正确写法是?单选数据处理
A. df.avg()B. df.mean()C. df.average()D. df.mid()
答案:B
pandas 用 mean() 求平均值,没有 avg/average。
3. 下列哪个是绘制柱状图的语句?单选数据可视化
A. plt.plot()B. plt.bar()C. plt.scatter()D. plt.title()
答案:B
bar=柱状图,plot=折线,scatter=散点,title=标题。
4. SQLite 中,cur.fetchall() 返回的是?单选数据库
A. 一条记录B. 所有查询结果的列表C. 数据库文件D. 游标对象
答案:B
fetchall() 返回所有查询结果(元组的列表)。
5. 对数据库执行 INSERT 后,必须调用哪个方法让修改真正生效?单选数据库
A. fetchone()B. commit()C. close()D. execute()
答案:B
写操作后必须 conn.commit() 提交事务。
6. 判断:以 "r" 模式打开一个不存在的文件会报错。判断文件操作
答案:正确
只读模式打开不存在的文件会抛 FileNotFoundError;"w"/"a" 才会自动创建。
7. 判断:readlines() 返回的每行字符串会包含换行符 \n。判断文件操作
答案:正确
readlines() 按行读取,行尾保留 \n,常用 strip() 清理。
8. 编程题:读取一个文本文件,统计其中共有多少行、多少字符。编程文件操作
参考程序:
with open("data.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
print("行数:", len(lines))
total = sum(len(line.strip()) for line in lines)
print("字符数:", total)
解析:readlines() 得行列表;len() 得行数;遍历统计去掉换行后的字符数。
6

六级 · 类与数据结构

类与对象 · 数组 · 字符串 · 队列 · 栈 · 二叉树
能力目标:面向对象 + 数据结构与算法 类与对象 26 分 + 数组 22 分 队列 17 分 + 栈 8 分 + 二叉树 8 分 3 道编程题

6.1 类与对象26 分

① 面向对象基础概念

  • 类(class):对一类事物的抽象模板,描述属性和行为;
  • 对象 / 实例(instance):根据类创建出来的具体个体;
  • 属性(attribute):对象的数据特征,如名字、年龄;
  • 方法(method):定义在类里的函数,描述对象的行为。
类比:就像“学生”这张设计图纸,对象是照着图纸造出来的“小明”“小红”。图纸上写的“姓名、年龄”是属性,“上课、考试”是方法。
生活小例子:乐高拼装说明书

想成乐高拼装说明书,把对象想成照着说明书拼出来的小汽车

  • 一本说明书,可以拼出无数辆同款小汽车(一个类,可以创建很多对象);
  • 每辆车都有颜色、轮子数这些"属性",也都会跑、转向这些"方法";
  • 你可以改某辆车的颜色(car.color = "红色"),但其他车不受影响
  • 继承(子类)就像在"小汽车说明书"基础上,新出一本"红色跑车说明书":继承了小汽车的所有功能,再加点新功能(比如加装翅膀),不用从头设计。

一句话:类 = 图纸,对象 = 造出来的实物,子类 = 加了新功能的升级版图纸。

② 创建类与类实例

Python
class Student:                 # 定义类
    def __init__(self, name, age):   # 构造方法:创建对象时自动调用
        self.name = name       # 实例属性
        self.age = age
    def introduce(self):       # 定义方法
        print(f"我叫{self.name},今年{self.age}岁")

s1 = Student("小明", 10)       # 创建实例(对象)
s2 = Student("小红", 11)
print(s1.name)                 # 访问属性 → 小明
s1.introduce()                 # 调用方法

③ 创建子类(继承)

Python
class Person:                  # 父类
    def __init__(self, name):
        self.name = name
    def speak(self):
        print(f"{self.name} 在说话")

class Student(Person):         # 子类继承 Person
    def __init__(self, name, grade):
        super().__init__(name) # 调用父类构造方法
        self.grade = grade
    def study(self):
        print(f"{self.name} 上{self.grade}年级")

s = Student("小明", 5)
s.speak()     # 继承的方法 → 小明 在说话
s.study()     # 子类自己的方法
易错点:① 类方法第一个参数必须是 self(代表实例本身);② 构造方法固定叫 __init__;③ 子类通过 super().__init__() 复用父类构造;④ 实例属性用 self.属性名 定义。

6.2 数组22 分

① 数组的概念与特性

数组是一组连续存储、类型相同的元素集合,通过下标(索引)访问。Python 中最常用列表模拟数组(列表可存不同类型,但用法一致)。

② 基本操作:创建、访问、插入、删除、合并

Python
# 创建
arr = [10, 20, 30, 40, 50]
# 访问
print(arr[0], arr[-1])       # 10 50
# 修改
arr[2] = 99
# 插入
arr.insert(1, 15)            # [10, 15, 20, 99, 40, 50]
arr.append(60)               # 末尾追加
# 删除
arr.pop()                    # 删末尾
arr.remove(20)               # 删除值为 20 的元素
del arr[0]                   # 按下标删除
# 合并
b = [1, 2]
print(arr + b)               # 合并成新列表
arr.extend(b)                # 原地合并

# 二维数组(矩阵)
m = [[1, 2, 3], [4, 5, 6]]
print(m[0][1])               # 第 1 行第 2 列 → 2

③ 数组常用操作:求和、找最大、反转

Python
arr = [3, 7, 1, 9, 5]
print(sum(arr))              # 和 → 25
print(max(arr))              # 最大 → 9
print(min(arr))              # 最小 → 1
print(arr[::-1])             # 反转 → [5, 9, 1, 7, 3]
# 手动求最大(不用内置函数)
mx = arr[0]
for x in arr:
    if x > mx:
        mx = x
print(mx)                    # 9
易错点:① 数组下标从 0 开始,越界报 IndexError;② 插入用 insert(位置, 值),删除值用 remove,按下标用 del 或 pop。

6.3 字符串(六级深化)19 分

二级已学字符串基础,六级要求综合应用,掌握创建、访问、插入与删除(通过切片/拼接实现,因字符串不可变)及常见综合问题。

Python
s = "hello"
# 插入(字符串不可变,需拼接产生新字符串)
s2 = s[:2] + "X" + s[2:]     # 在位置 2 插入 'X' → "heXllo"
# 删除(切片跳过)
s3 = s[:1] + s[2:]           # 删除位置 1 的字符 → "hllo"
# 反转
print(s[::-1])               # "olleh"
# 统计
print(s.count("l"))          # 2
print(s.find("l"))           # 第一次出现下标 → 2
# 判断
print(s.isdigit())           # 是否全数字 → False
print("h" in s)              # True
# 综合:判断回文字符串
def is_palindrome(t):
    return t == t[::-1]
print(is_palindrome("abba"))  # True
print(is_palindrome("hello")) # False
易错点:字符串不可变,所谓“插入/删除”其实是用切片 + 拼接生成新字符串。

6.4 队列 Queue17 分

① 概念与特性

队列是一种先进先出(FIFO,First In First Out)的线性结构,像排队买票:先来的人先离开。

生活小例子:食堂打饭要排队

队列想成食堂门口打饭的队伍

  • 入队 enqueue:小明、小红、小刚依次排在队伍后面(append 加到队尾);
  • 出队 dequeue:食堂阿姨永远先给排在队伍最前面的人打饭(pop(0) 从队首取);
  • 先来的先走:这就是"先进先出"。谁都不能插队到最前面!

生活中的队列:超市结账、游乐场排队、打印机排队打印,都是先到先服务。口诀:进在队尾,出在队首。

队首 ← 出队 dequeue 队尾 ← 入队 enqueue

② 用列表实现队列

Python
queue = []                # 空队列
# 入队:加到队尾
queue.append("A")
queue.append("B")
queue.append("C")
print(queue)              # ['A', 'B', 'C']
# 出队:从队首取(pop(0))
first = queue.pop(0)      # 取 'A'
print(first, queue)       # A ['B', 'C']
# 查看队首(不删除)
print(queue[0])           # 'B'
# 判断是否为空
print(len(queue) == 0)    # False

③ 用 collections.deque 实现(效率更高)

Python
from collections import deque
q = deque()
q.append("A")        # 入队
q.append("B")
print(q.popleft())   # 出队 → 'A'
print(q)             # deque(['B'])

④ 约瑟夫环(经典队列题)

Python
# n 个人围成一圈,从 1 开始报数,报到 k 的人出列,求最后留下的人
def josephus(n, k):
    q = list(range(1, n + 1))
    idx = 0
    while len(q) > 1:
        idx = (idx + k - 1) % len(q)
        q.pop(idx)
    return q[0]
print(josephus(5, 3))   # 4
易错点:队列先进先出:入队 append 在队尾,出队 pop(0) 在队首。别和栈(后进先出)搞混。

6.5 栈 Stack8 分

① 概念与特性

栈是一种后进先出(LIFO,Last In First Out)的线性结构,像叠盘子:后放的先取。

生活小例子:叠盘子拿盘子 + 手机"撤销"键

想成厨房里叠起来的一摞盘子

  • 洗好一个盘子就放最上面(入栈 append);
  • 要用盘子时,只能先拿最上面那个(出栈 pop)——最后放上去的反而最先被拿走
  • 你不可能从一摞盘子中间抽一个出来!这就是"后进先出"。

最贴近生活的例子是手机上的"撤销"键:你打了一串字,撤销时总是先撤掉最后打的那个字——这就是栈在偷偷工作!

口诀:进在顶、出在顶,后放先拿。

栈顶 ← 入栈 push / 出栈 pop 栈底(固定)

② 用列表实现栈

Python
stack = []            # 空栈
stack.append(1)       # 入栈 push
stack.append(2)
stack.append(3)
print(stack)          # [1, 2, 3]
top = stack.pop()     # 出栈 pop → 3(后进先出)
print(top, stack)     # 3 [1, 2]
print(stack[-1])      # 查看栈顶 → 2(不删除)
print(len(stack) == 0)  # 判断空栈

③ 经典应用:括号匹配、进制转换

Python
# 括号匹配:() [] {}
def match(s):
    stack = []
    pairs = {")": "(", "]": "[", "}": "{"}
    for ch in s:
        if ch in "([{":
            stack.append(ch)      # 左括号入栈
        elif ch in ")]}":
            if not stack or stack.pop() != pairs[ch]:
                return False
    return len(stack) == 0
print(match("([{}])"))   # True
print(match("([)]"))     # False

# 十进制转二进制(除 2 取余,倒序输出 → 栈)
def dec2bin(n):
    stack = []
    while n > 0:
        stack.append(n % 2)
        n //= 2
    return "".join(str(x) for x in reversed(stack))
print(dec2bin(13))   # 1101
易错点:栈后进先出:append 入栈、pop 出栈,都在同一端(栈顶)。与队列方向相反。

6.6 二叉树8 分

① 树与二叉树的概念

  • :非线性结构,有且仅有一个根节点,其余节点分为若干互不相交的子树;
  • 二叉树:每个节点最多有两个子树(左子树、右子树)的树;
  • 根节点 / 叶子节点:最顶层节点 / 没有子节点的节点;
  • 深度(层数):从根开始算,根的深度为 1(或 0,依教材而定)。
生活小例子:画一棵"家族树"

二叉树想成老师让画的"家族树"

  • 爷爷在最顶上,是根节点
  • 爷爷下面有两个儿子(爸爸、叔叔),每个儿子最多再有两个孩子——每个节点最多两个孩子,这就是"二叉树"名字的由来;
  • 没有孩子的"表弟表妹"们就是叶子节点

遍历又是什么?就像你要按顺序拜访家族里每个人,有三种"拜访规矩":

  • 前序(根左右):先拜访爷爷,再从左儿子一家往下,最后右儿子一家——"先大人后小孩";
  • 中序(左根右):先把左边的亲戚拜访完,再拜访爷爷,再拜访右边——"先左、再中、后右";
  • 后序(左右根):先把孩子辈拜访完,最后才轮到爷爷——"先小孩后大人"。

口诀:看"根"排第几:根在前=前序,根在中间=中序,根在最后=后序。

② 二叉树的性质(记忆要点)

  • 第 i 层(从 1 起)最多有 2^(i-1) 个节点;
  • 深度为 k 的二叉树最多有 2^k - 1 个节点;
  • 叶子节点数 = 度为 2 的节点数 + 1(n0 = n2 + 1)。

③ 用列表/类表示二叉树并遍历

Python
# 用类表示二叉树节点
class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

# 构建一棵树:       1
#                  / \
#                 2   3
#                / \
#               4   5
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)

# 前序遍历(根左右):1 2 4 5 3
def preorder(n):
    if n:
        print(n.val, end=" ")
        preorder(n.left)
        preorder(n.right)
# 中序遍历(左根右):4 2 5 1 3
def inorder(n):
    if n:
        inorder(n.left)
        print(n.val, end=" ")
        inorder(n.right)
# 后序遍历(左右根):4 5 2 3 1
def postorder(n):
    if n:
        postorder(n.left)
        postorder(n.right)
        print(n.val, end=" ")

preorder(root); print()
inorder(root); print()
postorder(root); print()
遍历方式顺序上例结果
前序遍历根 → 左 → 右1 2 4 5 3
中序遍历左 → 根 → 右4 2 5 1 3
后序遍历左 → 右 → 根4 5 2 3 1
易错点:① 二叉树每个节点最多两个孩子(可有 0、1、2 个);② 三种遍历的“根”位置决定名称:根在前=前序,根在中=中序,根在后=后序;③ 递归遍历注意出口(节点为空就返回)。

6.7 六级模拟题讲解模拟题

1. 类中创建对象时自动调用的方法名是?单选类与对象
A. __main__B. __init__C. __new__ 只用于重载D. def init
答案:B
构造方法固定叫 __init__,创建实例时自动调用。
2. 队列的进出规则是?单选队列
A. 后进先出 LIFOB. 先进先出 FIFOC. 随机存取D. 两边都能进
答案:B
队列是先进先出;栈才是后进先出。
3. 栈执行 append(1)、append(2)、pop() 后,栈中剩下?单选
A. [1]B. [2]C. [1, 2]D. []
答案:A
后进先出:pop 弹出 2,栈剩 [1]。
4. 深度为 3 的二叉树最多有多少个节点?单选二叉树
A. 3B. 7C. 8D. 6
答案:B
最多 2³-1 = 7 个节点(1+2+4)。
5. 中序遍历的顺序是?单选二叉树
A. 根左右B. 左根右C. 左右根D. 根右左
答案:B
前序=根左右,中序=左根右,后序=左右根。
6. 判断:Python 的列表可以直接当作数组、栈、队列来使用。判断数据结构
答案:正确
列表灵活,append/pop 当栈,append/pop(0) 当队列。
7. 判断:二叉树每个节点可以有任意多个子节点。判断二叉树
答案:错误
二叉树每个节点最多 2 个子节点。
8. 编程题:用类实现一个“计数器”,支持加一、当前值、归零。编程类与对象
参考程序:
class Counter:
    def __init__(self):
        self.value = 0
    def add(self):
        self.value += 1
    def get(self):
        return self.value
    def reset(self):
        self.value = 0

c = Counter()
c.add(); c.add(); c.add()
print(c.get())    # 3
c.reset()
print(c.get())    # 0
解析:属性 value 存状态,add/get/reset 三个方法分别实现“加一、读取、归零”。