date: 2021-06-12title: python练习题笔记 #标题
tags: python #标签
categories: python # 分类
记录下python学习过程中的练习题代码实现。
字符串转换为字典
'''
将下列字符串定义为字典,字典格式如下:
dic={k:1,'}
'''
s = "k: 1|k1:2|k2:3 |k3 :4"
# 方法一(使用推导式)
dic = {k: int(v.strip()) for i in s.split('|') for k, v in (i.split(':'),)}
print(dic)
# 方法二:
t = s.split('|')
dic = dict()
for i in t:
k, v = i.split(':')
dic[k] = int(v.strip())
print(dic)
简易购物车
goods = [
{'name': '电脑', 'price': 1999},
{'name': '鼠标', 'price': 10},
{'name': '游艇', 'price': 20},
{'name': '美女', 'price': 998},
{'name': 'lv', 'price': 1998}
]
for i, dic in enumerate(goods, start=1):
print('{}\t{}\t{}'.format(i, dic.get('name'), dic.get('price')))
while 1:
xh = input('请输入商品序号(按q退出):').strip()
if xh.lower() == 'q':
break
elif xh.isdecimal():
xh = int(xh)
if 0 < xh <= len(goods):
print('您输入的序号为:{},商品为:{},价格为;{}'.format(xh, goods[xh - 1].get('name'), goods[xh - 1].get('price')))
else:
print('您输入的序号超出商品范围,请重新输入...')
else:
print('您输入的为非法字符,请重新输入....')
print('正在退出程序...')
判断一个三位数是否是水仙花数量
'''
水仙花数是一个三位数,三位数的每一位的三次方之和还是等于这个数,那这个数就是一个水仙花数
'''
while 1:
num = input('请输入一个数(按q退出):').strip()
if num.upper() == 'Q':
break
elif num.isdecimal() and len(num) == 3:
sum = int(num[0]) ** 3 + int(num[1]) ** 3 + int(num[2]) ** 3
if int(num) == sum:
print('你输入的{}是水仙花数。'.format(num))
else:
print('{}不是水仙花哦!'.format(num))
else:
print('请输入正确的数值....')
# 下面的代码可以统计出是水仙花的数有哪些
for num in range(100, 1000):
num = str(num)
sum = int(num[0]) ** 3 + int(num[1]) ** 3 + int(num[2]) ** 3
if int(num) == sum:
print('{}是水仙花数。'.format(num))
把列表中所有姓周的删除
# 方法一(将姓周的保存到新列表,然后循环新列表中的元素,删除旧列表中的姓周的)
l1 = ['周老二', '周星星', '码云', '周扒皮']
l2 = []
for i in l1:
if '周' == i[0]:
l2.append(i)
for i in l2:
l1.remove(i)
print(l1)
对文本数据组合成列表,列表中包含字典
# 假如文件 商品信息.txt 内容如下:
appl8e 10 3 2001
tesla 100000 1 2002
mac 3000 2 2003
lenovo 3000 3 2004
chicken 10 3 2005
# 要求结果如下
[{'name': 'appl8e', 'price': '10', 'mounth': '3', 'year': '2001'}, {'name': 'tesla', 'price': '100000', 'mounth': '1', 'year': '2002'}, {'name': 'mac', 'price': '3000', 'mounth': '2', 'year': '2003'}, {'name': 'lenovo', 'price': '3000', 'mounth': '3', 'year': '2004'}, {'name': 'chicken', 'price': '10', 'mounth': '3', 'year': '2005'}]
# 那么代码应该是这样的
l1 = []
name_list = ['name', 'price', 'mounth', 'year']
with open(r'读测试', encoding='utf-8') as f1:
for line in f1:
dic = {}
line = line.split()
for i in range(len(name_list)):
dic[name_list[i]] = line[i]
l1.append(dic)
print(l1)
格式化列表中的数据
# 源数据如下:
li1 = [
{"name": 'alex', "hobby": '抽烟'},
{"name": 'alex', "hobby": '喝酒'},
{"name": 'alex', "hobby": '烫头'},
{"name": 'alex', "hobby": 'message'},
{"name": 'wusir', "hobby": '喊麦'},
{"name": 'wusir', "hobby": '街舞'},
{"name": 'wusir', "hobby": '出差'},
{"name": '太白', "hobby": '看书'},
]
# 要求处理成如下格式:
[{'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头', 'message']}, {'name': 'wusir', 'hobby_list': ['喊麦', '街舞', '出差']}, {'name': '太白', 'hobby_list': ['看书']}]
# 方法一:
li1 = [
{"name": 'alex', "hobby": '抽烟'},
{"name": 'alex', "hobby": '喝酒'},
{"name": 'alex', "hobby": '烫头'},
{"name": 'alex', "hobby": 'message'},
{"name": 'wusir', "hobby": '喊麦'},
{"name": 'wusir', "hobby": '街舞'},
{"name": 'wusir', "hobby": '出差'},
{"name": '太白', "hobby": '看书'},
]
li2 = []
for i in li1:
for j in li2:
if i['name'] == j['name']:
j['hobby_list'].append(i['hobby'])
break
else:
li2.append({'name': i['name'], 'hobby_list': [i['hobby']]})
print(li2)
# 方法二
for i in li1:
if i['name'] in li2:
li2[i['name']]['hobby_list'].append(i['hobby'])
else:
li2[i['name']] = {'name': i['name'], 'hobby_list': [i['hobby']]}
print(list(li2.values()))
简易博客登录系统
# 当前登录状态
login_status = {
'Username': None,
'loggin': False
}
# 读取用户列表
def read_user_info():
global user_list
with open(r'user_info.txt', encoding='utf-8') as f1:
user_list = {name: passwd for i in f1 for name, passwd in (i.strip().split(' '),)}
# 登录功能
def login(f):
def inner(*args, **kwargs):
count = 0
if login_status['loggin']:
ret = f(*args, **kwargs)
main()
return ret
else:
while count < 3:
count += 1
username = input('请输入用户名:').strip()
passwd = input('请输入密码:').strip()
read_user_info()
if username in user_list and passwd == user_list[username]:
login_status['Username'] = username
login_status['loggin'] = True
ret = f(*args, **kwargs)
main()
return ret
else:
print('用户名或密码错误!')
else:
print('最近登录过于频繁,请15分钟后再次尝试登录!')
exit(1)
return inner
@login
def logining():
print('登录成功!')
# 注册功能
def registry():
while 1:
username_r = input('请输入用户名(按q或Q退出):').strip()
passwd_r = input('请输入密码:').strip()
if username_r.upper() == 'Q' or passwd_r.upper() == 'Q': break
if username_r.isalnum():
read_user_info()
if username_r in user_list:
print('当前用户名已存在,请重新输入!')
continue
else:
pass
else:
print('用户名只能包含字符及数字,请重新输入...')
if passwd_r.isalnum() and (6 <= len(passwd_r) <= 14):
with open(r'user_info.txt', encoding='utf-8', mode='a+') as f1:
f1.write(f'{username_r} {passwd_r}\n')
print('注册成功,正在退出...')
break
else:
print('密码只能是长度为6~14位字母及数字的组合!')
# 文章页面
@login
def wenzhang():
print('欢迎访问文章页面')
# 评论页面
@login
def pinglun():
print('欢迎访问评论页面')
# 日历页面
@login
def rili():
print('欢迎访问日历页面')
# 收藏页面
@login
def shoucang():
print('欢迎访问收藏页面')
# 注销功能
def zhuxiao():
login_status['Username'] = None
login_status['loggin'] = False
main()
# 退出功能
def tc():
exit(0)
# 打印菜单
def main():
l1 = [
'请登录',
'请注册',
'进入文章页面',
'进入评论页面',
'进入日历页面',
'进入收藏页面',
'注销账号',
'退出整个程序'
]
for k, v in enumerate(l1, start=1):
print(k, v)
gongneng = [logining, registry, wenzhang, pinglun, rili, shoucang, zhuxiao, tc]
num = input('请输入序号(按q或Q退出):').strip()
if num.upper() == 'Q':
exit(0)
elif num.isdecimal():
num = int(num)
if 0 < num <= len(gongneng):
gongneng[num - 1]()
else:
print('您输入的序号超出范围了')
else:
print('请输入数字...')
if __name__ == '__main__':
main()
正则匹配字符串中的所有整数
import re
# 要匹配下面的所有整数
exp = '1+2+5*(32.58/56-32.25)*598-8'
ret = re.findall('\d+', exp)
# 默认将小数当成了两个整数
print(ret) # ['1', '2', '5', '32', '58', '56', '598', '8']
# 应该这样匹配
ret = re.findall(r'\d+\.\d+|(\d+)', exp)
print(ret) # ['1', '2', '5', '', '56', '', '598', '8']
# 可以看到匹配到小数的返回的为空,这是因为正则匹配中有 | 关系的,会默认保留分组中的数据
# 如果没有匹配到分组中的数据,那么就会为空
# 下面将两个正则都变成分组再打印下
ret = re.findall(r'(\d+\.\d+)|(\d+)', exp)
print(ret) # [('', '1'), ('', '2'), ('', '5'), ('32.58', ''), ('', '56'), ('32.25', ''), ('', '598'), ('', '8')]
# 可以看出来,我们ret=re.findall(r'\d+\.\d+|(\d+)',exp) 这个正则是最接近答案的
# 但由于将小数返回了空,所以还要将列表中的空元素去除
ret = re.findall(r'\d+\.\d+|(\d+)', exp)
print(ret) # ['1', '2', '5', '', '56', '', '598', '8']
# ret=filter(lambda n:n,ret) # 去除列表中的空元素
# print(list(ret)) # ['1', '2', '5', '56', '598', '8']
# 也可以这样去除
ret = [i for i in ret if i != '']
print(ret) # ['1', '2', '5', '56', '598', '8']
递归函数获取阶乘值
def func(num):
if num == 1:
return num
else:
return num * func(num - 1)
print(func(5))
递归函数获取某个目录下所有文件
import os
def show_file(path):
l1 = os.listdir(path)
for i in l1:
abs_path = os.path.join(path, i)
if os.path.isfile(abs_path):
print(abs_path)
else:
show_file(abs_path)
show_file(r'F:\CF\穿越火线')
递归函数获取某个目录下所有目录大小
import os
def show_file(path):
list_dir = os.listdir(path)
for i in list_dir:
abs = os.path.join(path, i)
if os.path.isdir(abs):
print(f'{abs} 目录大小为{os.path.getsize(abs)}字节')
show_file(abs)
show_file(r'F:\CF\穿越火线')
获取目录下所有文件大小
import os
def show_file(path):
list_dir = os.listdir(path)
for i in list_dir:
abs = os.path.join(path, i)
if os.path.isfile(abs):
print(f'{abs} 文件大小为{os.path.getsize(abs)}字节')
else:
show_file(abs)
show_file(r'F:\CF\穿越火线')