day3-exercise

# Author: 刘佳赐-Isabelle October 28,2018

"""
1. 文件a1.txt内容

        序号     部门      人数      平均年龄      备注
        1       python    30         26         单身狗
        2       Linux     26         30         没对象
        3       运营部     20         24         女生多
        .......
        通过代码,将其构建成这种数据类型:
            [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},......]
"""
# with open("a1.txt", "w", encoding="utf-8") as f1:
#     message = """
#     序号     部门      人数      平均年龄      备注
#     1       python    30         26         单身狗
#     2       Linux     26         30         没对象
#     3       运营部     20         24         女生多
#     """
#     f1.write(message)
#
# with open("a1.txt", "r", encoding="utf-8") as f2:
#     lis = []
#     line_num = 0
#     for line in f2:
#         if len(line.strip()) > 0:
#             lis.append(line.strip().split())
#             line_num += 1
#
# result = []
# for i in range(1, line_num):
#     dic = {}
#     for j in lis[0]:
#         dic[j] = lis[i][lis[0].index(j)]
#     result.append(dic)
# print(result)

"""
2. 传入函数的字符串中,[数字]、[字母]、[空格] 以及 [其他]的个数,并返回结果。
"""
# def func2(a=str):
#     num = 0
#     alpha = 0
#     nul = 0
#     other = 0
#     for i in a:
#         if i.isdigit():
#             num += 1
#         elif i.isalpha():
#             alpha += 1
#         elif i == " ":
#             nul += 1
#         else:
#             other += 1
#     return num, alpha, nul, other
#
#
# message = input("请输入信息:")
# print(func2(message))


"""
3. 写函数,接收两个数字参数,返回比较大的那个数字。
"""
# def func3(a, b): return a if a > b else b
# print(func3(2, 3))


"""
4. 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
"""
# def func4(dic):
#     for keys in dic:
#         if len(dic[keys]) > 2:
#             dic[keys] = dic[keys][:2]
#     return dic
#
#
# dic_check = {"k1": "v1v1", "k2": [11, 22, 33, 44]}
# print(func4(dic_check))


"""
5. 写函数,此函数只接收一个参数且此参数必须是列表数据类型,此函数完成的功能是返回给调用者一个字典,
此字典的键值对为此列表的索引及对应的元素。
例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
"""
# enumerate函数
# def func5(a=[]):
#     result = {}
#     for index, name in enumerate(a, 0):
#         result[index] = name
#     return result
#
#
# lis = [11, 22, 33]
# print(func5(lis))

# for 循环法
# def func5(args=[]):
#     result = {}
#     for i in args:
#         result.setdefault(args.index(i), i)
#     return result
#
#
# test = [11, 22, 33]
# print(func5(test))


"""
6. 写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,
然后将这四个内容传入到函数中,此函数接收到这四个内容,将内容追加到一个student_msg文件中。

"""
# def func6(name, gender, age, degree):
#     with open("student_msg", "a", encoding="utf-8") as f1:
#         f1.write("{}  {}  {}  {}\n".format(name, gender, age, degree))
#
#
# name = input("请输入姓名:")
# gender = input("请输入性别:")
# age = input("请输入年龄:")
# degree = input("请输入学历:")
# func6(name, gender, age, degree)


"""
7. 对第6题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女。
"""
# def func6(name, age, degree, gender="男"):
#     with open("student_msg", "a", encoding="utf-8") as f1:
#         f1.write("{} {} {} {}\n".format(name, age, gender, degree))
#
# while 1:
#     name = input("请输入姓名(Q/q退出):")
#     if name.upper() == "Q": break
#     else:
#         age = input("请输入年龄:")
#         degree = input("请输入学历:")
#
#         if name.startswith("1"):
#             gender = input("请输入性别:")
#             func6(name.strip("1").strip(" "), age, degree, gender)
#         else:
#             func6(name, age, degree)


"""
8. 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作。
        读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
            a=10
            b=20
            def test5(a,b):
                    print(a,b)
            c = test5(b,a)
            print(c)
"""
# def func8(file_path, gender):
#     with open(file_path, mode="r+", encoding="utf-8") as file:
#         f1 = file.read()
#         f1.replace(gender, "Male")
#
# func8("student_msg", "男")


# 打印出来的值a,b,c分别是:20,10,None
# 因为test5按顺序打印输入的b(20), a(10), 且函数test5没有任何返回值
# a = 10
# b = 20
# def test5(a, b):
#     print(a, b)
# c = test5(b, a)
# print(c)

"""
9. 读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
        a=10
        b=20
        def test5(a,b):
            a=3
            b=5
            print(a,b)
        c = test5(b,a)
        print(c)
"""

# 打印出来的值a,b,c分别是:3,5,None
# 因为test5给a/b分别赋值为3/5,且函数没有任何返回值
# a = 10
# b = 20
#
#
# def test5(a, b):
#     a = 3
#     b = 5
#     print(a, b)
#
#
# c = test5(b, a)
# print(c)

"""
10. 写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),将每个实参的每个元素依次添加到函数的动态参数args里面.
        例如 传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)
"""
#
#
# def func10(*args):
#     return args
#
#
# l1 = [1, 2, 3]
# t1 = (22, 33)
#
# print(func10(*l1, *t1))

"""
11. 写函数,传入函数中多个实参(实参均为字典),将每个实参的键值对依次添加到函数的动态参数kwargs里面.
    例如 传入函数两个参数{‘name’:’alex’} {‘age’:1000}最终kwargs为{‘name’:’alex’ ,‘age’:1000}
"""

#
# def func11(**kwargs):
#     return kwargs
#
#
# dic1 = {"name": "alex"}
# dic2 = {"age": 1000}
# print(func11(**dic1, **dic2))


"""
12. 下面代码成立么?如果不成立为什么报错?怎么解决?
        题目一:
            a = 2
            def wrapper():
                    print(a)
            wrapper()

        题目二:
            a = 2
            def wrapper():
                    a += 1
                print(a)
            wrapper()
        题目三:
            def wrapper():
                    a = 1
                    def inner():
                        print(a)
                    inner()
                wrapper()
        题目四:
            def wrapper():
                    a = 1
                    def inner():
                        a += 1
                        print(a)
                    inner()
                wrapper()
"""
# 题目一:成立

# 题目二:不成立,函数不可以修改全局变量
# a = 2
# def wrapper():
#     global a
#     a += 1
# print(a)
# wrapper()

# 题目三:成立

# 题目四:不成立
# def wrapper():
#     a = 1
#     def inner():
#         nonlocal a
#         a += 1
#         print(a)
#     inner()
# wrapper()


"""
13. 写函数,接收两个数字参数,将较小的数字返回.

"""

# def func13(a, b): return a if a < b else b
#
#
# a = input("please input a:")
# b = input("please input b:")
# result = func13(a, b)
# print(result)


"""
14. 写函数,接收一个参数(此参数类型必须是可迭代对象),将可迭代对象的每个元素以’_’相连接,形成新的字符串,并返回.
    例如 传入的可迭代对象为[1,'老男孩','武sir']返回的结果为’1_老男孩_武sir’

"""

# def func14(lis):
#     for item in lis:
#         lis[lis.index(item)] = str(item)
#     return "_".join(lis)
#
# li = [1, "老男孩", "武sir"]
# print(func14(li))

"""
15. 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
    例如:如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置函数)
"""
# 
# def func15(*args):
#     result = {}
#     result["max"] = max(args)
#     result["min"] = min(args)
#     return result
# 
# res = func15(2, 5, 7, 8, 4)
# print(res)
# 

"""
16. 写函数,传入一个参数n,返回n的阶乘
        例如:cal(7)  计算7*6*5*4*3*2*1
"""
# def func16(a=int):
#     result = a
#     while 1:
#         if a > 1:
#             a -= 1
#             result = result * a
#         else:
#             break
#     return result
#
# print(func16(6))
#

"""
17. 写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
        例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
"""
# def func17(l1, l2):
#     result = []
#     for suit in l1:
#         for num in l2:
#             result.append((suit, num))
#     return result
#
#
# lis1 = ["红心", "草花", "方片", "黑桃"]
# lis2 = []
# for i in range(2, 14, 1):
#     lis2.append(i)
# lis2.append("A")
# print(func17(lis1, lis2))


"""
18. 有如下函数:
    def wrapper():
            def inner():
                print(666)
        wrapper()

    你可以任意添加代码,用两种或以上的方法,执行inner函数.
"""
# 方法1
# def wrapper():
#     def inner():
#         print(666)
#     inner()
#
# wrapper()

# 方法2
#
# def wrapper():
#     def inner():
#         print(666)
#     return inner()
# wrapper()


"""
购物车进阶
1,启动程序,用户可选择四个选项:登录,注册,购物,退出。
2,用户注册,用户名不能重复,注册成功之后,用户名密码记录到文件中。
3,用户登录,用户名密码从文件中读取,进行三次验证,验证不成功则退出整个程序。
4,用户登录成功之后才能选择购物功能进行购物,购物功能(就是将购物车封装到购物的函数中)。
5,退出则是退出整个程序。
"""

#
# def register():
#     username = input("Please set your username:")
#     username_check = []
#     with open("userbook", "r+", encoding="utf-8") as file:
#         for line in file:
#             username_check.append(line.strip().split()[0])
#         while 1:
#             if username not in username_check:
#                 password = input("Please set your password:")
#                 file.write("{} {}\n".format(username, password))
#                 print("Successfully registered! Please login!")
#                 break
#             elif username in username_check:
#                 print("Username has been taken, please reset your username!!")
#                 username = input("Please set your username again:")
#     return login()
#
#
# def login():
#     times = 0
#     username = input("Please input your username:")
#     password = input("Please input your password:")
#     user_info = [username, password]
#     check_list = []
#     with open("userbook", "r", encoding="utf-8") as file:
#         for line in file:
#             check_list.append(line.strip().split())
#     while 1:
#         if user_info in check_list:
#             print("Login successfully! You could start shopping!")
#             return shopping()
#         elif user_info not in check_list and times < 2:
#             print("Incorrect user name or password, left %d times!" % (2-times))
#             username = input("Please input username again:")
#             password = input("Please input password again:")
#             user_info = [username, password]
#             times += 1
#         elif user_info not in check_list and times >= 2:
#             print("Failed for three times!! You account has been locked!")
#             break
#
#
# def shopping():
#     message = """
#     1 电脑 1999
#     2 鼠标 10
#     3 耳机 388
#     n 购物车结算
#     """
#
#     item_dic = {1: "电脑", 2: "鼠标", 3: "耳机"}  # 创建商品名称字典
#     price_dic = {1: 1999, 2: 10, 3: 388}  # 创建商品价格字典
#
#     # 依据商品名称字典创建购物车商品名称与商品数量字典
#     item_num_dic = {}
#     for i in range(len(item_dic.keys())):
#         defaul_num = [0] * len(item_dic.keys())
#         item_num_dic.setdefault(list(item_dic.values())[i], defaul_num[i])
#
#     total_budget = 0.0  # 购物车商品总计金额
#     item_name = []  # 购物车商品名称列表
#
#     my_purse = input("请输入存入金额:")
#     print(message)
#     item_num = input("请输入需要购买商品的编号:")
#
#     while 1:
#         if item_num == "n":
#             if total_budget <= float(my_purse):
#                 print("已购买商品:")
#                 for i in range(len(item_name)):
#                     print("{}{} {} {}".format(str(i + 1), ".", item_name[i], str(item_num_dic[item_name[i]])))
#                     # print(str(i + 1) + ". " + item_name[i] + " " + str(item_num_dic[item_name[i]]))
#                 print("总计:%f" % total_budget)
#                 print("余额:%f" % (float(my_purse) - total_budget))
#                 break
#             else:
#                 del_item = input("已超预算,请删减购物车产品:")
#                 # 当输入编号有效、超出预算且该商品购物车数量为1时,购物列表删掉该商品、商品数量减1、预算减去相应商品价格
#                 if item_dic[int(del_item)] in item_name and total_budget > float(my_purse) and \
#                                 item_num_dic[item_dic[int(del_item)]] == 1:
#                     item_num_dic[item_dic[int(del_item)]] -= 1
#                     total_budget -= price_dic[int(del_item)]
#                     item_name.pop(int(del_item) - 1)
#                 # 当输入编号有效、超出预算且该商品购物车数量大于1时,购物列表不变、对应商品数量减1、预算减去相应商品价格
#                 elif item_dic[int(del_item)] in item_name and total_budget > float(my_purse) and \
#                                 item_num_dic[item_dic[int(del_item)]] > 1:
#                     item_num_dic[item_dic[int(del_item)]] -= 1
#                     total_budget -= price_dic[int(del_item)]
#                 # 特殊情况:当输入参数无效时,提示重新输入
#                 elif item_dic[int(del_item)] not in item_name:
#                     del_item = input("内容有误,请重新输入:")
#         elif item_num in str(item_dic.keys()):
#             message1 = """---%s已添加到您的购物车,单价为%.2f---""" % (item_dic[int(item_num)], price_dic[int(item_num)])
#             print(message1)
#             if item_dic[int(item_num)] in item_name:
#                 item_num_dic[item_dic[int(item_num)]] += 1  # 若已有该产品,则只增加该产品购买数量
#             else:
#                 item_name.append(item_dic[int(item_num)])  # 若没有该产品,则将该产品添加到购买列表
#                 item_num_dic[item_dic[int(item_num)]] += 1  # 同时增加产品购买数量
#             total_budget += price_dic[int(item_num)]  # 累计消费额
#             item_num = input("请继续输入商品编号:")  # 继续购买
#         elif item_num.upper() == "Q":
#             print("已购买商品:")
#             for i in range(len(item_name)):
#                 print(str(i + 1) + ". " + item_name[i] + " " + str(item_num_dic[item_name[i]]))
#             print("总计:%f" % total_budget)
#             print("余额:%f" % (float(my_purse) - total_budget))
#             break
#         else:
#             item_num = input("输入有误,请重新选择:")
#
#
# if __name__ == '__main__':
#     message = input("Please select your command(R/L):")
#     if message.upper() == "R":
#         register()
#     elif message.upper() == "L":
#         login()
#     else:
#         message = input("Incorrect input, please reselect your command(R/L):")

 

posted @ 2018-10-28 12:49  Isabelle-古灵精  阅读(176)  评论(0编辑  收藏  举报