一、练习题

# 1.统计元组中所有数据属于字符串的个数,提示:isinstance()
# 数据:t1 = (1, 2, '3', '4', 5, '6')
# 结果:3

# 2.将以下数据存储为字典类型
# 数据:info = "name:Owen|age:18|gender:男"
# 结果:{'name': 'Owen', 'age': 18, 'gender': '男'}
# 注:年龄存储为数字类型

# 3.完成数据的去重
# 数据:t3 = (1, 2, 1, 2, 3, 5, 9)
# 结果:t3 = (1, 2, 3, 5, 9)
# 注:从不考虑顺序、考虑顺序两方面完成

# 4.计算元组中所有可以转换为数字的数据的总和
# 数据:t4 = (10, 'abc', '100', '3')
# 运算结果:113

# 5.将数据转换类型存储
# 原数据:dic = {'name': 'Owen', 'age': 18, 'gender': '男'}
# 处理后:info = [('name', 'Owen'), ('age', 18), ('gender', '男')]

# 拓展:选做
# 1.计算元组中所有可以转换为数字的数据的总和
# 数据:t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,))
# 运算结果:11118
# 提示:
#   -- 利用字符串isnumeric()判断汉字
#     -- 利用字典{'壹': 1 ...}将汉字转换为数字
#    -- 利用isinstance()将list和tuple中数据取出来
#    -- 先将所有转化为数字的数据存放在一个单列集合中,在做运算

# 2.完成录入电话本
# 需求:
'''
-- 从键盘中录入姓名(不区分大小写):
    -- 姓名必须是全英文组成,不是则重新录入姓名,如果是q,代表退出
-- 从键盘中再录入电话:
    -- 电话必须为数字且长度必须是11位(不能转换为数字)
-- 如果出现姓名相同,则保留最后一次电话号码
-- 形成的数据是有电话分组的,如:第一次录入Owen,13355667788,则会形成
    -- {
        'O': {
            'Owen': '13355667788'
        }
    }

最终数据,分组名一定大写:
{
    'E': {
        'egon': '17788990000',
        'engo': '16633445566'
    },
    'O': {
        'Owen': '13355667788'
    }
}
'''
# 1.统计元组中所有数据属于字符串的个数,提示:isinstance()
# 数据:t1 = (1, 2, '3', '4', 5, '6')
# 结果:3
t1 = (1, 2, ')
count = 0
for v in t1:
    if isinstance(v, str):
        count += 1
print(count)

# 2.将以下数据存储为字典类型
# 数据:info = "name:Owen|age:18|gender:男"
# 结果:{'name': 'Owen', 'age': 18, 'gender': '男'}
# 注:年龄存储为数字类型

info = "name:Owen|age:18|gender:男"
infos = info.split('|')  # ['name:Owen', 'age:18', 'gender:男']
info_dic = {}
for msg in infos:
    k, v = msg.split(':')
    info_dic[k] = v
print(info_dic)

# 3.完成数据的去重
# 数据:t3 = (1, 2, 1, 2, 3, 5, 9)
# 结果:t3 = (1, 2, 3, 5, 9)
# 注:从不考虑顺序、考虑顺序两方面完成
t3 = (1, 2, 1, 2, 3, 5, 9)
l3 = []
for v in t3:
    if v not in l3:
        l3.append(v)
t3 = tuple(l3)
print(t3)

t3 = (1, 2, 1, 2, 3, 5, 9)
t3 = tuple(set(t3))
print(t3)

# 4.计算元组中所有可以转换为数字的数据的总和
# 数据:t4 = (10, 'abc', '100', '3')
# 运算结果:113

t4 = (10, ')
total = 0
for v in t4:
    if isinstance(v, int):
        total += v
    elif isinstance(v, str):
        if v.isdigit():
            v = int(v)
            total += v
print(total)

# 5.将数据转换类型存储
# 原数据:dic = {'name': 'Owen', 'age': 18, 'gender': '男'}
# 处理后:info = [('name', 'Owen'), ('age', 18), ('gender', '男')]

dic = {'name': 'Owen', 'age': 18, 'gender': '男'}
info = []
for k, v in dic.items():
    info.append((k, v))
print(info)

# 拓展1.计算元组中所有可以转换为数字的数据的总和
# 数据:t4 = (10, 'abc', '100', '3', '壹', '肆', [1000], (10000,))
# 运算结果:11118
# 提示:
#   -- 利用字符串isnumeric()判断汉字
#     -- 利用字典{'壹': 1 ...}将汉字转换为数字
#    -- 利用isinstance()将list和tuple中数据取出来
#    -- 先将所有转化为数字的数据存放在一个单列集合中,在做运算

t4 = (10, ', '壹', '肆', [1000], (10000,))
num_map = {'壹': 1, '贰': 2, '仨': 3,
           '肆': 4, '伍': 5, '陆': 6,
           '柒': 7, '捌': 8, '玖': 9, '拾': 10}
nums = []
for v in t4:
    if isinstance(v, int):
        nums.append(v)
    elif isinstance(v, str):
        if v.isdigit():
            nums.append(int(v))
        elif v.isnumeric():
            nums.append(num_map[v])
    elif isinstance(v, tuple) or isinstance(v, list):
        # 只考虑该具体数据,不考虑更复杂情况
        for n in v:
            nums.append(n)
total = sum(nums)  # python内置方法
print(total)

# 拓展2.完成录入电话本
# 需求:
'''
-- 从键盘中录入姓名(不区分大小写):
    -- 姓名必须是全英文组成,不是则重新录入姓名,如果是q,代表退出
-- 从键盘中再录入电话:
    -- 电话必须为数字且长度必须是11位(不能转换为数字)
-- 如果出现姓名相同,则保留最后一次电话号码
-- 形成的数据是有电话分组的,如:第一次录入Owen,13355667788,则会形成
    -- {
        'O': {
            'Owen': '13355667788'
        }
    }

最终数据,分组名一定大写:
{
    'E': {
        'egon': '17788990000',
        'engo': '16633445566'
    },
    'O': {
        'Owen': '13355667788'
    }
}
'''

# 电话本
phone_map = {}
# 是否退出系统
is_over = False
while not is_over:
    # 姓名初始制空,完成只有姓名输入正确才录入电话
    name = ''
    while True:
        # 姓名必须录入正确
        if not name:
            name = input("name:")
            if name == 'q':
                # 退出系统
                is_over = True
                break
            elif not name.isalpha():
                # 录入错误,置空名字
                print('name error')
                name = ''
                continue
        # 录入电话,保证是11位的数字字符串
        phone = input("phone:")
        if not (phone.isdigit() and len(phone) == 11):
            continue

        # 取组名
        group = name[0:1].upper()
        # 对于组名的操作:无组名,添加分组 | 有组名,不操作
        phone_map.setdefault(group, {})
        phone_map[group][name] = phone
        # 一条信息添加完毕,重置信息
        name = ''
        phone = ''
        print('录入成功')
print(phone_map)

答案

# 1.统计文件数据中字母e出现的次数(不区分大小写)
# 文件内容:hello friend, can you speak English!
# 结果:4
# 分析:将文件内容读出,然后统计读出的字符串中字符e的个数(字符串count功能)

# 2.统计文件数据中出现的的所有字符与该字符出现的个数(不区分大小写,标点与空格也算)
# 文件内容:hello friend, can you speak English!
# 结果:
{
    'h': 1,
    'e': 4,
    'l': 3,
    'o': 2,
    ' ': 5,
    ...
}
# 分析:将文件内容读出,然后统计读出的字符串中每个字符的个数,形成字段(for遍历读取的字符串)

# 3.读取文件内容,分析出所有的账号及对应的密码
# 文件内容:owen:123456|egon:123qwe|liuxx:000000
# 结果:
{
    ',
    'egon': '123qwe',
    '
}
# 分析:将文件内容读出,然后按|拆分出 账号:密码 格式的子字符串,再按:拆分成 账号及密码,存放到字典中

# 4.在题3的基础上,账号密码已经被存储在文件中,完成用户登录成功或失败(只做一次性判断)
# 文件内容:owen:123456|egon:123qwe|liuxx:000000
# 需求:输入账号、密码,然后进行登录判断,账号密码均正确打印登录成功,否则打印登录失败
# 分析:先完成题3,分析出账号密码字典,然后拿输入的账号密码与字典中数据进行校验

# 5.在题3的基础上,完成用户注册的功能(只做一次性判断)
# 文件内容:owen:123456|egon:123qwe|liuxx:000000
# 需求:输入注册的账号、密码,账号已存在的打印账号已存在,注册失败,反正打印注册成功,并将新账号密码录入文件
# 结果:如果输入mac、123123 => owen:123456|egon:123qwe|liuxx:000000|mac:123123
# 分析:先完成题3,分析出账号密码字典,然后拿输入的注册账号与字典中数据进行校验,如果校验没有新账号
#    -- 1.采用 w 模式写文件,可以在读取文件的内容后拼接 |mac:123123 字符串,将拼接后的总字符串一次性写入
#     -- 2.采用 a 模式写文件,可以直接追加写入 |mac:123123 字符串

# -------------------------------------------
# 拓展1.统计文件中大写字母、小写字母、数字及其他字符出现的次数
# 文件内容:Abc123,-+XYZopq000.?/
# 结果:
{
    '大写字母': 4,
    '小写字母': 5,
    '数字': 6,
    '其他字符': 6
}
# 分析:利用ASCII表,for循环遍历每一个字符value,eg:'a' < value < 'z'就代表是小写字母

# 拓展2.完成登录注册系统(从空文件开始做)
# 需求分析:
'''
1.可以循环登录注册,输入1代表选择登录功能,输入2代表注册功能,输入0代表退出其他,其他输入代表输入有误,重输
2.用户的账号密码信息存放在usr.txt文件中,保证用户注册成功后,重启系统,用户信息仍然保存
3.登录在账号验证通过才输入密码验证登录,账号验证三次失败自动进入注册功能,登录三次验证失败自动退出系统
4.第一次注册,文件写入 账号:密码 信息,再次注册追加写入 |账号:密码 信息

分析过程:略
'''
# 1.统计文件数据中字母e出现的次数(不区分大小写)
# 文件内容:hello friend, can you speak English!
# 结果:4
# 分析:将文件内容读出,然后统计读出的字符串中字符e的个数(字符串count功能)

f = open('info.txt', 'r', encoding='utf-8')
s_data = f.read().lower()
f.close()
count = s_data.count('e')
print(count)

# 2.统计文件数据中出现的的所有字符与该字符出现的个数(不区分大小写,标点与空格也算)
# 文件内容:hello friend, can you speak English!
# 结果:
'''
{
    'h': 1,
    'e': 4,
    'l': 3,
    'o': 2,
    ' ': 5,
    ...
}
'''
# 分析:将文件内容读出,然后统计读出的字符串中每个字符的个数,形成字段(for遍历读取的字符串)
f = open('info.txt', 'r', encoding='utf-8')
s_data = f.read().lower()
f.close()
c_map = {}
for v in s_data:
    c_map.setdefault(v, 0)
    c_map[v] += 1
print(c_map)

# 3.读取文件内容,分析出所有的账号及对应的密码
# 文件内容:owen:123456|egon:123qwe|liuxx:000000
# 结果:
{
    ',
    'egon': '123qwe',
    '
}
# 分析:将文件内容读出,然后按|拆分出 账号:密码 格式的子字符串,再按:拆分成 账号及密码,存放到字典中
f = open('usr.txt', 'r', encoding='utf-8')
s_data = f.read()
f.close()
usr_map = {}
for k_v in s_data.split('|'):
    k, v = k_v.split(':')
    usr_map[k] = v
print(usr_map)

# 4.在题3的基础上,账号密码已经被存储在文件中,完成用户登录成功或失败(只做一次性判断)
# 文件内容:owen:123456|egon:123qwe|liuxx:000000
# 需求:输入账号、密码,然后进行登录判断,账号密码均正确打印登录成功,否则打印登录失败
# 分析:先完成题3,分析出账号密码字典,然后拿输入的账号密码与字典中数据进行校验

f = open('usr.txt', 'r', encoding='utf-8')
s_data = f.read()
f.close()
usr_map = {}
for k_v in s_data.split('|'):
    k, v = k_v.split(':')
    usr_map[k] = v

usr = input('usr: ')
pwd = input('pwd: ')

if pwd == usr_map.get(usr):
    print('登录成功')
else:
    print('登录失败')

# 5.在题3的基础上,完成用户注册的功能(只做一次性判断)
# 文件内容:owen:123456|egon:123qwe|liuxx:000000
# 需求:输入注册的账号、密码,账号已存在的打印账号已存在,注册失败,反正打印注册成功,并将新账号密码录入文件
# 结果:如果输入mac、123123 => owen:123456|egon:123qwe|liuxx:000000|mac:123123
# 分析:先完成题3,分析出账号密码字典,然后拿输入的注册账号与字典中数据进行校验,如果校验没有新账号
#    -- 1.采用 w 模式写文件,可以在读取文件的内容后拼接 |mac:123123 字符串,将拼接后的总字符串一次性写入
#     -- 2.采用 a 模式写文件,可以直接追加写入 |mac:123123 字符串

f = open('usr.txt', 'r', encoding='utf-8')
s_data = f.read()
f.close()
usr_map = {}
for k_v in s_data.split('|'):
    k, v = k_v.split(':')
    usr_map[k] = v

# 默认w
usr = input('usr: ')
pwd = input('pwd: ')

# if usr in usr_map:
#     print('账号已存在,注册失败')
# else:
#     w = open('usr.txt', 'w', encoding='utf-8')
#     w_data = '%s|%s:%s' % (s_data, usr, pwd)
#     w.write(w_data)
#     w.close()

if usr in usr_map:
    print('账号已存在,注册失败')
else:
    w = open('usr.txt', 'a', encoding='utf-8')
    w.write('|%s:%s' % (usr, pwd))
    w.close()

# 拓展1.统计文件中大写字母、小写字母、数字及其他字符出现的次数
# 文件内容:Abc123,-+XYZopq000.?/
# 结果:
{
    '大写字母': 4,
    '小写字母': 5,
    '数字': 6,
    '其他字符': 6
}
# 分析:利用ASCII表,for循环遍历每一个字符value,eg:'a' < value < 'z'就代表是小写字母
r = open('info.txt', 'r', encoding='utf-8')
r_data = r.read()
r.close()
res_map = {}
for v in r_data:
    if 'a' <= v <= 'z':
        res_map.setdefault('小写字母', 0)
        res_map['小写字母'] += 1
    elif 'A' <= v <= 'Z':
        res_map.setdefault('大写字母', 0)
        res_map['大写字母'] += 1
    elif v.isdigit():
        res_map.setdefault('数字', 0)
        res_map['数字'] += 1
    else:
        res_map.setdefault('其他字符', 0)
        res_map['其他字符'] += 1
print(res_map)

# 拓展2.完成登录注册系统(从空文件开始做)
# 需求分析:
'''
1.可以循环登录注册,输入1代表选择登录功能,输入2代表注册功能,输入0代表退出,其他输入代表输入有误,重输
2.用户的账号密码信息存放在usr.txt文件中,保证用户注册成功后,重启系统,用户信息仍然保存
3.登录在账号验证通过才输入密码验证登录,账号验证三次失败自动进入注册功能,登录三次验证失败自动退出系统
4.第一次注册,文件写入 账号:密码 信息,再次注册追加写入 |账号:密码 信息

分析过程:略
'''

is_over = False
while not is_over:
    tag = input('''请输入:
1:登录
2:注册
0:退出
>>>''')
    ':
        print('退出系统!')
        break
    ']:
        # 用户信息表usr_map分析过程
        r = open('usr.txt', 'r', encoding='utf-8')
        r_data = r.read()
        r.close()
        usr_map = {}
        if r_data:  # 存在用户信息才有用户信息表usr_map
            for k_v in r_data.split('|'):
                k, v = k_v.split(':')
                usr_map[k] = v

        ':
            print('欢迎来到登录页面')
            # 没有任何初始用户信息
            if not usr_map:
                print('无用户信息,请先注册')
                tag = '
            # 有用户信息,可以登录
            else:
                # 记录账号验证失败次数
                usr_count = 0
                # 记录登录失败次数
                login_count = 0
                while True:
                    usr = input('usr: ')
                    if usr not in usr_map:
                        usr_count += 1
                        if usr_count >= 3:
                            print('账号验证次数过多,可以注册')
                            tag = '
                            break
                    else:
                        pwd = input('pwd: ')
                        if pwd != usr_map.get(usr):
                            login_count += 1
                            if login_count >= 3:
                                print('登录验证次数过多,可以注册')
                                tag = '
                                break
                        else:
                            print('登录成功!!!')
                            is_over = True
                            break
        # 不用elif是保证,登录中可以通过tag = '2'直接来到注册页面
        ':
            print('欢迎来到注册页面')
            new_usr = input('new usr: ')
            if new_usr in usr_map:
                print('用户已存在,无需注册')
                continue
            new_pwd = input('new pwd: ')
            w = open('usr.txt', 'a', encoding='utf-8')
            info = '%s:%s' % (new_usr, new_pwd)
            # 已有用户,不是首次添加
            if usr_map:
                info = '|%s' % info
            w.write(info)
            w.close()
            print('注册成功!!!')
    else:
        print('输入有误!')

答案

python 基础篇练习题的更多相关文章

  1. python基础篇-day1

    python基础篇 python是由C语言写的: pass 占位符: del,python中全局的功能,删除内存中的数据: 变量赋值的方法: user,pass = 'freddy','freddy1 ...

  2. python基础篇之进阶

    python基础篇之进阶 参考博客:http://www.cnblogs.com/wupeiqi/articles/5115190.html python种类 1. cpython  使用c解释器生产 ...

  3. python基础篇(六)

    PYTHON基础篇(六) 正则模块re A:正则表达式和re模块案例 B:re模块的内置方法 时间模块time A:时间模块的三种表示方式 B:时间模块的相互转换 随机数模块random A:随机数模 ...

  4. python基础篇(五)

    PYTHON基础篇(五) 算法初识 什么是算法 二分查找算法 ♣一:算法初识 A:什么是算法 根据人们长时间接触以来,发现计算机在计算某些一些简单的数据的时候会表现的比较笨拙,而这些数据的计算会消耗大 ...

  5. python基础篇(一)

    PYTHON基础篇(一) 变量 赋值 输入,输出和导入 A:输入 B:输出 C:导入 运算符 A:算数运算符 B:比较运算符 C:赋值运算符 D:位运算符 E:逻辑运算符 F:成员运算符 G:身份运算 ...

  6. python基础篇(二)

    PYTHON基础篇(二) if:else,缩进 A:if的基础格式和缩进 B:循环判断 C:range()函数和len()函数 D:break,contiue和pass语句 for,while循环 函 ...

  7. python基础篇(三)

    PYTHON基础篇(三) 装饰器 A:初识装饰器 B:装饰器的原则 C:装饰器语法糖 D:装饰带参数函数的装饰器 E:装饰器的固定模式 装饰器的进阶 A:装饰器的wraps方法 B:带参数的装饰器 C ...

  8. python基础篇(四)

    PYTHON基础篇(四) 内置函数 A:基础数据相关(38) B:作用域相关(2) C:迭代器,生成器相关(3) D:反射相关(4) E:面向对象相关(9) F:其他(12) 匿名函数 A:匿名函数基 ...

  9. Python基础篇--输入与输出

    站长资讯平台:Python基础篇--输入与输出在任何语言中,输入和输出都是代码最基础的开始,so,先来聊一聊输入和输出输出输入END在任何语言中,输入和输出都是代码最基础的开始,so,先来聊一聊输入和 ...

随机推荐

  1. csharp: LocalDataCache.sync

    app.config: <?xml version="1.0" encoding="utf-8" ?> <configuration> ...

  2. MatrixTree速成

    前言 MatrixTree定理是用来解决生成树计数问题的有利工具 比如说这道题 MatrixTree定理的算法流程也非常简单 我们记矩阵\(A\)为无向图的度数矩阵 记矩阵\(D\)为无向图的邻接矩阵 ...

  3. 电脑一键U盘启动快捷键

    下面是我特意列出的品牌电脑.笔记本电脑.组装电脑一键U盘启动快捷键对应列表,仅供大家查阅参考! [品牌-笔记本电脑] 笔记本品牌  启动按键 联想笔记本  F12 宏基笔记本  F12 华硕笔记本   ...

  4. SQLServer数据库维护(一)碎片检查整理

    一.碎片查看维护 dbcc showcontig('表名') dbcc showcontig ('T_NOFITSTUDY') 结果如下: DBCC SHOWCONTIG 正在扫描 'T_NOFITS ...

  5. MongoDB更需要好的模式设计 及 案例赏析

    一  挑战 设计从来就是个挑战. 当我们第一次接触数据库,学习数据库基础理论时,都需要学习范式,老师也一再强调范式是设计的基础.范式是这门课程中的重要部分,在期末考试中也一定是个重要考点.如果我们当年 ...

  6. 【原】Java学习笔记014 - 面向对象

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 面向对象思想 // ...

  7. 建立第一个SpringBoot小列子(碰到的错误)

    当加入@SpringBootApplication注解时,无法得到解析 错误提示:SpringBootApplication cannot be resolved to a type 错误原因是因为s ...

  8. SQLServer之触发器简介

    触发器定义 触发器是数据库服务器中发生事件时自动执行的一种特殊存储过程.SQLServer允许为任何特定语句创建多个触发器.它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对数据库进行操作 ...

  9. 抖音、YouTube、Facebook等新媒体营销与运营相关14本书

    最近几年看过的抖音等新媒体营销与运营相关的书有14本,好书不多.具体清单整理如下,点击标题或图片可以看详细点评与内容摘抄: 4星|<屏幕上的聪明决策>:人在手机/电脑上做选择的心理学研究综 ...

  10. CSS---内外边距

    1.内外边距含义 内边距是div边框内的距离.背景色会覆盖内边距,内边距会使宽高变大. 外边距是div边框外的距离.背景色不会覆盖外边距 内外边距都会撑高父元素,外边距会提高div与div之间的距离 ...