练习题
三次登录
写一个函数完成三次登录,三次不成功则登录失败,失败返回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,就给复仇者联盟投一票
- 每次投票后,显示给哪部电影投票成功
- 退出投票后,显示最终每个电影的票数
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']