date: 2021-06-12title: python练习题笔记 #标题
tags: python #标签
categories: python # 分类

记录下python学习过程中的练习题代码实现。

字符串转换为字典

  1. '''
  2. 将下列字符串定义为字典,字典格式如下:
  3. dic={k:1,'}
  4. '''
  5. s = "k: 1|k1:2|k2:3 |k3 :4"
  6. # 方法一(使用推导式)
  7. dic = {k: int(v.strip()) for i in s.split('|') for k, v in (i.split(':'),)}
  8. print(dic)
  9. # 方法二:
  10. t = s.split('|')
  11. dic = dict()
  12. for i in t:
  13. k, v = i.split(':')
  14. dic[k] = int(v.strip())
  15. 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\穿越火线')