练习题

三次登录

写一个函数完成三次登录,三次不成功则登录失败,失败返回False,登陆成功返回True

用户的用户名和密码存储在文件中,该文件包含多个用户名以及对应的密码,

形式为:name|password,每个人占用文件的一行

实现代码:

def login():
    flag = 0  # 用于三次循环
    while 1:
        flag += 1  # 进行一次,flag加一次
        if flag > 3:
            print("\n登录已失败三次,结束!")
            return False

        print(f"\n正在进行第 {flag} 次登录:")
        user_name = input("请输入用户: ").strip()  # 避免用户多输入空格
        user_pwd = input("请输入密码: ").strip()

        userDict = {}  # 用户字典
        f = open('users.txt', mode='r')
        for user in f.readlines():
            user = user.strip()  # 去掉每行后面的换行符
            # user.split('|')返回的是一个列表['admin', 'admin_pwd']
            user = user.split('|')
            userDict[user[0]] = user[1]
        f.close()
        # userDict:{'admin': 'admin_pwd', 'Tom': 'Tom_pwd', 'Jack': 'Jack_pwd'}
        # userDict.get(user_name) 不存在返回None,存在则返回的是键对应的值(密码)
        if user_pwd != userDict.get(user_name):
            print("用户名或密码输入错误!")
            continue  # 进行下一次登录操作
        else:
            # 成功登录
            return True
login()  # 调用函数

测试结果1:
正在进行第 1 次登录:
请输入用户: admin
请输入密码: admin_pwd
True

测试结果2:
正在进行第 1 次登录:
请输入用户: ad
请输入密码: ad
用户名或密码输入错误!

正在进行第 2 次登录:
请输入用户: a
请输入密码: ss
用户名或密码输入错误!

正在进行第 3 次登录:
请输入用户: admin
请输入密码: 123
用户名或密码输入错误!

登录已失败三次,结束!
False

电影投票

请写一个电影投票程序,电影列表为 lst = ['复仇者联盟4', '驯龙高手3', '金梅', '老男孩', '大话西游']

要求

  1. 用户可以连续投票,用户输入序号,进行投票,比如输入序号1,就给复仇者联盟投一票
  2. 每次投票后,显示给哪部电影投票成功
  3. 退出投票后,显示最终每个电影的票数
lst = ['复仇者联盟4', '驯龙高手3', '金梅', '老男孩', '大话西游']
# 创建一个空字典
dic = {}
while 1:
    for index, movie_name in enumerate(lst):  # 枚举
        print(f'序号:{index+1},电影名称:《{movie_name}》')

    num = input("请输入要投票的影片的序号(Q结束): ").strip()  # 不要忘记strip()
    if num.isdecimal():
        num = int(num)
        if 1 <= num <= len(lst):
            # lst[num-1]为序号num对应的电影名
            movie_name = lst[num-1]
            if movie_name in dic:
                dic[movie_name] += 1
            else:
                dic[movie_name] = 1
            print(f'投票成功,已经为电源《{movie_name}》投上宝贵的一票\n')
        else:
            print('序号不存在!\n')
            continue
    elif num.upper() == 'Q':
        break
    else:
        print('请正确输入序号!\n')
        continue

for movie_name, count in dic.items():
    print(f'《{movie_name}》最终得票数为 {count}')
    
   
 运行:
序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 1
投票成功,已经为电源《复仇者联盟4》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 2
投票成功,已经为电源《驯龙高手3》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 3
投票成功,已经为电源《金梅》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 4
投票成功,已经为电源《老男孩》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 5
投票成功,已经为电源《大话西游》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 1
投票成功,已经为电源《复仇者联盟4》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 2
投票成功,已经为电源《驯龙高手3》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 3
投票成功,已经为电源《金梅》投上宝贵的一票

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): 10
序号不存在!

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): abc
请正确输入序号!

序号:1,电影名称:《复仇者联盟4》
序号:2,电影名称:《驯龙高手3》
序号:3,电影名称:《金梅》
序号:4,电影名称:《老男孩》
序号:5,电影名称:《大话西游》
请输入要投票的影片的序号(Q结束): q
《复仇者联盟4》最终得票数为 2
《驯龙高手3》最终得票数为 2
《金梅》最终得票数为 2
《老男孩》最终得票数为 1
《大话西游》最终得票数为 1


for else

当迭代的对象迭代完并为空时,位于else的语句将会执行,而如果在for循环里有break时,则会直接终止循环,并不会执行else里的代码

换句话说:for循环完整执行后才执行else后的语句。如果for循环中遇到break退出,则不执行else后的语句。

for i in range(3):
    print(i)
else:
    print("迭代完了 i为空了,所以执行")


结果:
0
1
2
迭代完了 i为空了,所以执行


for i in range(3):
    if i == 1:
        break  # i等于1时,就终止for循环,并没有迭代完,所以就不会执行else
else:
    print("迭代完了 i为空了,所以执行")
    
没有打印任何结果

相关题目

将lst1这种数据类型转换为lst2类型,所写代码必须支持可拓展
比如,lst1新增一个 {"name": "Jack", "hobby": "打豆豆"}
lst2中变更:{"name": "Jack", "hobby_list": ["吃饭", "睡觉", "看剧", "打豆豆"]}

lst1 = [
    {"name": "Tom", "hobby": "抽烟"},
    {"name": "Tom", "hobby": "喝酒"},
    {"name": "Tom", "hobby": "烫头"},
    {"name": "Jack", "hobby": "吃饭"},
    {"name": "Jack", "hobby": "睡觉"},
    {"name": "Jack", "hobby": "看剧"}
]

lst2 = [
    {"name": "Tom", "hobby_list": ["抽烟", "喝酒", "烫头"]},
    {"name": "Jack", "hobby_list": ["吃饭", "睡觉", "看剧"]}
]

实现代码:

lst1 = [
    {"name": "Tom", "hobby": "抽烟"},
    {"name": "Tom", "hobby": "喝酒"},
    {"name": "Tom", "hobby": "烫头"},
    {"name": "Jack", "hobby": "吃饭"},
    {"name": "Jack", "hobby": "睡觉"},
    {"name": "Jack", "hobby": "看剧"},
    {"name": "Jack", "hobby": "看剧"},  # 故意多写了一次,测试去重是否有效
    {"name": "Jack", "hobby": "打豆豆"}
]

lst2 = []
for i in lst1:  # i: {'name': 'Tom', 'hobby': '抽烟'}
    name = i['name']
    hobby = i['hobby']
    for j in lst2:  # j: {"name": "Tom", "hobby_list": ["抽烟"]}
        # 有与之(name)对应的字典存在
        if j['name'] == name:
            if hobby not in j['hobby_list']:  # (去重)防止一个爱好添加两次
                j['hobby_list'].append(hobby)
            break
    else:  # 前面的for循环迭代完了,没有执行break,也就是并没有成功添加
        lst2.append({"name": name, "hobby_list": [hobby]})

for x in lst2:
    print(x)
    
    
结果:
{'name': 'Tom', 'hobby_list': ['抽烟', '喝酒', '烫头']}
{'name': 'Jack', 'hobby_list': ['吃饭', '睡觉', '看剧', '打豆豆']}
果然,只有一个看剧,去重效果杠杠的

复习字典:

取键值对:

dic = {'name': 'Jack', 'age': 22}
for key, value in dic.items():
    print(key, value)

结果:
name Jack
age 22

遍历字典的值,可以用values()函数;键,字典中的键,用keys()函数

dic = {'name': 'Jack', 'age': 22}
print(dic.values())
print(list(dic.values()))  # 是一个类似于列表的容器,可转为列表
print(dic.keys())
print(list(dic.keys()))  # 转为列表
结果
dict_values(['Jack', 22])
['Jack', 22]
dict_keys(['name', 'age'])
['name', 'age']
posted @ 2020-07-16 18:59  养了只猪  阅读(155)  评论(0编辑  收藏  举报