Day08课后有感
昨日作业讲解:
# 利用列表编写一个用户注册、登陆程序 # 提示:循环 # 要求:成功一次即可 无需考虑用户冲突等情况 # 1.先定义一个用于存储用户数据的列表 data_list = [] # 定义一个空列表 # 2.循环打印程序的功能 供用户选择执行 while True: # 3.打印程序中所有的功能编号 print(""" 1.注册 2.登陆 3.查看所有用户信息 """) # 4.获取用户想要执行的功能编号 choice = input('请输入功能编号>>>:').strip() # 让用户选择要执行的功能编号 添加.strip()优化代码 # 5.判断用户想要执行的功能 if choice == '1': # 如果用户选择'1' # 6.获取用户的用户名和密码 username = input('username>>>:').strip() # 用户输入用户名 结尾用.strip()优化代码 password = input('password>>>:').strip() # 用户输入密码 结尾用.strip()优化代码 # 6.1.判断用户名不能冲突 for user in data_list: # 'jason|123' 'tony|321' # 6.2.如果考虑密码是用户名 用户名是其他 if username == user.split('|')[0]: # 如果用户密码与列表中用户名冲突 print('用户名已存在') # 打印用户名存在 break else: # 7.将用户名和密码拼接到一起 user_data = f'{username}|{password}' # 把用户输入的数据拼接成字符串 'jason|123' # 8.添加到列表中 data_list.append(user_data) # 将用户数据添加到空列表中 # 9.提示用户注册成功 print(f'{username}注册成功') elif choice == '2': # 如果用户选择'2' # 10.获取用户名和密码 username = input('username>>>:').strip() # 用户输入用户名 结尾用.strip()优化代码 password = input('password>>>:').strip() # 用户输入密码 结尾用.strip()优化代码 # 11.两种判断思路 思路1:先比对用户名 之后比对密码 思路2:直接拼接比对整体结构 user_data1 = f'{username}|{password}' # 12.循环比对 for data in data_list: if user_data1 == data: print('登录成功') break else: print('用户名或密码错误') print('登陆功能') # 打印登陆功能 elif choice == '3': print(data_list) else: # 除以上假设外 print('请输入正确功能编号') # 打印用户提示
# 3.不使用count统计列表中指定元素出现的次数
l1 = [11, 22, 33, 44, 11, 22, 22, 11, 11, 22, 11, 22, 11, 22, 11, 22, 11]
# 获取用户想要统计的元素
target = input('请输入你想要统计的元素>>>:').strip() # 输入你要统计的目标元素
if target.isdigit(): # 判断目标是否是纯数字
target = int(target) # 把目标转成整数的形式
# 定义一个计数器
count = 0
# 循环判断元素是否相等
for i in l1:
if target == i: # 如果用户输入的目标与l1的元素相等
# 计数器自增1
count += 1
# 打印元素出现的次数
print(f'{target}出现了{count}次')
1.类型转换
dict()
字典(巩固知识点):
大括号括起来 内部存放多个元素 元素与元素用逗号隔开 元素是k:v键值对的形式 k是不可变类型 整型 浮点型 字符串(使用频率最高)
v是任意类型
这部分知识点了解一下
res = dict(name='jason', pwd=123, hobby='read') print(res) res1 = dict([['name', 'jason'], ['age', 18], ['hobby', 'run']]) print(res1)
必需要掌握的知识点:都是重点
1.按key取值
d1 = { 'name': 'jason', 'age': 18, 'hobbies': ['play game', 'basketball'] } print(d1['name']) # jason 键存在 print(d1['xxx']) # 键不存在直接报错 """由于以上方式容易报错,所以不推荐使用"""
"涉及到字典取值 更加推荐下面的方式""" print(d1.get('name')) # jason 键存在 print(d1.get('xxx')) # None 键不存在不会报错 而是返回None print(d1.get('xxx', '这个键不存在')) # 第二个参数不写 默认返回None 写了则返回写了的 print(d1.get('name', '这个键不存在')) # 如果键存在 则不需要使用到第二个参数
2.字典修改值
字典和列表内部的本质是差不多的,通过字典的键来管理值的 字典也是可变类型
print(id(d1)) d1['name'] = 'jasonDSB' # 键存在是修改值 print(d1, id(d1))
3.添加键值对
d1['pwd'] = 123 # 键不存在则是新增一个键值对 print(d1)
4.统计键值对中键值的个数
print(len(d1)) # 3
5.成员运算 也只能判断key而已
print('jason' in d1) # False print('name' in d1) # True
6.删除键值对
del d1['name'] # 通用的删除方式 print(d1) # {'age': 18, 'hobbies': ['play game', 'basketball']} print(d1.pop('age')) # 18 弹出 print(d1) # {'name': 'jason', 'hobbies': ['play game', 'basketball']} d1.popitem() # 随机弹出一个(使用频率很低 可以忽略) print(d1)
7.获取所有的键 所有的值 所有的键值对
print(d1.keys()) # dict_keys(['name', 'age', 'hobbies']) 可以看成是列表,一次性拿字典所有的键 print(d1.values()) # dict_values(['jason', 18, ['play game', 'basketball']]) 可以看成是列表 print(d1.items()) # dict_items([('name', 'jason'), ('age', 18), ('hobbies', ['play game', 'basketball'])]) 可以看成是列表套元组 for v in d1.values():
print(v)
"""在python2中上述三个方法就是直接返回一个列表 """
以下知识了解即可
1.update更新字典
dic = {'k1': 'jason', 'k2': 'Tony', 'k3': 'JY'} dic.update({'k1': 'JN', 'k4': 'xxx'})
2.fromkeys()快速生成字典
dic = dict.fromkeys(['k1', 'k2', 'k3'], []) print(dic) # {'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) print(dic.setdefault('k1', '嘿嘿嘿')) # 键存在 则返回对应的值 不做修改 print(dic)
3.setdefault()
dic = {'k1': 111, 'k2': 222} key不存在则新增键值对,并返回新增的value print(dic.setdefault('k3', 333)) # 333 print(dic) # {'k1': 111, 'k2': 222, 'k3': 333} key存在则不做任何修改,并返回其对应的value值 print(dic.setdefault('k1', '嘿嘿嘿')) # 111 print(dic) # {'k1': 111, 'k2': 222, 'k3': 333}
元祖内置方法
可以看成是不可变的列表
1.类型转换
支持for循环的也能被转成元祖
print(tuple(11)) # 报错 print(tuple(11.11)) # 报错 print(tuple('jason')) print(tuple([11,22,33,44])) print(tuple({'name':'jason'})) print(tuple({11,22,33,44})) print(tuple(True)) # 报错
元组的特性
t1 = (11, 22, 33, 44) print(type(t1)) # <class 'tuple'> t2 = (11) print(type(t2)) # <class 'int'> t2 = (11.11) print(type(t2)) # <class 'float'> t2 = ('jason') print(type(t2)) # <class 'str'> """当元组内只有单个元素的时候 一定要在元素的后面加上逗号""" t2 = (11,) print(type(t2)) # tuple t2 = (11.11,) print(type(t2)) # tuple t2 = ('jason',) print(type(t2)) # tuple
做到题吧
t1 = (11, 22, 33, 44, 55, 66)
索引取值 t1 = (11, 22, 33, 44, 55, 66) # (正向取+反向取):只能取,不能改否则报错! print(t1[0]) # 11 print(t1[-1]) # 66
切片操作 t1 = (11, 22, 33, 44, 55, 66) # (顾头不顾尾,步长) print(t1[1:4]) # (22, 33, 44) print(t1[-1:-4:-1]) # (66, 55, 44) print(t1[-4:-1]) # (66, 55, 44) print(t1[1:4:2]) # (22, 44)
长度 t1 = (11, 22, 33, 44, 55, 66) print(len(t1)) # 6
成员运算 t1 = (11, 22, 33, 44, 55, 66) print(11 in t1) # True
统计元素出现的的次数 t1 = (11, 22, 33, 44, 55, 66) print(t1.count(22)) # 1
元组内元素不能"修改"(特殊的) # 元组内各个索引值指向的内存地址不能修改
t1 = (11, 22, 33, 44, 55, 66) t1[0] = 111。# 通过索引的方式管理自己的元素 # 报错:TypeError: 'tuple' object does not support item assignment。
笔试题:
"""
tt = (11, 22, 33, [11, 22])
tt[-1].append('heiheihei')
问:执行之后的结果 正确答案选B
A.报错 B.正常添加 C.不知道
"""
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('jason')) print(set([11,22,33,44])) print(set({'name':'jason'})) print(set((11,22,33))) print(set(True)) # 报错 """集合内元素只能是不可变类型"""
集合的两大功能:
1.去重 集合内不能出现重复的元素(自带去重特性) 如果出现了 会被集合自动去重 2.关系运算 判断两个群体内的差异 eg:共同好友 共同关注 共同点赞
关系运算
f1 = {'jason', 'kevin', 'tony', 'jerry'} # 小李的好友列表 f2 = {'jason', 'tom', 'jerry', 'jack'} # 小王的好友列表 1.求两个人的共同好友 print(f1 & f2) # {'jerry', 'jason'} 2.求小李的单独好友 print(f1 - f2) # {'kevin', 'tony'} 3.求两个人所有的好友 print(f1 | f2) # {'kevin', 'jack', 'tom', 'jason', 'jerry', 'tony'} 4.求两个人各自的好友 print(f1 ^ f2) # {'jack', 'tony', 'tom', 'kevin'}
垃圾回收机制
"""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来一次
今天学完后,觉得很多知识都有规律,计划把所有课后作业整理出来,敲到熟练为止