day15
""" 复习 程序的结构 文件夹(根目录) 包package 模块.py 类 函数 语句 模块和包的作用:程序结构清晰 导入: import 从根目录开始的路径.模块 as 别名 别名.成员 from 从根目录开始的路径.模块 import 成员 直接使用成员 from 从根目录开始的路径.模块 import * 直接使用成员 导包成功的标准: sys.path + 导包时的路径 可以正确找到文件 模块相关概念 __name__ """ if __name__ == "__main__": # 如果当前模块是主模块,才执行. print("测试代码") # demo01 """ 时间模块 time 10:10 练习:exercise01 / 02 """ import time # 1. 获取当前时间戳(从1970年1月1日到现在经过的秒数) # 1568856576.399807 print(time.time()) # 2. 获取当前时间元组 # tm_year=2019, tm_mon=9, tm_mday=19, tm_hour=9, tm_min=33, tm_sec=31, tm_wday=3, tm_yday=262, tm_isdst=0 print(time.localtime()) # 3. 时间戳 --> 时间元组 time_tuple = time.localtime(1568856576.399807) print(time_tuple) print("年份:",time_tuple[0]) print("星期",time_tuple[6] + 1) # 4. 时间元组 --> 时间戳 print(time.mktime(time_tuple)) # 5. 时间元组 --> str print(time.strftime("%y/%m/%d %H:%M:%S",time_tuple)) print(time.strftime("%Y/%m/%d %H:%M:%S",time_tuple)) # 6. str --> 时间元组 print(time.strptime("19/09/19 09:29:36","%y/%m/%d %H:%M:%S")) # demo02 """ 异常处理 练习:exercise03 练习:信息管理系统 练习:购物车 shopping__oo.py """ def div_apple(apple_count): """ 分苹果 """ person_count = int(input("请输入人数:")) # ValueError result = apple_count / person_count # ZeroDivisionError print("每人%d个苹果" % result) # 处理目的:让异常(错误)流程 转换为 正常流程 """ 1. 统一处理所有异常 try: # 可能出错的代码 div_apple(10) # except Exception:# 可以拦截所有错误(异常) except: print("程序出错啦") print("后续逻辑") """ """ 2. 分门别类的处理各种异常(官方更建议) try: # 可能出错的代码 div_apple(10) except ValueError: print("输入的不是整数,所以错误啦.") except ZeroDivisionError: print("输入的是零,所以错误啦.") print("后续逻辑") """ """ 可以处理错误执行逻辑,也可以处理没出错的执行逻辑 try: # 可能出错的代码 div_apple(10) except ValueError: print("输入的不是整数,所以错误啦.") except ZeroDivisionError: print("输入的是零,所以错误啦.") else: print("没出错执行的逻辑") print("后续逻辑") """ try: # 可能出错的代码 div_apple(10) finally: # 如果出错了,虽然我解决不了,但有个事我必须做. print("管你错不错呢,一定做!") print("后续逻辑") # demo03 """ 自定义异常类 练习:exercise04.py """ class WeightError(Exception): def __init__(self, message="", code="", id=0): # super().__init__() self.message = message self.code = code self.id = id class Wife: def __init__(self, name="", weight=0): self.name = name self.weight = weight @property def weight(self): return self.__weight @weight.setter def weight(self, value): if 20 <= value <= 200: self.__weight = value else: # 有意抛出异常 # 传递的错误信息:错误原因,错误代码,错误编号,..... # raise Exception("体重超过范围") raise WeightError("体重超过范围", "if 20 <= value <= 200", 1001) try: w01 = Wife("芳芳", 450) except WeightError as e: print("错误编号是:", e.id) print("错误信息:", e.message) print("错误代码:", e.code) # demo04 """ 使用可迭代对象 """ list01 = [234, 45, 54, 65, 6, 7, 8] # 可以被for的条件: # 对象具有__iter__方法 # for itme in list01: # print(itme) # for原理: # 1. 获取迭代器对象 iterator = list01.__iter__() # 2. 获取下一个元素(迭代一次) while True: try: item = iterator.__next__() print(item) # 3. 拦截StopIteration异常 except StopIteration: break # exercise01 """ 练习1:定义函数,根据年月日计算星期数. 星期一 星期二 .... 星期日 """ import time def get_week(year, month, day): time_tuple = time.strptime("%d/%d/%d" % (year, month, day), "%Y/%m/%d") # print(time_tuple[6])# 3 --> 星期四 # if time_tuple[6] == 0: # return "星期一" # if time_tuple[6] == 1: # return "星期二" tuple_weeks = ("星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日") return tuple_weeks[time_tuple[6]] print(get_week(2019, 9, 19)) # exercise02 # 练习:定义函数,根据生日(年月日),计算活了多天. # 公式:现在 - 生日 import time # 11:25 def life_days(year, month, day): # year,month,day --> 时间元组 time_tuple = time.strptime("%d/%d/%d" % (year, month, day), "%Y/%m/%d") life_second = time.time() - time.mktime(time_tuple) return life_second / 60 / 60 // 24 print("%d" % life_days(1999, 1, 1)) # exercise03 """ 练习:定义函数,在控制台中获取年龄. 要求:如果异常,或者年龄超过范围(0 -- 150)则重复获取 直到正确为止. """ def get_age(): while True: # 重复 try: age = int(input("请输入年龄:"))# 如果异常执行17行代码 if 0 <= age <= 150: return age else: print("年龄超过范围") except: # 异常状态 --> 正常状态 print("输入有误") print(get_age()) # 练习:对信息管理系统进行异常处理,要求:按照程序既定流程执行。 # exercise04 # 练习: 定义敌人类(姓名,攻击力),要求限制攻击力范围在0--50之间 # 如果不在范围内,抛出异常, # 传递3个错误信息(错误编号/错误信息/错误代码) class AtkError(Exception): def __init__(self, id=0, message="", code=""): super().__init__(message) self.error_id = id self.error_message = message self.error_code = code class Enemy: def __init__(self, name="", atk=0): self.name = name self.atk = atk @property def atk(self): return self.__atk @atk.setter def atk(self, value): if 0 <= value <= 50: self.__atk = value else: raise AtkError(101, "攻击力不在范围内", "if 0<=value<=50") # 如果想偷偷懒,也可以尝试使用Exception传递多个错误信息. # raise Exception("a","b","c") # try: # e01 = Enemy("灭霸", 100) # except AtkError as e: # print(e.error_message) try: e01 = Enemy("灭霸", 100) except Exception as e: print(e.args[0]) print(e.args[1]) print(e.args[2]) # 17:05 # exercise05 # 练习1:使用for循环原理(迭代思想),获取元组中所有元素. tuple01 = (4,4,5,6,7,9) iterator = tuple01.__iter__() while True: try: item = iterator.__next__() print(item) except StopIteration: break # exercise06 # 练习2:不适用for循环,获取字典中所有记录. dict01 = {"a": 1, "b": 2, "c": 3} iterator = dict01.__iter__() while True: try: key = iterator.__next__() print(key, dict01[key]) except StopIteration: break """ 对购物车进行异常处理 """ class CommodityModel: """ 商品模型 """ def __init__(self, id=0, name="", price=0): self.id = id self.name = name self.price = price class OrderModel: """ 订单模型 """ def __init__(self, commodity=None, count=0, id=0): self.id = id self.commodity = commodity self.count = count #shopping__oo class ShoppingCartController: """ 购物车逻辑控制器 """ init_order_id = 0 def __init__(self): self.__list_order = [] self.__list_commodity_info = self.__load_commodity() @property def list_order(self): return self.__list_order @property def list_commodity_info(self): return self.__list_commodity_info def __load_commodity(self): """ 加载商品信息 :return: 商品列表 """ return [ CommodityModel(101, "屠龙刀", 10000), CommodityModel(102, "倚天剑", 10000), CommodityModel(103, "九阴白骨爪", 8000), CommodityModel(104, "九阳神功", 9000), CommodityModel(105, "降龙十八掌", 8000), ] def add_order(self, order_base_info): """ 添加订单 :param order:订单基础信息 """ order_base_info.id = self.__generate_order_id() self.__list_order.append(order_base_info) def __generate_order_id(self): """ 生成订单编号 :return: 订单编号 """ ShoppingCartController.init_order_id += 1 return ShoppingCartController.init_order_id def get_total_price(self): """ 根据订单计算总价格 :return:总价格 """ total_price = 0 for item in self.__list_order: total_price += item.commodity.price * item.count return total_price def get_commodity_by_id(self, id): """ 获取指定的商品 :param id: 商品编号 :return: 商品对象 """ for item in self.__list_commodity_info: if item.id == id: return item class ShoppingConsoleView: """ 购物车控制台界面视图 """ def __init__(self): self.__controller = ShoppingCartController() def __select_menu(self): """ 菜单选择 """ while True: item = input("1键购买,2键结算。") if item == "1": self.__buying() elif item == "2": self.__settlement() def __buying(self): """ 购买 """ self.__print_commodity() self.__create_order() print("添加到购物车。") def __print_commodity(self): """ 打印商品信息 """ for commodity in self.__controller.list_commodity_info: print("编号:%d,名称:%s,单价:%d。" % (commodity.id, commodity.name, commodity.price)) def __create_order(self): """ 创建订单 """ while True: # cid = int(input("请输入商品编号:")) cid = self.__input_number("请输入商品编号:") # 如果该商品存在,则退出循环,否则重新输入。 commodity = self.__controller.get_commodity_by_id(cid) if commodity: break else: print("该商品不存在") # count = int(input("请输入购买数量:")) count = self.__input_number("请输入购买数量:") order = OrderModel(commodity, count) self.__controller.add_order(order) def __settlement(self): """ 结算 """ self.__print_order() total_price = self.__controller.get_total_price() self.__pay(total_price) def __print_order(self): """ 打印订单 """ for order in self.__controller.list_order: commodity = order.commodity print("商品:%s,单价:%d,数量:%d." % (commodity.name, commodity.price, order.count)) def __pay(self, total_price): """ 支付 :param total_price: 需要支付的价格 :return: """ while True: # money = float(input("总价%d元,请输入金额:" % total_price)) money = self.__input_number("总价%d元,请输入金额:" % total_price) if money >= total_price: print("购买成功,找回:%d元。" % (money - total_price)) self.__controller.list_order.clear() break else: print("金额不足.") def main(self): """ 界面入口 """ while True: self.__select_menu() def __input_number(self, message): while True: try: number = int(input(message)) return number except: print("输入有误") try: view = ShoppingConsoleView() view.main() except: print("对不起,我错了。")