字典,元组和集合的内置方法
字典内置方法
1.类型转换
dict()
2.按key进行取值
dic = {
'name': '春游去动物园',
'age': 20,
'hobby': 'play',
}
print(dic['name']) # 春游去动物园
3.修改值
dic['name'] = '秋游去动物园'
print(dic['name']) # 秋游去动物园
4.添加键值对
dic['tel'] = '10086'
print(dic) # {'name': '春游去动物园', 'age': 20, 'hobby': 'play', 'tel': '10086'}
键不存在则是新增一个键值对,如存在就是修改原有的V。
5.字典中键值对的个数
print(len(dic)) # 3
6.成员运算 (key)
print('age' in dic) # True
print('111' in dic) # False
7.删除键值对
通用的删除方法
del dic['name']
print(dic) # {'age': 20, 'hobby': 'play'}
pop弹出
print(dic.pop('name')) # 春游去动物园
print(dic) # {'age': 20, 'hobby': 'play'}
popitem()随机弹出一个
dic.popitem()
print(dic) # {'name': '春游去动物园', 'age': 20}
8.获取所有的key 所有的values 所有的键值对
print(dic.keys()) # dict_keys(['name', 'age', 'hobby'])可以看成是列表
print(dic.values()) # dict_values(['春游去动物园', 20, 'play'])可以看成是列表
print(dic.items()) # dict_items([('name', '春游去动物园'), ('age', 20), ('hobby', 'play')])可以看成是列表套元组
需要了解的内容
1.update更新字典
dic = {'k1': 'jason', 'k2': 'Tony', 'k3': 'JY'}
dic.update({'k1': 'JN', 'k4': 'xxx'})
print(dic) # 键存在则修改 键不存在则新增
2.fromkeys()快速生成字典
dic = dict.fromkeys(['k1', 'k2', 'k3'], [])
print(dic) # {'k1': [], 'k2': [], 'k3': []}
ps:此时所有key的索引都指向同一个空[]。
"""笔试题"""
dic = dict.fromkeys(['k1', 'k2', 'k3'], [])
dic['k1'].append(111) # 三个键指向的是同一个列表
print(dic) # {'k1': [111], 'k2': [111], 'k3': [111]}
3.setdefault()
dic = {'k1': 111, 'k2': 222}
print(dic.setdefault('k3', 333)) # 键不存在则新增键值对 并且有返回结果是新增的v
print(dic.setdefault('k1', '嘿嘿嘿')) # 键存在 则返回对应的值 不做修改
元组内置方法
1.类型转换
支持for循环的数据类型都可以转成元组
print(tuple(11)) # 报错
print(tuple(11.11)) # 报错
print(tuple('春游去动物园'))
print(tuple([11,22,33,44]))
print(tuple({'name':'春游去动物园'}))
print(tuple({11,22,33,44}))
print(tuple(True)) # 报错
2.元组的特性
t = (1, 2, 3, 4)
print(type(t)) # <class 'tuple'>
t1 = (1)
print(type(t1)) # <class 'int'>
t2 = (2.2)
print(type(t2)) # <class 'float'>
t3 = ('春游去动物园')
print(type(t3)) # <class 'str'>
"""当元组内只有一个元素的时候 一定要在元素的后面加上逗号"""
t1 = (1,)
print(type(t1)) # <class 'tuple'>
t2 = (2.2,)
print(type(t2)) # <class 'tuple'>
t3 = ('春游去动物园',)
print(type(t3)) # <class 'tuple'>
"""
一般情况下 我们会习惯性的将所有可以存储多个数据的类型的数据
如果内部只有一个元素 也会加逗号
(1,)
[1,]
{1,}
{'name':'jason',}
"""
3.索引取值,切片操作,间隔
t = (1, 2, 3, 4)
print(t[1])
print(t[0 : 2])
print(t[0 : 2 : -1])
print(t[0 : 2 : 2])
4.统计元组内的元素个数
t = (1, 2, 3, 4)
print(len(t)) # 4
5.成员运算
t = (1, 2, 3, 4)
print(1 in t) # True
6.统计某个元素出现的次数
t = (1, 2, 3, 4)
print(t.count(1)) # 1
7.元组内元素不能"修改": 元组内各个索引值指向的内存地址不能修改
"""
笔试题
tt = (11, 22, 33, [11, 22])
tt[-1].append('heiheihei')
问:执行之后的结果 正确答案选B
A.报错 B.正常添加 C.不知道
tt = (11, 22, 33, [11, 22,'heiheihei'])
"""
tt = (11, 22, 33, [11, 22])
print(id(tt[-1]))
tt[-1].append('heiheihei')
print(id(tt[-1]))
print(tt)
集合内置方法
1.类型转换
# print(set(11)) # 报错
# print(set(11.11)) # 报错
# print(set('春游去动物园'))
# print(set([11,22,33,44]))
# print(set({'name':'春游去动物园'}))
# print(set((11,22,33)))
# print(set(True)) # 报错
"""集合内元素只能是不可变类型"""
2.两大功能
1.去重
集合内不能出现重复的元素(自带去重特性)
如果出现了 会被集合自动去重
2.关系运算
判断两个群体内的差异
去重:
s1 = {1,1,1,1,1,1,2,2,2,2,2,1,2,3,2,2,1,2,3,2,3,4,3,2,3}
print(set(s1)) # {1, 2, 3, 4}
3.关系运算
f1 = {10, 20, 40, 50, 100}
f2 = {0, 10, 30, }
# 1.交集
print(f1 & f2) # {10}
# 2.差集
print(f1 - f2) # {40, 50, 100, 20}
# 3.并集
print(f1 | f2) # {0, 50, 100, 20, 40, 10, 30}
# 4.除了交集,剩下的元素
print(f1 ^ f2) # {0, 100, 40, 50, 20, 30}
垃圾回收机制
"""python底层针对空间的申请和释放都是设计好的 不需要程序员操心"""
垃圾收集机制的原理:
垃圾收集器会按照固定的时间间隔,周期性的找出不再继续使用的变量,然后释放其占用的内存。
1.引用计数
python会将引用计数为0的数据清除
name = 'jason' # jason引用计数为1
a = name # jason引用计数为2
'''内存中数据身上绑定的变量名的个数'''
# ps:还可以了解一下循环引用的情况
2.标记清除
当内存空间即将溢出(满了)的时候 python会自动启动应急机制
停止程序的运行 挨个检查值的引用计数并给计数为0的数据打上标记
然后一次性清理掉
3.分代回收
根据值存在的时间长短 将值划分为三个等级(1,2,3)
等级1 检测机制每隔5s来一次
等级2 检测机制每隔1min来一次
等级3 检测机制每隔5min来一次
今日作业
1.去重列表元素并保留原来的顺序
l = ['a', 'b', 1, 'a', 'a']
第一种:
l = ['a', 'b', 1, 'a', 'a']
l1 = []
for i in l:
if i not in l1:
l1.append(i)
print(l1) # ['a', 'b', 1]
第二种:
l = ['a', 'b', 1, 'a', 'a']
l1 = list(set(l))
l1.sort(key=l.index)
print(l1) # ['a', 'b', 1]
2.去重下列数据字典并保留原来的顺序
# 针对不可变类型,并且保证顺序则需要我们自己写代码实现,例如
l=[
{'name':'lili','age':18,'sex':'male'},
{'name':'jack','age':73,'sex':'male'},
{'name':'tom','age':20,'sex':'female'},
{'name':'lili','age':18,'sex':'male'},
{'name':'lili','age':18,'sex':'male'},
]
l1 = []
for i in l:
if i not in l1:
l1.append(i)
print(l1) # [{'name': 'lili', 'age': 18, 'sex': 'male'}, {'name': 'jack', 'age': 73, 'sex': 'male'}, {'name': 'tom', 'age': 20, 'sex': 'female'}]
3.一.关系运算
有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
pythons={'jason','oscar','kevin','ricky','gangdan','biubiu'}
linuxs={'oscar','tony','gangdan'}
pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
linuxs = {'oscar', 'tony', 'gangdan'}
1. 求出即报名python又报名linux课程的学员名字集合
print(pythons & linuxs) # {'gangdan', 'oscar'}
2. 求出所有报名的学生名字集合
print(pythons | linuxs) # {'biubiu', 'oscar', 'tony', 'gangdan', 'jason', 'kevin', 'ricky'}
3. 求出只报名python课程的学员名字
print(pythons - linuxs) # {'kevin', 'jason', 'biubiu', 'ricky'}
4. 求出没有上这两门课程的学员名字集合
print((pythons | linuxs) - (pythons & linuxs)) # {'ricky', 'tony', 'jason', 'biubiu', 'kevin'}
大作业(学生管理系统)
身份不同,进入不同的界面,同样的可以进行的操作也不同。
管理员账号:可以进行所有操作。(账号:admin 密码:123)
老师:修改密码,修改姓名,查看自己信息,查看所有信息,删除数据(但是不能删除同为老师身份的数据)
学生:修改密码,修改姓名,查看自己信息,查看所有姓名
由于博客园套了别人的皮,一天发两篇随笔会导致有一篇不见,解决办法是第二天手动修改任意一篇随笔的发布时间,让两篇随笔不在一天发布就行了。过两天我会单独发一篇随笔。
# {'账号' : ['密码','姓名','Y/N']}
student_teacher = {
'admin': ['123', '1', 'N'],
'111': ['123', '张三', 'N'],
'222': ['123', '春游去动物园', 'Y'],
'333': ['123', '李四', 'Y'],
'444': ['123', '王五', 'N'],
}
# 获取输入信息,保存到name 和 password
def getInfo():
name = input('请输入用户名: ').strip()
password = input('请输入密码: ').strip()
return name, password
# 注册
def register(student_teacher):
name, password = getInfo()
if name == '' or password.isspace():
print('-----------输入不能为空-----------')
elif name not in student_teacher:
student_name = input('请输入你的姓名:').strip()
is_student = input('是否是学生(Y/N): ').strip().upper()
str = [password, student_name, is_student]
student_teacher[name] = str
print('-----------账号创建成功-----------')
print(student_teacher)
elif name in student_teacher:
print('-----------账号已存在,请重新输入-----------')
# 重新注册
register(student_teacher)
# 更新密码
def updatepassword(student_teacher, name):
psd = input('请输入你想修改的密码: ').strip()
student_teacher[name][0] = psd
print('-----------密码修改成功-----------')
# 跟新姓名
def updatename(student_teacher, name):
nam = input('请输入你想要修改的姓名: ').strip()
student_teacher[name][1] = nam
print('-----------姓名修改成功-----------')
# 查找自己的信息
def select_self(student_teacher, name):
print(
'''
账号:{}
密码:{}
姓名:{}
是否为学生:{}
------------------------------------------------------------------------------
'''.format(name, student_teacher[name][0], student_teacher[name][1], student_teacher[name][2])
)
# 查看所有信息
def select_all(student_teacher):
for i in student_teacher:
if i == 'admin':
continue
print(
'''
账号:{} 密码:{} 姓名:{} 是否为学生:{}
'''.format(i, student_teacher[i][0], student_teacher[i][1], student_teacher[i][2]))
# 删除信息
def delete_info(student_teacher, name):
delete_name = input('请输入要删除学生的姓名或账号:').strip()
if delete_name == name or delete_name == student_teacher[name][1]:
print('-----------不能删除自己!!!!!!!!!!!!!!!-----------')
elif student_teacher[name][2] == 'N' and name != 'admin':
print('-----------不能删除老师-----------')
elif delete_name in student_teacher:
student_teacher.pop(delete_name)
print('-----------删除成功-----------')
else:
for i in student_teacher:
if delete_name == student_teacher[i][1]:
student_teacher.pop(i)
print('-----------删除成功-----------')
break
# 管理员操作
def admin_into(student_teacher, name):
while True:
print(
'''
1.修改已有账号密码
2.修改已有账号姓名
3.修改身份
4.查看所有账号的所有信息
5.删除数据
6.修改密码
7.退出
'''
)
inp = input('请输入要执行的指令: ').strip()
if inp == '1':
nam = input('请输入你想要修改的账号: ').strip()
if nam in student_teacher:
updatepassword(student_teacher, nam)
else:
print('-----------账号不存在-----------')
elif inp == '2':
nam = input('请输入你想要修改的账号: ').strip()
if nam in student_teacher:
updatename(student_teacher, nam)
else:
print('-----------账号不存在-----------')
elif inp == '3':
nam = input('请输入你想要修改的账号: ').strip()
if nam in student_teacher:
is_student = input('修改为(Y/N): ').strip().upper()
student_teacher[nam][2] = is_student
else:
print('-----------账号不存在-----------')
elif inp == '4':
select_all(student_teacher)
elif inp == '5':
nam = input('请输入你想要删除的账号: ').strip()
if nam in student_teacher:
student_teacher.pop(nam)
print('-----------删除成功-----------')
else:
print('-----------账号不存在-----------')
elif inp == '6':
updatepassword(student_teacher, 'admin')
else:
print('-----------再见-----------')
break
# 登入
def login(student_teacher):
name, password = getInfo()
if name in student_teacher and password == student_teacher[name][0]:
print(f'-----------登入成功,欢迎回来 {name} !!!-----------')
# 登入成功后的操作
# 管理员账号可以进行所有操作
if name == 'admin':
admin_into(student_teacher, name)
elif student_teacher[name][2] == 'Y':
while True:
# 进入学生操作界面(可以的操作 修改密码和姓名 查看自己的所有信息 查看所有账号的姓名)
print(
'''
1.修改密码
2.修改姓名
3.查看自己的信息
4.查看所有账号的姓名
5.退出
'''
)
inp = input('请输入要执行的指令: ').strip()
if inp == '1':
updatepassword(student_teacher, name)
elif inp == '2':
updatename(student_teacher, name)
elif inp == '3':
select_self(student_teacher, name)
elif inp == '4':
for i in student_teacher:
if i == 'admin':
continue
print(
'''
姓名:{} 是否为学生:{}
'''.format(student_teacher[i][1], student_teacher[i][2]))
elif inp == '5':
print('-----------再见-----------')
break
else:
print('-----------指令无法识别,请输入正确的指令-----------')
elif student_teacher[name][2] == 'N':
# 进入教师界面
while True:
print(
'''
1.修改密码
2.修改姓名
3.查看自己的信息
4.查看所有账号的所有信息
5.删除学生数据
6.退出
'''
)
inp = input('请输入要执行的指令: ').strip()
if inp == '1':
updatepassword(student_teacher, name)
elif inp == '2':
updatename(student_teacher, name)
elif inp == '3':
select_self(student_teacher, name)
elif inp == '4':
select_all(student_teacher)
elif inp == '5':
delete_info(student_teacher, name)
elif inp == '6':
print('-----------再见-----------')
break
else:
print('-----------指令无法识别,请输入正确的指令-----------')
elif name not in student_teacher:
print('-----------该账号不存在,请先注册-----------')
# 进行注册
register(student_teacher)
else:
print('-----------账号或密码错误,请重新登入-----------')
# 重新登入
login(student_teacher)
# 主程序
while True:
print(
'''
1.登入学生管理系统
2.学生或老师 注册
3.退出系统
'''
)
choice = input('请输入要执行的指令: ').strip()
if choice == '1':
login(student_teacher)
elif choice == '2':
register(student_teacher)
elif choice == '3':
print('-----------欢迎下次使用-----------')
break
else:
print('指令无法识别,请输入正确的指令')