一、练习题

# 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. TSP(Traveling Salesman Problem)-----浅谈旅行商问题(动态规划,回溯实现)

    1.什么是TSP问题 一个售货员必须访问n个城市,这n个城市是一个完全图,售货员需要恰好访问所有城市的一次,并且回到最终的城市. 城市于城市之间有一个旅行费用,售货员希望旅行费用之和最少. 完全图:完 ...

  2. CANVAS画布与SVG的区别

    CANVAS是html5提供的新元素<canvas>,而svg存在的历史要比canvas久远,svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属 ...

  3. Windows中通过命令行新建文件夹、新建文件,和一些常用命令

    新建文件 和Linux不太一样,Linux中的touch和vi命令创建新文件的方法都不能用了,在windows命令行下得用type nul>文件名.后缀名来创建: F:\study\vue\wo ...

  4. WebView断网提示

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/9913968.html 重写WebViewClient中的方法,然后WebView.setWebViewC ...

  5. TextView走马灯

    设置textView走马灯形式显示: android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally ...

  6. RN开发中的报错以及告警

    报错一: Attempted to transition from state `RESPONDER_INACTIVE_PRESS_IN` to `RESPONDER_ACTIVE_LONG_PRES ...

  7. Visual Studio 2019 RC入门

    介绍 在本文中,让我们看看如何开始使用Visual Studio 2019 RC.Microsoft现已发布Visual Studio Release Candidate,现在可以下载了.最初,Mic ...

  8. C++ 浅拷贝与深拷贝探究

    C++浅拷贝与深拷贝探究 浅拷贝与深拷贝的概念是在类的复制/拷贝构造函数中出现的. 拷贝构造函数使用场景 对象作为参数,以值传递方式传入函数(要调用拷贝构造函数将实参拷贝给函数栈中的形参) 对象作为返 ...

  9. 基于raspberry搭建个人web server

    树莓派系统介绍 安装操作系统及网络\远程控制配置 安装常用软件 构建web服务器(nginx + php + sqlite) 构建web服务器(appach+mysql+php) 构建NAS服务器 其 ...

  10. maven常用仓库

    ==================2014-04-19添加========可访问=============================== http://nexus.openkoala.org/ ...