https://pythontutor.com/render.html#mode=display
1 3 5 2n-1
for i in range(1,4): #1 2 3
for j in range(3-i):
print(" ",end="")
for j in range(2i-1):
print("",end="")
print()
for i in range(1,-1,-1): #1,0
for j in range(2-i): # range(0,2) # 0 1
print(" ",end="")
for j in range(2i+1):
print("",end="")
print()
容器:复杂数据类型 列表 、字典、元组
代码存储在硬盘,运行是在内存
栈内存:特点 先进的后出 临时存储的数据 局部变量
堆内存:特点 长期存储的数据 读写速度慢,但稳定(对象、列表)
常量区
小整数常量池
短字符串:没有特殊字符 默认认为可能后期会经常使用 放到常量区(一定是短字符串才会存储在常量区)
字符串、整数 不可变数据类型 一旦创建,不能更改
改了数据,会新开辟一块区域,id也会变 ,旧的值会有垃圾回收机制
全局变量在堆内存中
局部变量在栈内存中
小整数常量池的范围:-5~256
同学的姓名存储下来
Name1=”zhangsan”
Name2=”lisi”
Print(name3)
每个变量只能存储一个数据
容器:同时装多个数据,并且数据类型是不限制的
列表:和其他语言的数组比较像.有序的可变的元素集合 python列表中的元素可以是混合数据类型
列表是一个动态数组。存储的是真实元素的引用、可迭代
List1=[“1”,”2”,”3”,”4”]
List2=[“zhangsan”,12,”wangwu,True]
列表的创建
正向索引从左往右从0开始
逆向索引从右往左从-1开始 -1 -2
列表名[索引下表]
List1=[1,2,3,4,5,6,7,8,9]
切片:获取某一段序列
列表名[start🔚step]
1:4 取左不取右 1 2 3
Print(list1[1:4])
Print(list1[:4]) #0 1 2 3
Print(list1[:] #全切
Print(list1[4:]) #从下标为4的位置开始,一直切到列表的末尾
下标为偶数的元素切出来 注意下标是从0开始的
Print(list1[::2]
Start值加上步长要慢慢接近end值
练习:
list1=[1,2,3,4,5,6,7,8,9]
print(list1[1:4])
print(list1[:4])
print(list1[:])
print(list1[4:])
print(list1[::2])
print(list1[7:4:-2])
修改列表中的元素值
直接赋值的方式
List1[1]=24
Print(id(list1))
Print(list1)
内存地址没有变,值改变了
拼接
List1=[1,2,3]
List2=[“zhangsan”,’list”]
Print(list1+list2)
Print(list13)
Print(“=”30)
Print(“zhangsan” in list2) #前面的元素是否存在后面list2列表中
True #存在
对象:属性和方法
dir() 查看对象的属性和方法
Print(dir(list1))
前后带__不用关注
append在末尾追加单个元素
extend() 在末尾追加多个元素
List1.extend([“zhangsan”,”lisi”,”wangwu”])
Print(list1)
insert() 在指定的位置插入元素
list=[1,2,3]
help(list1.insert)
list1.insert(1,”zhangsansimida”) 在指定的位置插入元素
pop删除指定元素,并且会返回删除的元素
a = list1.pop(2)
Print(a)
Print(list1)
删除的是第一个满足匹配的元素
a = list1.remove(2)
print(a,list1)
clear 把所有列表全部清空
count 统计某个元素出现的次数
Print(list1.count(2))
index 找索引。返回的是第一个满足匹配的元素的下标
Print(list1.index(2))
sort 排序
list1.sort() 默认是升序,加上reverse=True就变成降序了
Print(list1)
加上reverse=True 降序
List1.sort(reverse=True)
Print(list1)
reverse 翻转,倒序了
List1.reverse()
Print(list1)
练习题:
提示:用for循环可以将列表遍历
list1=[3,-5,7,0,-2,9,1]
sum = 0
for循环主要是遍历序列的
for i in list1:
#print(i)
if i >0:
sum+=i
else:
pass
if sum>0:
print(f"正数之和是{sum}")
else:
print(("没有正数"))
list1 = [1,2,2,3,4,4,4,5]
newlist=[] #生成空列表
for i in list1:
if i not in newlist:
newlist.append(i)
\n换行 end="\n" 换行符
print(f"去重前列表:{list1}\n,去重后的列表:{newlist}")
拷贝 copy()
更改数据,备份 列表
错误的,引用指向的是同一个对象
list1=[1,2,3] #list1存放的是内存地址 0x123,相当于把引用拷贝了一份
list2=list1
print(id(list2),id(list1))
list2=list1[:] #属于前拷贝,如果里面有内层列,内层列拷贝的还是内存地址
print(id(list1),id(list2))
深拷贝:创建完全独立的新列表,包括内层的列表也完全独立
List1(1,2,3)
Import copy
List2=copy.deepcopy(list1)
改list2这时,list1不受影响
List2[-1][0]=”南航”
Print(list2)
Print(list1)
Copy.copy 是前拷贝
List2=list1.copy() 也是前拷贝
List2=list1 不叫拷贝,只是把引用地址拷贝了一下
列表推导式
普通方法:
列表推导式最基础的格式:字符串、列表、range生成的序列
练习:
list2=[i for i in range(2,101,2)]
print(list2)
list2=[i+10 for i in [1,2,3,4,5]]
print(list2)
加一个判断,符合的才会输出
list2=[i for i in range(101) if i % 2 ==0]
print(list2)
例子:
numbers=[i for i in [12,3,45,7,8,90,1] if i>10]
print(numbers)
全局的函数
len() 返回列表长度
list1 = [1,2,3,4,5]
print(len(list1))
min() max() 最小值 最大值
print(min(list1))
print(max(list1))
sum 求和
print(sum(list1))
元组:不可变的、有序的数据类型
Tuple1=(1,2,3,4,”zhangsan”)
Print(type(tuple1))
<class ‘tuple’> #tuple就是元组
Tuple1=(“zhangsan”,”list”)
Print(tuple1[0])
元组不支持被修改
Tuple1[0]=”nanhang”
元组结构赋值:
列表强制转换成元组
元组强制转换成列表
集合:特点是无序,没有索引下标、并且内部元素不可重复
{元素1,元素2,......}
Set1={1,2,2,12,12,} #存储其实是无序的
Print(set1) #结果会去重
空集合用set函数
添加:是无序的
添加多个元素:update
删除元素:
如果不存在,报错,discard删除不会报错,remove会报错
pop() 随机删除
clear() 清空
某个元素是否存在于集合当中
Print(“延大” in set1)
结果是True或者False
并集
Set1={1,2,3}
Set2={3,4,5}
Print(set1 | set2) #表示的就是并集
或者
Print(Set1.union(set2))
交集 &
差集
结果是无序的:
字典:是以键值对的方式存储数据的 [120,130,110]
”语文”:110,”数学”:120
字典的外围也是{}
双引号里面是字符串
键一定是一个不可变数据类型
取值:
整数也可以作为键,不一定非得是字符串才能做键
Get取值
添加:
删除:这里面的1是键名
Pop删除,会有提示删除了谁:
Clear() 清空
Keys可以把所有键值遍历
Values可以把所有值取出来
Items 以元组的形式展示出来
字典的遍历:
字典推导式
取值:
列表 元组 集合 字典 :每个的特点
练习题:
大作业:班级成绩数据管理系统
背景:假设你是数学老师,需要管理班级学生的多门数学相关成绩(如单元测验、期中、期末成绩,均为整数)。本作业要求实现成绩的录入、查询、修改、删除及统计分析
一、核心数据结构
用字典列表存储学生信息,所有数据均为整数(无字符串),初始预设3-5条数据,示例:
# 学生数据格式:id为唯一整数标识,scores为整数列表(存储多门成绩)
students = [{"id": 1, "scores": [85, 90, 88]}, # id=1的学生,3门成绩分别为85、90、88{"id": 2, "scores": [79, 82, 91]},{"id": 3, "scores": [95, 89, 92]}
]
二、必做功能需求(共7项)
1. 菜单交互框架
程序启动后,通过print
显示固定菜单(菜单文字为字符串常量,不涉及字符串方法),用户输入1-6的整数选择功能,执行后返回菜单(选6则退出)。菜单格式:
班级成绩管理系统
1. 查看所有学生成绩
2. 添加新学生
3. 修改学生成绩
4. 删除学生
5. 成绩统计分析
6. 退出系统
请输入功能编号(1-6):
2. 查看所有学生成绩
遍历students
列表,按固定格式打印每个学生的id和成绩(用print
直接输出整数和列表,不拼接字符串)。示例输出:
所有学生成绩:
id: 1 成绩: [85, 90, 88]
id: 2 成绩: [79, 82, 91]
id: 3 成绩: [95, 89, 92]
3. 添加新学生
步骤(全程用整数输入,不处理字符串):
- 提示用户输入“新学生id(整数)”;
- 遍历
students
列表,检查该id是否已存在(对比字典的"id"
键值):- 若存在:打印“id已存在,添加失败”;
- 若不存在:提示用户输入“成绩数量(整数,至少1)”,再逐个输入对应数量的成绩(每个成绩为整数),组成
scores
列表,最后创建新字典{"id": 输入id, "scores": 成绩列表}
并添加到students
,打印“添加成功”。
4. 修改学生成绩
步骤:
- 提示用户输入“要修改的学生id(整数)”;
- 遍历
students
列表,检查id是否存在:- 若不存在:打印“未找到该学生,修改失败”;
- 若存在:提示用户输入“新的成绩数量(整数)”,再逐个输入新成绩(整数),替换该学生字典的
"scores"
值,打印“修改成功”。
5. 删除学生
步骤:
- 提示用户输入“要删除的学生id(整数)”;
- 遍历
students
列表,检查id是否存在:- 若不存在:打印“未找到该学生,删除失败”;
- 若存在:用
remove()
方法从students
中删除该学生字典,打印“删除成功”。
6. 成绩统计分析
计算并打印4项结果(均为数值运算,无字符串处理):
- 班级总人数:直接用
len(students)
获取; - 平均总分:
- 先遍历每个学生,计算其
scores
列表的总和(sum(学生["scores"])
),存到“总分列表”; - 用“总分列表的总和 ÷ 总人数”,结果保留1位小数(用
round()
函数);
- 先遍历每个学生,计算其
- 最高分学生:
- 从“总分列表”中找最大值(
max(总分列表)
); - 遍历学生列表,找出所有总分等于该最大值的学生,打印其id和总分;
- 从“总分列表”中找最大值(
- 按总分排名:
- 创建“(id, 总分)”元组列表(如
[(1, 263), (2, 252), ...]
); - 用
sorted()
按“总分从高到低”排序(key=lambda x: x[1]
,reverse=True
); - 按“排名X:id=X,总分=X”格式打印(用
print
直接输出整数)。
- 创建“(id, 总分)”元组列表(如
示例输出:
成绩统计分析:
1. 班级总人数:3
2. 平均总分:261.7
3. 最高分学生(总分276):id=3,总分=276
4. 按总分排名:排名1:id=3,总分=276排名2:id=1,总分=263排名3:id=2,总分=252
7. 退出系统
用户输入6时,打印“系统退出,再见!”,用break
终止程序。
三、进阶功能(选做,加分项)
- 按科目查平均分:提示用户输入“科目序号(从1开始,如1表示第一门成绩)”,遍历所有学生的
scores
列表,提取对应序号的成绩,计算平均分(保留1位小数); - 成绩去重:在“添加”和“修改”功能中,对输入的成绩列表去重(如输入
90, 85, 90
,处理后为[90, 85]
),用集合实现(list(set(成绩列表))
,再按输入顺序调整); - 批量添加学生:提示用户先输入“要添加的学生数量(整数n)”,再依次输入n个学生的id和成绩(每个学生先输id,再输成绩数量和逐个成绩),批量添加(id存在则跳过)。
四、提交要求
- 代码注释:关键逻辑(如查id、统计总分、排序)需加注释,说明操作目的;
- 无字符串方法:代码中不得出现任何字符串对象的方法(如
split()
、len("abc")
、"a" + "b"
等,允许用print
输出字符串常量); - 知识点说明:在代码末尾用注释列出用到的知识点(如“列表的append/remove、字典的键值访问、for/while循环、if条件判断、sum/len/max/sorted函数、算术运算符、比较运算符”等)。
设计思路提示
- 输入处理:所有用户输入均用
int(input())
直接转为整数,避免对输入的字符串做任何处理(如用户输入“3”,直接用int(input())
得到3); - 功能拆分:将每个功能写成函数(如
show_students()
、add_student()
),菜单选择时调用,减少重复代码; - 查id复用:写一个辅助函数
get_student(target_id)
,遍历students
返回对应学生字典(或None
),供添加、修改、删除功能复用; - 排名实现:用
sorted()
对“id-总分”元组列表排序,通过enumerate()
获取排名序号(从1开始)。