Python入门基础篇练习题

一、练习题

# 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, '3', '4', 5, '6')
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, 'abc', '100', '3')
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, 'abc', '100', '3', '', '', [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
# 结果:
{
    'owen': '123456',
    'egon': '123qwe',
    'liuxx': '000000'
}
# 分析:将文件内容读出,然后按|拆分出 账号:密码 格式的子字符串,再按:拆分成 账号及密码,存放到字典中

# 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
# 结果:
{
    'owen': '123456',
    'egon': '123qwe',
    'liuxx': '000000'
}
# 分析:将文件内容读出,然后按|拆分出 账号:密码 格式的子字符串,再按:拆分成 账号及密码,存放到字典中
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:退出
>>>''')
    if tag == '0':
        print('退出系统!')
        break
    elif tag in ['1', '2']:
        # 用户信息表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

        if tag == '1':
            print('欢迎来到登录页面')
            # 没有任何初始用户信息
            if not usr_map:
                print('无用户信息,请先注册')
                tag = '2'
            # 有用户信息,可以登录
            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 = '2'
                            break
                    else:
                        pwd = input('pwd: ')
                        if pwd != usr_map.get(usr):
                            login_count += 1
                            if login_count >= 3:
                                print('登录验证次数过多,可以注册')
                                tag = '2'
                                break
                        else:
                            print('登录成功!!!')
                            is_over = True
                            break
        # 不用elif是保证,登录中可以通过tag = '2'直接来到注册页面
        if 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('输入有误!')
答案

猜你喜欢

转载自www.cnblogs.com/ZKPython/p/10605047.html