练习题解答(一)

2018-08-1116:12:58

一、字符串

1、如果判断name变量量对应的值前四位"l"出现⼏次,并输出结果
name = "aleX leNb"
print(name.count("l", 0, 4))    #count后面的两个参数是判断开始和结束位置的  顾头不顾尾

2、从name变量量对应的值中找到"N"对应的索引(如果找不不到则报错),并输出结果
name = "aleX leNb"
print(name.index("N"))

3、从name变量量对应的值中找到"N"对应的索引(如果找不不到则返回-1)输出结果
name = "aleX leNb"
print(name.find("N"))

4、从name变量量对应的值中找到"X le"对应的索引,并输出结果
name = "aleX leNb"
print(name.find("X le")     # 是找到的第一个字母的位置

5、通过对s切⽚片形成新的字符串串s3,s3 = "1345"
s = "123a4b5c"
s3 = s[0:7:2]
print(s3)       #1345

6、通过对s切⽚片形成字符串串s5,s5 = "c"
s = "123a4b5c"
s5 = s[-1:-2:-1]
s3 = s[-1:-5:-1]
print(s5)    # c
print(s3)    # c5b4

7、通过对s切⽚片形成字符串串s6,s6 = "ba2"
s = "123a4b5c"
s6 = s[-3:-8:-2]
print(s6)             #ba2

 


 

二、列表、字典、文件操作

 1、有字符串 "k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....}  (升级题)

str1 = 'k:1|k1:2|k2:3|k3:4'
dic = {}
a = str.split('|')
for i in a :
    k, v  = i.split(":")
    dic[k] =int(v)

print(dic)

2、车牌区域划分, 现给出以下车牌. 根据车牌的信息, 分析出各省的车牌持有量. (升级题)

dic = {}
car = ['鲁A25444', '鲁B22333', '京B89889', '黑C23442', '泸Y23454', '黑I34432','渝W87665']
locals = {'': '上海', '': '黑龙江', '': '山东', '': '北京', '': '重庆'}
for cars in car:
    first_name = cars[0]
    localtion = locals[first_name]    # 这里的是一个字典,通过key来取值  取出上海、上东……
    if dic.get(localtion) == None:
        dic[localtion] = 1
    else:
        dic[localtion] += 1
print(dic)

法二:
cars = ["鲁A32444", "鲁B12333", "京B8989M", "黑C49678", "黑C46555", "沪B25041", "黑C34567"]
locations = {"": "上海", "": "北京", "": "黑龙江", "": "山东", "": "湖北", "": "湖南"}
loca = []
dic = {}
for i in locations:
    count = 0
    for el in cars:
        if el.startswith(i):
            count += 1
    dic[locations[i]] = count
print(dic)

3、打印大地区的各个区县:
zone = {
    '山东' : {
        '青岛' : ['四方','黄岛','崂山','李沧','城阳'],
        '济南' : ['历城','槐荫','高新','长青','章丘'],
        '烟台' : ['龙口','莱山','牟平','蓬莱','招远']
    },
    '江苏' : {
        '苏州' : ['沧浪','相城','平江','吴中','昆山'],
        '南京' : ['白下','秦淮','浦口','栖霞','江宁'],
        '无锡' : ['崇安','南长','北塘','锡山','江阴']
    },
    '浙江' : {
        '杭州' : ['西湖','江干','下城','上城','滨江'],
        '宁波' : ['海曙','江东','江北','镇海','余姚'],
        '温州' : ['鹿城','龙湾','乐清','瑞安','永嘉']
    }
}
#省列表
province = list(zone.keys())
while True:
    print('省'.center(20, '*'))
    # 打印省列表
    for i in province:
        print('{}\t{}'.format(province.index(i)+1,i))
    province_input = input('请输入省编号,或输入q/Q退出:').strip()
    if province_input.isdigit():
        province_input = int(province_input)
        if province_input > 0 and province_input <= len(province):
            #省编号,由于显示加1,获取的时候,需要减1
            province_id = province_input - 1
            #城市列表
            city = list(zone[province[province_id]].keys())
            #进入市区列表
            while True:
                print('市'.center(20, '*'))
                for j in city:
                    print('{}\t{}'.format(city.index(j) + 1, j))
                city_input = input("请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                if city_input.isdigit():
                    city_input = int(city_input)
                    if city_input > 0 and city_input <= len(city):
                        # 市编号,由于显示加1,获取的时候,需要减1
                        city_id = city_input - 1
                        #县列表
                        county = zone[province[province_id]][city[city_id]]
                        # 县列表
                        while True:
                            print('县'.center(20, '*'))
                            for k in county:
                                print('{}\t{}'.format(county.index(k) + 1, k))
                            #到县这一级,不能输入编号了,直接提示返回菜单或者退出
                            county_input = input("输入b(back)返回上级菜单,或输入q(quit)退出:").strip()
                            if county_input == 'b':
                                # 终止此层while循环,跳转到上一层While
                                break
                            elif county_input == 'q':
                                # 结束程序
                                exit()
                            else:
                                print("\033[41;1m已经到底线了,请返回或者退出!\033[0m")
                    else:
                        print("\033[41;1m市编号 {} 不存在!\033[0m".format(city_input))
                elif city_input.upper() == 'B':
                    break
                elif city_input.upper() == 'Q':
                    #由于在多层while循环里面,直接exit退出即可
                    exit()
                else:
                    print("\033[41;1m输入市编号非法!\033[0m")
        else:
            print("\033[41;1m省编号 {} 不存在!\033[0m".format(province_input))
    elif province_input.upper() == 'Q':
        break
    else:
        print("\033[41;1m输入省编号非法!\033[0m")

5、循环列表. 判断a[i]和a[i+1]之间的大小关系, 如果a[i]比a[i+1]大. 则进行互换.循环结束的时候. 当前列表中最大的数据就会被移动到最右端.
#冒泡排序
li = [2, 1, 7, 4, 6, 12, 11, 26, 9, 34, 3, 9]
for i in range(len(li) - 1):
    if li[i] > li[i + 1]:
        c = li[i]
        li[i] = li[i + 1]
        li[i + 1] = c
    else:
        continue

print(li)

#选择排序
data_set = [12,45,2,48,66,2,1,56,36,90,5,10,503]

for i in range(len(data_set)):  #大圈决定轮数 也就是我们选择的次数
    minIndex = i
    for j in range(i+1,len(data_set)):  #小圈就是我们每次 选择后比较的次数
        #//如果后面的元素比我选择元素还小 就互换位置
        if data_set[j] < data_set[minIndex] :
            minIndex=j
    temp = data_set[i]
    data_set[i]=data_set[minIndex]
    data_set[minIndex] = temp

print(data_set)

6、有如下文件: le是老男孩python发起人,创建人。 le其实是人妖。 谁说le是sb? 你们真逗,le再牛逼,也掩饰不住资深屌丝的气质。 将文件中所有的alex都替换成大写的SB(文件的改的操作)。 import os with open('haha', 'r', encoding='utf-8') as f,\ open('haha_1', 'w', encoding='utf-8') as w: for i in f: line = i.replace('le', 'sb') w.write(line) os.remove('haha') os.rename('haha_1','haha')
7、将以下list3 改成list4 的样子: list3 = [ {"name": "alex", "hobby": "抽烟"}, {"name": "alex", "hobby": "喝酒"}, {"name": "alex", "hobby": "烫头"}, {"name": "alex", "hobby": "Massage"}, {"name": "wusir", "hobby": "喊麦"}, {"name": "wusir", "hobby": "街舞"}, ] 相同的名字合并并且hobby都装到hobby_list的列表中: 代码: list4 = [] li = [] for i in range(len(list3)): if list3[i]['name'] in li: continue else: li.append(list3[i]['name']) for i in li: hobby_list = [] for v in list3: if v['name'] == i: hobby_list.append(v['hobby']) else: continue dic = {} dic['name'] = i dic['hobby_list'] = hobby_list list4.append(dic) print(list4)

老师代码:
list4 = []
for ren in list3:
for el in list4:
if el['name'] == ren['name']:
el['hobby_list'].append(ren['hobby'])
break
else:
dic = {}
dic['name'] = ren['name']
dic['hobby_list'] = [ren['hobby']]
list4.append(dic)
print(list4)

 



 

三、函数

1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)

import os
import time

def fun(a,b):
    with open(a,'r+',encoding='utf-8') as f,\
        open('副本','w',encoding='utf-8') as w:
        # time.sleep(3)
        for i in f:
            if b in i:
                # w.write(i.replace(b,'*'*len(b)))
                w.write(i.replace(b,''))    #删除文件中的苍老师
            else:
                w.write(i)

    os.remove(a)
    os.rename('副本',a)

fun('信息','苍老师')

2、 编写程序处理理⽇志文件. 每天的日志都会统⼀写⼊到⼀个大文件中(可能上G). 现给出一个大的日志⽂件.
将⽇志文件中每天的日志摘出来. 生成每天的⼩⽂件, 需要时间的相关处理方法请⾃行百度
例如: 有如下⽂文件
2016-01-02 12:22:12 刘德华登录系统
2016-01-02 12:23:18 刘德华买了一盒中华⾹香烟
2016-01-02 12:24:55 刘德华退出系统
2016-01-03 01:00:22 麻花⼉疼登录系统
2016-01-03 01:10:32 刘德华疼登录系统
2016-01-03 04:30:21 麻花⼉疼买了一个麻花
2016-01-03 12:02:42 刘德华显示自己很溜溜 运⾏之后的结果. ⽣成两个文件: 2016-01-02.log

with open('log.txt','r',encoding='utf-8') as f:
    s = set()
    for i in f:
        c = i.strip().split()
        if c[0] not in s:
            s.add(c[0])
            with open('%s'%c[0],'w',encoding='utf-8') as w1:
                w1.write(i)
        else:
            with open('%s' % c[0], 'a+', encoding='utf-8') as w:
                # w.seek(0, 2)
                w.write(i)


3、⽤函数完成登录注册以及购物⻋车的功能.  难度系数一般
要求:
1, 启动程序, ⽤户可选择四个选项:
登录, 注册, 购物, 退出.
2, ⽤户注册, ⽤户名不能重复, 注册成功之后, ⽤用户名密码记录到文件中.
3, ⽤户登录, ⽤户名密码从⽂件中读取,进⾏三次验证, 验证不成功则退出整个程序.
4, ⽤户登录成功之后才能选择购物功能进行购物, 购物功能(就是将购物⻋封装到购物的函数中).
5, 退出则是退出整个程序.
      欢迎计⼊⽼男孩购物系统:
      1. 登录 2. 注册 3. 购物 4. 退出

代码:
import time,os
 
#文件名
file_name = 'user_list.txt'
 
 
def file_exists(*args,**kwargs):
    '''
    # 判断用户列表文件是否存在
    :return: True 存在 False 不存在
    '''
    # 判断文件是否存在
    if os.path.exists(file_name):
        return True
    else:
        with open(file_name, encoding='utf-8', mode='w') as mk:
            mk.write('张三    123')
            return False
 
 
def registered_username(username):
    '''
    #判断注册用户名是否可用
    :param username: 用户名
    :return: True 可用(用户不存在) False 不可用(用户已存在)
    '''
    # 纯用户名列表,不包含密码
    user_list = []
    with open(file_name, encoding='utf-8') as f1:
        for i in f1:
            # 去空格,以空格切割,转换为列表
            li = i.strip().split()  # [张三,123]
            # 将用户名追加到列表中
            user_list.append(li[0])
        # 判断用户名是否存在列表中
        if username in user_list:
            # 返回False
            return False
        else:
            return True
 
 
def write_file(username,password):
    '''
    #写入用户列表文件
    :param username: 用户名
    :param password: 密码
    :return: True 写入成功 False 写入失败
    '''
    with open(file_name, encoding='utf-8', mode='a') as f2:
        f2.write('\n{}    {}'.format(username, password))
        return True
 
 
def username_password(username,password):
    '''
    #判断用户名和密码是否匹配
    :param username: 用户名
    :param password: 密码
    :return: True 匹配成功 False 匹配失败
    '''
    # print(username,password)
    with open(file_name, encoding='utf-8', mode='r') as f3:
        for i in f3:
            # print(i)
            # 去空格,以空格切割,转换为列表
            li = i.strip().split()  # [张三,123]
            # 判断用户名和密码是否匹配
            if username == li[0] and password == li[1]:
                result = True
                # 当找到匹配时,跳出循环
                break
            else:
                result = False
        # 当整个用户列表遍历完成之后,再return
        return result
 
 
def register(*args,**kwargs):
    '''
    注册逻辑
    :return:
    '''
    while True:
        username = input('请输入注册的用户名,或输入q返回菜单:').strip()
        if username == '':
            print('用户名为空,请重新输入!')
        elif username.upper() == 'Q':
            break
        else:
            # 执行判断用户名函数
            result = registered_username(username)
            if result:
                password = input('请输入您的注册的密码:').strip()
                # 判断密码
                if password == '':
                    print('密码为空,请重新输入!')
                else:
                    # 执行写入用户列表文件函数
                    result = write_file(username, password)
                    if result:
                        print('注册成功!,您的用户名为: {}\n倒计时2秒返回菜单!'.format(username))
                        time.sleep(2)
                        user_menu()
                    else:
                        print('注册失败!请重试')
            else:
                print('用户名已经存在,请重新输入!')
 
 
def login(count=0,max=3):
    '''
    登录逻辑
    :param count: 初始失败次数
    :param max: 最大失败次数
    :return:
    '''
    while count < max:
        count += 1
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        # 执行验证用户名和密码函数
        result = username_password(username,password)
        if result:
            print('登陆成功\n倒计时1秒返回菜单!')
            time.sleep(1)
            user_menu()
            break
        else:
            print('用户名或密码错误,还剩余{}次机会!'.format(max - count))
 
    # 返回主菜单
    user_menu()
 
 
def user_menu(*args,**kwargs):
    '''
    # 用户菜单
    '''
    # 判断文件是否存在,不存在创建文件
    file_exists()
    # 循环
    while True:
        # 打印菜单
        menu = ['注册', '登录', '退出']
        print('bbs系统'.center(25, '#'))
        for i in range(len(menu)):
            print('{}\t{}'.format(i + 1, menu[i]))
        print(''.center(27, '#'))
        number = input('请选择序号: ').strip()
        if number == '1':
            # 执行注册程序
            register()
        elif number == '2':
            # 执行登录程序
            login()
        elif number == '3':
            exit()
        else:
            print('输入错误,请重新输入!')
 
 
# 执行菜单
user_menu()
4、IBM指数
创建并输出菜单, 菜单是不可变的. 所以使用元组
menus = ("1, 录入", "2, 查询", "3, 删除", "4, 修改", "5, 退出")

存储用户的信息    id: {'name':'名字', 'weight':体重, 'height':身高}
例如:目前有两个用户信息:1. 汪峰, 2. 章子怡
存储结构:
{
  1:{'name':'汪峰', 'weight':80, 'height':1.8, 'BMI':24.7},
  2:{'name':'章子怡', 'weight':50, 'height':1.65, 'BMI':18.4}
}
bodies = {}

body_id = 1  # 编号从1开始

体质指数(BMI)= 体重(kg)÷ (身高(m) x 身高(m))
体重的单位: KG
身高的单位: m
需求:首先。打印菜单,然后用户输入选择的菜单项
输入1:进入录入环节。用户需要录入:名字,身高,体重.
      由程序计算出BMI指数. 保存到bodies字典中. 第一个用户的id是1, 第二个是2, 以此类推
      录入完毕后. 提示用户是否继续录入. 如果选择是, 则继续进行录入, 直到用户输入否. 则返回到主菜单
输入2: 进入查询环节, 提示用户输入要查询的人的id. 如果不存在,给与提示, 如果存在. 则显示出该用户的全部信息(名字,身高,体重,BMI)
      然后提示用户是否继续查询. 如果选择是, 继续进行查询, 直到用户输入否, 返回主菜单
输入3: 进入删除环节, 提示用户输入要删除的人的id, 如果id不存在, 给与提示, 如果存在, 则执行删除操作. 并提示删除成功.
       然后提示用户是否继续删除, 如果是, 继续让用户选择要删除的id, 直到用户输入否, 返回主菜单
输入4: 进入修改环节, 首先让用户输入要修改的人的id, 根据id查找用户信息, 如果不存在, 给与提示, 如果存在, 将用户原信息进行打印,
      然后提示用户输入新的名字, 身高, 体重. 由程序重新计算BMI指数. 并将新的信息保存在bodies中. 同时给用户展示新的用户信息
      然后提示用户是否继续修改, 如果是, 则继续要求用户输入id信息. 直到用户输入否, 返回主菜单.
输入5: 程序退出.
输入其他任何内容. 都予以提示不合法. 让用户重新进行输入


代码区:
bodies = {}
tager = True
while tager:
    print('请输入相应的操作步骤(首菜单)'.center(50, '='))
    menus = ('1, 录入', '2, 查询', '3, 删除', '4, 修改', '5, 退出')
    for i in menus:
        print(i)

    print()
    usr = input("请输入操作序号: ").strip()
    if str(1) == usr:
        tager_1 = True
        while tager_1:
            print('录入菜单'.center(59, '+'))
            menus_ = ('1, 录入', '2, 返回上一层', '3, 查看')
            for v in menus_:
                print(v)
            print("".center(63, '='))

            usr_1 = input('请选择操作序号: ')
            if usr_1 == str(1):
                if not bodies :    # bodies == {} 的简便写法就是 not XX
                    body_id = 1
                else:
                    body_id = len(bodies)+1
                bodies[body_id] = {}
                bodies[body_id]['name'] = input("输入自己的姓名:").strip()
                bodies[body_id]['weigth'] = float(input("输入自己的体重:").strip())
                bodies[body_id]['heigth'] = float(input("输入自己的高度:").strip())
                bodies[body_id]['BMI指标'] = float("%.1f"%(bodies[body_id]['weigth']/(float(bodies[body_id]['heigth'])**2)))
                print('录入完成'.center(59,'='))

            elif usr_1 == str(2):
                tager_1 = False

            elif usr_1 == str(3):
                print(bodies)
            else:
                print("输入有误,请重试!")
                continue

    elif str(2) == usr:
        tager_2 = True
        while tager_2:
            print('查询菜单'.center(59, '+'))
            chaXun = input('请输入想要查询的姓名(输入0返回首页): ')
            if chaXun == str(0):
                tager_2 = False
                usr = 0
            else:
                l1 = []
                print("查询的数据".center(59, '-'))
                for i in bodies:
                    if chaXun == bodies[i]['name']:
                        l1.append(bodies[i])
                    else:
                        continue
                if not l1:    # 判断一个字典或则列表是个空集合时用 == {}  ==[]
                    print("                           查询无果!!!")
                else:
                    for i in l1:
                        print(i)

    elif str(3) == usr:

        tager_3 = True
        while tager_3:
            print("删除菜单".center(59, '+'))
            shanChu = input("请输入删除的名字(输入0返回首页)>>>  ")
            if shanChu == str(0):
                tager_3 = False
                usr = 0
            else:
                li = []
                for i in bodies:
                    if shanChu == bodies[i]['name']:
                        li.append(i)
                        break
                    else:
                        continue
                else:
                    print('%s 没有在数据库里面'%shanChu)
                for v in li:
                    del bodies[v]
                    print('%s  数据已删除!!!'%shanChu)

                tager_5 = True
                while tager_5:
                    print("".center(62, '+'))
                    usr_3 = input("2 ---> 查询删除后的数据    1 ---> 返回上一级     请选择操作>>> ").strip()
                    if str(2) == usr_3:
                        print(bodies)
                    elif str(1) == usr_3:
                        tager_5 = False

    elif str(4) == usr:
        tager_4 = True
        while tager_4:
            print('修改菜单'.center(59,'='))
            usr_4 = input('请输入要修改的名字(输入0返回首页)>>>  ')
            if usr_4 == str(0):
                tager_4 = False
                usr = 0
            else:
                for i in bodies:
                    if bodies[i]['name'] == usr_4:
                        bodies[i]['name'] = input("输入自己的姓名:").strip()
                        bodies[i]['weigth'] = float(input("输入自己的体重:").strip())
                        bodies[i]['heigth'] = float(input("输入自己的高度:").strip())
                        bodies[i]['BMI指标'] = float("%.1f" % (bodies[i]['weigth'] / (float(bodies[i]['heigth']) ** 2)))
                        print(bodies[i])
                        break
                    else:
                        continue
                else:
                    print("                 %s 没有在数据库中"%usr_4)

    elif str(5) == usr:
        exit()

    else:
        print('输入有误,请重试!')
        continue

 

zone  =  {
     '山东'  : {
         '青岛'  : [ '四方' , '黄岛' , '崂山' , '李沧' , '城阳' ],
         '济南'  : [ '历城' , '槐荫' , '高新' , '长青' , '章丘' ],
         '烟台'  : [ '龙口' , '莱山' , '牟平' , '蓬莱' , '招远' ]
     },
     '江苏'  : {
         '苏州'  : [ '沧浪' , '相城' , '平江' , '吴中' , '昆山' ],
         '南京'  : [ '白下' , '秦淮' , '浦口' , '栖霞' , '江宁' ],
         '无锡'  : [ '崇安' , '南长' , '北塘' , '锡山' , '江阴' ]
     },
     '浙江'  : {
         '杭州'  : [ '西湖' , '江干' , '下城' , '上城' , '滨江' ],
         '宁波'  : [ '海曙' , '江东' , '江北' , '镇海' , '余姚' ],
         '温州'  : [ '鹿城' , '龙湾' , '乐清' , '瑞安' , '永嘉' ]
     }
}
#省列表
province  =  list (zone.keys())
while  True :
     print ( '省' .center( 20 '*' ))
     # 打印省列表
     for  in  province:
         print ( '{}\t{}' . format (province.index(i) + 1 ,i))
     province_input  =  input ( '请输入省编号,或输入q/Q退出:' ).strip()
     if  province_input.isdigit():
         province_input  =  int (province_input)
         if  province_input >  0  and  province_input < =  len (province):
             #省编号,由于显示加1,获取的时候,需要减1
             province_id  =  province_input  -  1
             #城市列表
             city  =  list (zone[province[province_id]].keys())
             #进入市区列表
             while  True :
                 print ( '市' .center( 20 '*' ))
                 for  in  city:
                     print ( '{}\t{}' . format (city.index(j)  +  1 , j))
                 city_input  =  input ( "请输入市编号,或输入b(back)返回上级菜单,或输入q(quit)退出:" ).strip()
                 if  city_input.isdigit():
                     city_input  =  int (city_input)
                     if  city_input >  0  and  city_input < =  len (city):
                         # 市编号,由于显示加1,获取的时候,需要减1
                         city_id  =  city_input  -  1
                         #县列表
                         county  =  zone[province[province_id]][city[city_id]]
                         # 县列表
                         while  True :
                             print ( '县' .center( 20 '*' ))
                             for  in  county:
                                 print ( '{}\t{}' . format (county.index(k)  +  1 , k))
                             #到县这一级,不能输入编号了,直接提示返回菜单或者退出
                             county_input  =  input ( "输入b(back)返回上级菜单,或输入q(quit)退出:" ).strip()
                             if  county_input  = =  'b' :
                                 # 终止此层while循环,跳转到上一层While
                                 break
                             elif  county_input  = =  'q' :
                                 # 结束程序
                                 exit()
                             else :
                                 print ( "\033[41;1m已经到底线了,请返回或者退出!\033[0m" )
                     else :
                         print ( "\033[41;1m市编号 {} 不存在!\033[0m" . format (city_input))
                 elif  city_input.upper()  = =  'B' :
                     break
                 elif  city_input.upper()  = =  'Q' :
                     #由于在多层while循环里面,直接exit退出即可
                     exit()
                 else :
                     print ( "\033[41;1m输入市编号非法!\033[0m" )
         else :
             print ( "\033[41;1m省编号 {} 不存在!\033[0m" . format (province_input))
     elif  province_input.upper()  = =  'Q' :
         break
     else :
         print ( "\033[41;1m输入省编号非法!\033[0m" )

转载于:https://www.cnblogs.com/double-W/p/9460359.html

你可能感兴趣的:(练习题解答(一))