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来一次

 

今天学完后,觉得很多知识都有规律,计划把所有课后作业整理出来,敲到熟练为止

 

  

 

  

 

 


 

posted @ 2022-03-16 03:36  ji哩咕噜  阅读(22)  评论(0编辑  收藏  举报