把 input() 想成邮递员:它只会送来写满字(数字)的纸条。纸条上的"12"只是两个文字符号,不是能算数的数字。
你想做加法,就得先拿 int() 这台翻译机把纸条上的文字"12"翻译成真正的数字 12。不翻译直接相加,就是在"拼接纸条":"12" + "5" 变成 "125",而不是 17!
所以口诀是:要算数,先 int()!
依据《青少年软件编程(Python)等级考试大纲(2026 年修订版)》整理。全册共六大等级,从编程基础入门到数据结构与算法,逐级递进、能力叠加。每个知识点均配有详细讲解、代码示例、易错点提示,并尽量结合真题/模拟题讲解。
六个等级之间呈现逐级递进、能力叠加的关系:
| 等级 | 能力描述 | 核心知识点 |
|---|---|---|
| 一级 | 熟悉编程环境,具备编写顺序与单分支结构的简单程序的基本编程能力 | 简单数学运算与 Turtle 库 |
| 二级 | 掌握核心数据类型的概念与操作,具备编写顺序、分支、循环结构的简单程序的基本编程能力 | 核心数据类型:列表、元组、字符串、字典、集合 |
| 三级 | 具有基本的算法思维,具备以算法为目标的基本编程能力 | 推导式,常用内置函数,算法:解析、枚举、排序,数制转换 |
| 四级 | 具有初步的模块编程思维,具备以函数形式代码复用的基本编程能力 | 自定义函数,递归与分治,查找,模块及常用标准库 |
| 五级 | 具有初步的数据意识与思维,具备以数据处理为目的的基本编程能力 | 简单文件读写、数据统计与可视化、数据库 |
| 六级 | 掌握简单的数据结构概念与操作,具备选择合理的数据结构与算法编程处理问题的基本编程能力 | 类与对象,简单数据结构与算法:数组、字符串、队列、栈、二叉树 |
评价采用上机考试形式,由客观题(单选、多选、判断)和编程题两部分构成。
| 等级 | 客观题占比 | 编程题占比 | 核心考察重点 |
|---|---|---|---|
| 一级至二级 | 约 60%~70% | 约 40%~30% | 基础语法、流程控制、核心数据类型的基本操作 |
| 三级至四级 | 约 60%~70% | 约 40%~30% | 算法思维、函数使用、模块应用、代码调试能力 |
| 五级至六级 | 约 50%~70% | 约 50%~30% | 数据处理、系统设计、数据结构与算法综合应用能力 |
| 等级 | 知识体系(分值) | 单选 | 判断 | 编程 | 合计 |
|---|---|---|---|---|---|
| 一级 | 编程环境(10) | 6 | 4 | 0 | 50/20/30 |
| 编程基础(26) | 10 | 12 | 4 | ||
| Turtle 库(24) | 14 | 4 | 6 | ||
| 数学运算(30) | 18 | 0 | 12 | ||
| 计算思维(10) | 2 | 0 | 8 | ||
| 二级 | 列表(21) | 14 | 2 | 5 | |
| 元组(10) | 6 | 4 | 0 | ||
| 字符串(15) | 6 | 4 | 5 | ||
| 字典(10) | 8 | 2 | 0 | ||
| 流程控制(34) | 16 | 8 | 10 | ||
| 计算思维(10) | 0 | 0 | 10 | ||
| 三级 | 编码数制(10) | 6 | 4 | 0 | |
| 推导式(12) | 8 | 4 | 0 | ||
| 解析算法(8) | 6 | 2 | 0 | ||
| 枚举算法(18) | 6 | 2 | 10 | ||
| 排序算法(32) | 8 | 4 | 20 | ||
| 核心函数(20) | 16 | 4 | 0 | ||
| 计算思维(—) | — | — | — | ||
| 四级 | 函数概念(16) | 12 | 4 | 0 | |
| 自定义函数(26) | 12 | 4 | 10 | ||
| 递归与递推(22) | 8 | 4 | 10 | ||
| 分治算法(18) | 6 | 2 | 10 | ||
| 算法效率(6) | 4 | 2 | 0 | ||
| 库与模块(12) | 8 | 4 | 0 | ||
| 五级 | 文件操作(26) | 20 | 6 | 0 | |
| 数据处理(16) | 10 | 6 | 0 | ||
| 数据可视化(8) | 6 | 2 | 0 | ||
| 数据库(20) | 14 | 6 | 0 | ||
| 计算思维(30) | 0 | 0 | 30 | ||
| 六级 | 类与对象(26) | 12 | 4 | 10 | |
| 数组(22) | 8 | 4 | 10 | ||
| 字符串(19) | 10 | 4 | 5 | ||
| 队列(17) | 8 | 4 | 5 | ||
| 栈(8) | 6 | 2 | 0 | ||
| 二叉树(8) | 6 | 2 | 0 |
Python 有多种开发环境(IDE),一级考试要求了解并会使用其中至少一种:
Python 主要有 Python 2 和 Python 3 两大版本方向,目前主流与考试使用 Python 3。Python 2 已停止维护,两者的语法存在差异(例如 Python 2 中 print "hi",Python 3 中必须写 print("hi"))。
>>> 提示符,输入一行代码回车立即执行,适合快速测试。看到 >>> 就代表进入了逐行运行的模式。# 井号开头是单行注释(注释不会被执行)
print("Hello") # 注释也可以写在代码后面
"""
三个双引号或三个单引号
可以写成多行注释
"""
IndentationError;注释用 #,不是 ()、:、/。任何程序都可以拆成三步:输入(用 input() 得到数据)→ 处理(计算/判断)→ 输出(用 print() 显示结果)。
# 输入
name = input("请输入你的名字:")
# 处理(把输入的内容拼成一句话)
message = "你好," + name
# 输出
print(message)
print() 在屏幕上打印文本或数字。字符串要用引号括起来:单引号 '...'、双引号 "..."、三引号 '''...''' / """..."""(三引号可换行)。
print("hello") # 正确:双引号
print('hello') # 正确:单引号
print("""多行
内容""") # 正确:三引号可换行
print(3 + 4) # 正确:打印数字 7
# print"hello" # 错误:漏了括号
input() 返回的永远是字符串!参与数学运算前必须用 int() 或 float() 转换。把 input() 想成邮递员:它只会送来写满字(数字)的纸条。纸条上的"12"只是两个文字符号,不是能算数的数字。
你想做加法,就得先拿 int() 这台翻译机把纸条上的文字"12"翻译成真正的数字 12。不翻译直接相加,就是在"拼接纸条":"12" + "5" 变成 "125",而不是 17!
所以口诀是:要算数,先 int()!
a = input() # a 是字符串,比如 "12"
b = input() # b 是字符串,比如 "5"
print(a + b) # 输出 "125"(字符串拼接!不是 17)
print(int(a) + int(b)) # 输出 17(先转成整数再相加)
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 条规矩:
a = 10 后再 a = 20,a 里只剩 20);int("12") → 12float("3.5") → 3.5str(12) → "12"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'>
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() | 结束绘制,保持窗口打开 |
import turtle # 导入库
turtle.pensize(3) # 画笔粗细
turtle.color("blue") # 画笔蓝色
for i in range(4): # 重复 4 次
turtle.forward(100) # 前进 100
turtle.right(90) # 右转 90 度
turtle.done() # 保持窗口
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() 只清画面、不改海龟位置状态;④ 海龟初始朝向是屏幕右方。| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ | 加 / 字符串拼接 | 35 - 10 / "py"+"thon" | 25 / "python" |
- | 减 | 35 - 10 | 25 |
* | 乘(乘法符号是 *,不是 x) | 30 * 10 | 300 |
/ | 除(结果恒为小数) | 30 / 10 | 3.0 |
// | 整除(取商的整数部分) | 7 // 2 | 3 |
% | 取余(取余数) | 7 % 2 | 1 |
** | 幂(乘方),优先级最高 | 2 ** 3 | 8 |
= 表示“把右边的值赋给左边”。还有复合赋值:+=、-=、*=、/= 等。
a = 10
a += 5 # 等价于 a = a + 5,现在 a = 15
a *= 2 # 等价于 a = a * 2,现在 a = 30
print(a) # 30
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
== | 判断是否相等(注意是两个等号) | 5 == 5 | True |
!= | 判断是否不相等 | 20 != 10 | True |
> | 大于 | 10 > 20 | False |
< | 小于 | 10 < 20 | True |
>= | 大于等于 | 10 >= 10 | True |
<= | 小于等于 | 20 <= 10 | False |
= 是赋值,== 是比较是否相等,二者绝不能混用。比较运算的结果是布尔值 True / False。| 运算符 | 含义 | 说明 |
|---|---|---|
and | 与(且) | 两边都为真才为真;有一边为假(如 0、空),结果为假的那一边 |
or | 或 | 有一边为真就为真;结果为第一个真值 |
not | 非(取反) | not True → False |
0、空字符串、空列表等被视为“假”,其他非零数值视为“真”。
a and b:如果 a 为假,结果是 a;否则结果是 b。
a or b:如果 a 为真,结果是 a;否则结果是 b。0 and 10 → 0;30 and 10 → 10;30 or 10 → 30。想象游乐园门口有三个门卫,你要进门必须回答他们的问题:
所以 0 and 10 就像"0 是假的(没票),后面再说什么都白搭",结果直接是 0。
运算符优先级就像做菜的先后顺序,谁"大"谁先动手:
2 * 3**2 先烧开 3**2=9,再做 2*9;记不住顺序?那就给想先算的加上括号,让"总指挥"帮你搞定!
# 例 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
一级的计算思维,要求能编写顺序执行的程序、能分析简单的逻辑运算和比较运算结果,并会使用这些结果。主要落实在以下两方面:
程序从上到下一行一行执行。经典考题:输入两个数,输出它们的和与积。
a = int(input()) # 输入第 1 个数
b = int(input()) # 输入第 2 个数
print("和是:", a + b)
print("积是:", a * b)
条件成立才执行缩进的代码块。
score = int(input("请输入成绩:"))
if score >= 60:
print("及格") # 只有条件成立才执行
print("程序结束") # 无条件都会执行
以下题目均选自《大纲》附录的一级样题,覆盖编程环境、编程基础、Turtle 库、数学运算、计算思维五大块。点击“查看答案”展开解析。
#;: 用于语句末尾表示代码块开始,/ 是除法。str() 转字符串,int() 转整数,print() 是输出。abc 不是,可以作为变量名。screensize() 是设置画布大小,不属于画笔控制。clear() 只擦除画面,海龟的位置、方向、画笔属性都不变;reset() 才会全部重置。color(a, b) 的第一个参数是画笔颜色,第二个是填充颜色。goto(90,0),再 left(90)。顺序不能颠倒。*;x 是英文字母不是运算符,/ 是除法,# 是注释。35-10=25,然后输出 25。== 是比较是否相等;赋值是单个 =。30 / 10 = 3。注意:虽然结果是 3.0(小数形式),但数值大小是 3。and 两边都为真才为真,0 为“假”,所以直接短路返回左边的假值 0。30 * 10 = 300,300 - 5 = 295。20 != 10 成立,结果为 True。** 优先级最高(括号除外),其次 * / // %,再 + -,比较运算最低。+ 是拼接,不是数学相加,结果是 python2python3。4<3 为 False,所以 4<3 and 1==1 结果为 False;再算 3>4 or False → False or False → False。>>> 是 IDLE 交互模式(命令行模式)的提示符。.py,不是 .idle。int() / float() 转换为数值,例如 int("12") → 12。is 用于判断两个对象是否同一,属于保留字。列表是最常用的可变序列,用方括号 [] 括起来,元素之间用逗号分隔,可以存放任意类型的数据。
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 是最后一个)。
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 = ["小红帽", "灰姑娘", "白雪公主"] 就像:
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() |
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") 是把字符串拆成字符列表。| 对比项 | 列表 list | 元组 tuple |
|---|---|---|
| 符号 | 方括号 [ ] | 圆括号 ( ) |
| 是否可变 | 可变(可增删改) | 不可变(创建后不能修改) |
| 常用场景 | 需要频繁修改的数据 | 固定不变的数据、保护数据 |
把列表想成能擦改的便利贴:想改就改,想撕一张加一张都行。
把元组想成贴了密封条的冷冻保鲜盒:东西放进去就封死了,不能再换!
口诀:列表像便利贴(随便改),元组像保鲜盒(封死不拆)。
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 判断。字符串是字符的序列,用引号括起来,不可变。可以像列表一样用索引访问、切片、遍历。
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 |
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")。字典用花括号 {} 表示,由若干“键:值”对(key: value)组成,通过键来查找对应的值。键必须是不可变类型(如字符串、数字、元组)。
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():像"先翻翻看有没有,没有就给你张便利贴写上'不存在'"。一句话:列表靠"位置"找,字典靠"名字"找。
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() 找不到返回默认值,不报错
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() 得到的是键值对个数。# 单分支:只判断一次
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("不及格")
# 遍历 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
# 条件成立就一直循环
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 | 跳过本次循环,进入下一次迭代 |
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 想成食堂阿姨打饭,一份一份来:
区别记牢:continue 是"跳过一个人",break 是"整队解散"。
n += 1)。二级要求能编写二分支、多分支结构程序;能编写含循环、中断(break/continue)及条件语句的程序。综合题示例:
# 例:统计 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)
考纲未附二级样题,以下为贴合考点的模拟题。
lst = [3, 1, 2] 后,再执行 lst.sort(),lst 的值是?单选列表sort() 默认升序原地排序,[3,1,2] → [1,2,3]。"a-b-c".split("-") 的结果是?单选字符串split() 按分隔符把字符串切成列表。d = {"a": 1, "b": 2},执行 d["c"] = 3 后字典有几个键值对?单选字典"c" 不存在时赋值即新增,变成 3 个键值对。break 终止整个循环;continue 只跳过本次。t = (1) 创建了一个包含 1 的元组。判断元组(1) 就是整数 1,要写成 (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 位小数。| 数制 | 基数 | 使用的数字 | 示例 |
|---|---|---|---|
| 二进制 Binary | 2 | 0, 1 | 1010 = 十进制 10 |
| 八进制 Octal | 8 | 0~7 | 17 = 十进制 15 |
| 十进制 Decimal | 10 | 0~9 | 255 |
| 十六进制 Hex | 16 | 0~9, A~F | FF = 十进制 255 |
1010 = 1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8+0+2+0 = 10。二进制为什么只有 0 和 1?因为电脑只会"开"和"关"——1 = 灯亮,0 = 灯灭!
就像楼道里的 4 盏灯,每盏代表一个"位",从右往左分别是 1、2、4、8 分:
想表示 10 分,就把"8 分灯"和"2 分灯"打开:1 0 1 0(亮=1,灭=0)→ 1010!
再教你个手指妙招:把手指当灯,1=伸直、0=弯下,从大拇指到小指是 1、2、4、8、16 分。想表示 13,就弯下代表 2 分的手指:1101!考试时能当场"比划"出来。
| 函数 | 作用 | 示例 | 结果 |
|---|---|---|---|
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 |
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
int("...", base) 的 base 是原字符串的进制,转换目标是十进制;③ 二级还要求掌握二进制与八进制、十六进制互转(可先转十进制再转目标进制)。用一行代码快速生成列表:[表达式 for 变量 in 可迭代对象 if 条件]
# 生成 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)] 读作:
如果加个 if,就像质检员拦下不合格的糖:[x for x in range(20) if x % 2 == 0] 只放行偶数糖。
用大白话翻译 [表达式 for 变量 in 序列 if 条件]:对序列里的每一个,加工一下,符合条件才收进盒子。
# 生成 {数字: 平方} 字典
d = {x: x * x for x in range(1, 5)}
print(d) # {1:1, 2:4, 3:9, 4:16}
把方括号换成圆括号就得到生成器(惰性求值,节省内存,用 list() 可转列表):
g = (x * 2 for x in range(5)) # 生成器对象,不是列表
print(list(g)) # [0, 2, 4, 6, 8]
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]
切片语法 序列[起:止:步长](含头不含尾):
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] 是反转的经典写法。解析算法是指通过已知的条件和公式,一步步推导出答案的算法。它不“猜”,而是按数学关系直接计算。适合有明确公式、递推关系的问题。
# 例 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 元?"你得一枚枚试不同的组合,直到凑出来为止。
记不住?看题目关键字:有公式、有数量关系 → 解析(算出来);要找"有哪些/多少种可能" → 枚举(试出来)。
枚举算法(也叫穷举)把问题的所有可能情况一一列举出来,逐个检验是否满足条件。特征是范围明确、逐一验证。
把枚举算法想成丢了三天的钥匙,一个一个抽屉翻:
枚举的特点就是不偷懒、一个不漏地试,但要保证:范围别漏(每个抽屉都翻到)、条件别错(看清楚是不是钥匙)。
鸡兔同笼就是"挨个猜鸡有几只,再验证脚数对不对",猜对了就赢!
# 例 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)
三级要求掌握 冒泡、选择、插入 三种排序算法的特征与程序实现。这是三级分值最高的重点。
思路:相邻元素两两比较,大的往后“冒”。每轮结束后,最大的数被放到最后;n 个元素共需 n-1 轮,每轮比较次数递减。
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 轮就排好。
思路:每一轮从剩余元素中选出最小值,放到当前轮次的起始位置。
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]
把选择排序想成体育老师一个个点名挑人排队:
和冒泡的区别:冒泡是"两两比较、慢慢挪",选择是"直接点名挑最小的、一次到位",所以选择排序的交换次数更少。
口诀:每轮挑最小,站到最前面。
思路:像整理扑克牌。把当前元素与前面已排好的部分从后往前比较,找到合适位置插入。
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]
把插入排序想成你打扑克时一张张抓牌、边抓边理:
整个过程就是:手里的牌始终保持有序,新牌从后往前找位置插入。数据基本有序时,这种方法特别快。
口诀:手里牌已排序,新牌从后往前插。
| 算法 | 核心思想 | 稳定性 | 适用特点 |
|---|---|---|---|
| 冒泡排序 | 相邻两两比较,大数后移 | 稳定 | 简单直观,适合理解 |
| 选择排序 | 每轮选最小值放前面 | 不稳定 | 交换次数少 |
| 插入排序 | 前面有序,新元素插入合适位置 | 稳定 | 数据基本有序时效率高 |
考纲要求掌握 69 个常用函数中的大多数,按类别整理如下:
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
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')]
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](不修改原列表)
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() 自动去重但无序。三级要求综合应用解析、枚举、排序等算法,会进行冒泡、选择、插入排序的算法分析(如判断某轮排序后的中间状态)。
# 综合题:统计一句话中各字母出现次数(字典+枚举)
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]
int("1101", 2) 的值是?单选编码数制[x for x in range(10) if x % 2 == 1] 的结果是?单选推导式x % 2 == 1 保留奇数。ord("A") 与 chr(97) 的结果分别是?单选核心函数ord() 字符→编码,'A'=65;chr() 编码→字符,97='a'。sorted() 会修改原列表的顺序。判断核心函数sorted() 返回新列表,不改原列表;list.sort() 才原地修改。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 的因子并累加,判断因子和是否等于自身。函数是把一段可重复使用的代码封装起来,给它一个名字,需要时调用即可。好处:避免重复代码、程序结构清晰、便于维护。
把函数想成妈妈抄在卡片上的拿手菜谱:
def 番茄炒蛋(鸡蛋几个, 番茄几个),做 2 人份传 (2, 1),做 5 人份传 (5, 3),菜谱不用改,改配料就行;所以:写函数 = 写菜谱,调用函数 = 照着做菜。这就是"代码复用"。
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。
| 类型 | 定义位置 | 作用范围 |
|---|---|---|
| 全局变量 | 函数外部 | 整个程序都能用 |
| 局部变量 | 函数内部 | 只在函数内有效,函数结束即消失 |
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(全局变量被修改了)
把变量作用域想成教室里和学校里的物品:
global 声明)。一句话:教室里的东西出不了教室,学校里的东西全校都能用。
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)]
# 定义: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
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(关键字参数,顺序可换)
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。递归:函数调用自身。必须有两个要素:
RecursionError;把递归想成俄罗斯套娃:打开一个大娃,里面有个小一号的娃,再打开,里面又有一个更小的娃……直到最小的那个娃,再也打不开了——那个"打不开的小娃"就是递归出口!
另一个好懂的例子:教室里最后一排同学想知道自己排第几:
阶乘 fact(n) = n × fact(n-1) 就是这个道理:先一路问下去,问到出口,再一路算回来。注意!没有出口(没人知道自己是第 1 个)就会一直问下去——那就是死循环,程序会报错。
# 求 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
递推:从已知的初始项出发,用循环从前往后一步步推出后面的项。递推比递归效率高(递归有大量重复计算)。
# 用递推(循环)求斐波那契第 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
分治:把大问题分成若干小问题分别解决,再合并结果。三级/四级最典型的分治是 对分查找(二分查找)。
前提:序列必须有序。每次取中间元素比较,比中间值大就只查右半,小则查左半,把查找范围每次缩小一半。
把二分查找想成老师心里想了个 1~100 的数字,你来猜:
而傻傻地从 1 挨个猜(顺序查找),最多要猜 100 次!这就是二分查找快 15 倍的秘密。
注意前提:数字必须按顺序排好,否则你"中间砍一半"的方法就失灵了。
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
log₂n 次。n=1024 时最多查 10 次,远快于顺序查找(最多 1024 次)。
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]
(low + high) // 2 防止溢出。| 代码结构 | 时间复杂度 |
|---|---|
| 普通语句(赋值、输出) | O(1) |
| 一次循环(n 次) | O(n) |
| 双重循环(n×n) | O(n²) |
| 二分查找 | O(log n) |
| 冒泡/选择/插入排序 | O(n²) |
想知道复杂度 O(n²) 有多慢?想象全班 30 个同学,每两个人都要握一次手:
对比一下:一层循环 O(n) 像"老师挨个点名,30 人点 30 次",人数翻倍点 2 倍次数;O(1) 像"看时钟直接知道时间",数据再多也只要 1 下。所以选算法要挑增长慢的!
import math:导入整个模块,用 math.sqrt() 调用;from math import sqrt:只导入某个函数,直接 sqrt() 调用;import random as r:起别名。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
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 pandas、pip install matplotlib(五级使用)。
NameError;② randint(1,10) 包含 10,而 randrange(1,10) 不包含 10;③ math 里的开方是 sqrt(),Python 内置没有开方运算符。def f(x, y=5): return x + y,则 f(3) 的结果是?单选自定义函数3+5=8。randint(1,10) 两端都含;randrange(1,10) 不含 10;random() 是小数;choice 需传序列。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 返回结果。"rb" / "wb" 模式;encoding="utf-8"。| 模式 | 含义 | 文件不存在时 |
|---|---|---|
"r" | 只读(默认) | 报错 |
"w" | 写入(覆盖原有内容) | 创建 |
"a" | 追加(在末尾添加) | 创建 |
"r+" | 读写 | 报错 |
# 方式一:最规范(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() # 记得关闭
# 覆盖写入
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,接着写用 a。
with open("data.txt", "r", encoding="utf-8") as f:
print(f.tell()) # 当前指针位置
f.seek(0) # 把指针移回开头
print(f.read())
# 把二维数据写入 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()。pandas 是 Python 最常用的数据分析库,核心数据结构是 DataFrame(二维表格,类似 Excel)。使用前先 import pandas as pd。
把 DataFrame 想成老师电脑里的成绩表(就像 Excel 表格):
df["语文"] 像"只看语文这一列";df.mean() 像"点一下自动算出每列平均分";df["数学"].max() 像"找数学最高分";sort_values() 像"按成绩从高到低重新排一下表格"。pandas 的厉害之处:几百行成绩,它一行代码就能算出平均分、最高分、排序——手算得算一节课,它一眨眼就好。
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() | 追加 / 插入 / 重命名 |
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"})) # 列重命名
pip install pandas;② groupby 之后要接统计函数(如 .mean())才有结果;③ 读取 CSV 用 pd.read_csv("文件.csv")。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() | 显示图形 |
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() 配合。SQLite 是一个轻量级嵌入式数据库,Python 内置 sqlite3 模块,无需安装。数据存储在单个 .db 文件中。
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() | 关闭游标 |
# 条件查询 / 排序
cur.execute("SELECT * FROM student WHERE score >= 90")
print(cur.fetchall())
cur.execute("SELECT name FROM student ORDER BY score DESC")
print(cur.fetchall()) # 按成绩降序
五级的编程题(30 分)要求综合解决文件操作、数据处理、数据可视化、数据库处理等相关生活问题。典型综合流程:
# 综合示例:读取成绩文件 → 用 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()
open("a.txt", "w") 打开文件后写入,若 a.txt 已有内容,会怎样?单选文件操作"w" 模式会清空并覆盖原文件;追加要用 "a"。mean() 求平均值,没有 avg/average。cur.fetchall() 返回的是?单选数据库conn.commit() 提交事务。readlines() 返回的每行字符串会包含换行符 \n。判断文件操作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() 得行数;遍历统计去掉换行后的字符数。把类想成乐高拼装说明书,把对象想成照着说明书拼出来的小汽车:
car.color = "红色"),但其他车不受影响;一句话:类 = 图纸,对象 = 造出来的实物,子类 = 加了新功能的升级版图纸。
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() # 调用方法
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.属性名 定义。数组是一组连续存储、类型相同的元素集合,通过下标(索引)访问。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
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
二级已学字符串基础,六级要求综合应用,掌握创建、访问、插入与删除(通过切片/拼接实现,因字符串不可变)及常见综合问题。
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
队列是一种先进先出(FIFO,First In First Out)的线性结构,像排队买票:先来的人先离开。
把队列想成食堂门口打饭的队伍:
生活中的队列:超市结账、游乐场排队、打印机排队打印,都是先到先服务。口诀:进在队尾,出在队首。
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
from collections import deque
q = deque()
q.append("A") # 入队
q.append("B")
print(q.popleft()) # 出队 → 'A'
print(q) # deque(['B'])
# 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
栈是一种后进先出(LIFO,Last In First Out)的线性结构,像叠盘子:后放的先取。
把栈想成厨房里叠起来的一摞盘子:
最贴近生活的例子是手机上的"撤销"键:你打了一串字,撤销时总是先撤掉最后打的那个字——这就是栈在偷偷工作!
口诀:进在顶、出在顶,后放先拿。
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) # 判断空栈
# 括号匹配:() [] {}
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
把二叉树想成老师让画的"家族树":
那遍历又是什么?就像你要按顺序拜访家族里每个人,有三种"拜访规矩":
口诀:看"根"排第几:根在前=前序,根在中间=中序,根在最后=后序。
# 用类表示二叉树节点
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 |
__init__,创建实例时自动调用。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 三个方法分别实现“加一、读取、归零”。