11 异常与模块

11.1 异常与其捕获

"""
异常:  就是解释器处理不理了的一些错误,它会把异常信息抛出

Traceback (most recent call last):
  File "D:/day10/13-异常及其捕获.py", line 6, in <module>
    print(a)
NameError: name 'a' is not defined

"""
# print("程序开始")
# print(a)
# num = 2/0
# # print(num)
# # open("hello.txt", "r")
# print("程序结束")
# print(a)
# open("hello.txt", "r")

try:
    # print(a)
    # open("hello.txt", "r")
    num = 2/0
    # print(123456)
except NameError:
    print("变量名错误")
except FileNotFoundError:
    print("文件找不到")
# except ZeroDivisionError:
#     print("除数不能为0")
except Exception as e:   # Exception是所有异常类的父类
    print("前面所有的except都捕获不到异常,但是try里面又确实出现异常,就会被这个except Exception所捕获")
    print(e)  # e 是一个异常信息
else:
    # 没有发生异常的时候执行else里面的代码
    print("else - 这里的代码什么时候执行")
finally:
    # 有或者没有异常的时候,都会执行finally里面的代码
    print("finally - 这里的代码什么时候执行")

11.2 名片管理器-异常版

"""

{"name": '诸葛亮', "age": 40, "sex": "男"}

[{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}]


思路:
1、把添加过的数据保存在一个文件中(保存的格式为列表:[{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}])
2、每一次运行,先读取文件中的名片数据(列表),把数据赋值给info_list,这个步骤称为加载数据
3、操作完文件之后,要退出系统之前,要保存数据(把info_list重新写入到文件中)

注意: 实际上,我们修改、删除、添加数据都是对变量info_list进行操作,而不是文件
"""
import sys
import os


info_list = []  # 这个列表用来保存所有的名片,它里面每一个元素就是每一个小名片(列表)

user_name = "admin"
password = "123456"

file_name = "info.txt"


def load_info():
    """加载数据: 读取文件中的名片数据,把数据赋值给info_list"""
    global info_list
    try:
        f = open(file_name, "r", encoding="utf-8")
    except FileNotFoundError:
        f = open(file_name, "w", encoding="utf-8")
        f.write("[]")
        f.close()
        f = open(file_name, "r", encoding="utf-8")

    info_list = eval(f.read())   # 读取到的数据类型是字符串, 读取到的数据是“[{"name": '诸葛亮', "age": 40, "sex": "男"}]”
    f.close()


def save_info():
    """退出系统之前,要保存数据(把info_list重新写入到文件中)"""
    f = open(file_name, "w", encoding="utf-8")
    f.write(str(info_list))  # write的参数建议是字符串,不能是列表
    f.close()


def welcome():
    """
        打印界面 
    """
    print("-" * 30)
    print("--------名片管理器v1.0--------")
    print("----1、添加名片")
    print("----2、删除名片")
    print("----3、修改名片")
    print("----4、查询名片")
    print("----5、查询所有名片")
    print("----6、退出系统")
    print("-" * 30)


def add_info():
    """添加名片功能的函数"""
    name = input("请输入姓名:")
    age = input("请输入年龄:")
    sex = input("请输入性别:")
    dic = {"name": name, "age": age, "sex": sex}
    info_list.append(dic)  # 把name, age, sex整合成一个小列表,追加到大列表info_list中
    print("【INFO】:添加成功!")
    print(info_list)  # 自己测试用,看看有没有添加成功


def del_info():
    """删除名片功能的函数"""
    name = input("请输入要删除这个名片的姓名:")
    for i in info_list:  # i就是每一个小列表
        if name in i.values():  # 判断名字在不在小列表中
            # 在,才执行这里的代码,就删除
            # 在大列表中删除小列表
            info_list.remove(i)
            print("【INFO】:删除成功!")
            print(info_list)
            break  # 如果找到第一个成功了,后面不用再找了
    else:
        print("【ERROR】:删除不成功,查无此人!")


def modify_info():
    name = input("请输入要修改这个名片的姓名:")
    for i in info_list:  # i就是每一个小列表
        if name in i.values():  # 判断名字在不在小列表中
            # 在,才执行这里的代码,就修改
            new_name = input("请输入新的姓名:")
            new_age = input("请输入新的年龄:")
            new_sex = input("请输入新的性别:")
            # 如果在列表中修改数据?通过下标来修改:列表名[下标] = 值
            info_list[info_list.index(i)] = {"name": new_name, "age": new_age, "sex": new_sex}
            print("【INFO】:修改成功!")
            print(info_list)
            break  # 如果找到第一个成功了,后面不用再找了
    else:
        print("【ERROR】:删除不成功,查无此人!")


def search_info():
    name = input("请输入要查询的名片的姓名:")
    for i in info_list:  # i就是每一个小列表
        if name in i.values():  # 判断名字在不在小列表中

            print("【INFO】:这个人的信息如下:%s" % i)
            break  # 如果找到第一个成功了,后面不用再找了
    else:
        print("【ERROR】:删除不成功,查无此人!")


def search_all_info():
    uname = input("请输入管理员账号:")
    pwd = input("请输入管理员密码:")

    if uname == user_name and pwd == password:
        # 展示所有数据
        # [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
        print(info_list)
        # for i in info_list:
        #     # print(i)
        #     for j in i:
        #         print(j, end="\t")
        #     print()

    else:
        print("【ERROR】:用户名或者密码错误")


def sys_exit():
    sign = input("确定要退出系统吗?(yes or no):")
    # if sign == "yes" or sign == "y":
    # if sign in ["yes", "y", "Y", "YES"]:
    if sign.lower() in ["yes", "y"]:
        print("【INFO】:成功退出系统!")
        sys.exit()


def main():
    # 先判断目录下有没有这个文件
    # if os.path.exists(file_name):
    #     load_info()
    # else:
    #     # 就证明没有这个文件,就应该创建文件
    #     f = open(file_name, "w", encoding="utf-8")
    #     f.write("[]")
    #     f.close()
    #     load_info()
    load_info()

    while True:

        # 打印界面
        welcome()

        # 让用户输入数字,表示对应的操作
        command = input("请输入数字1~5表示对应的操作:")

        # 判断用户输入的这个数字command,根据它来执行对应的功能(代码)
        if command == "1":
            # 添加名片  就是 往大列表info_list,添加某个人的名片
            add_info()

        elif command == "2":
            # 删除名片
            # [{"name": '诸葛亮', "age": 40, "sex": "男"}, {"name": '刘备', "age": 45, "sex": "男"}]
            del_info()

        elif command == "3":
            # 修改名片
            #
            modify_info()

        elif command == "4":
            # 查询名片
            # [['诸葛亮', '40', '男'], ['刘备', '45', '男']]
            search_info()

        elif command == "5":
            # 查询所有名片
            search_all_info()

        elif command == "6":
            # 退出系统
            # break
            save_info()
            sys_exit()
        else:
            print("【ERROR】:请务必输入数字1~5")


if __name__ == "__main__":
    main()   # 入口函数

11.3 模块

模块----本质是python文件
    1、导入模块和使用格式:
        1、import 模块名        (文件名)
            使用:    模块名.变量名/函数名/类名
            
        2、from 模块名 import 变量名/函数名/类名
            使用: 变量名/函数名/类名
            
        3、from 模块名 import *    # *通配符表示 任意的变量名/函数名/类名都导入进来
            使用: 变量名/函数名/类名

    2、模块中的__all__:
        __all__ = ["a"]   # __all__决定了这个Python文件中的哪一个数据(变量名/类名/函数名)允许被通过 from module_1 import * 导入

        __all__的用法
        from module_1 import *    #  __all__只能影响这种导入方式的导入结果
        print(a)   # 如果module_1模块中的__all__列表中没有这个a的话,就不能够使用到module_1模块中的a

11.4 name

当这个模块自己运行的时候,这个__name__的值是"__main__"
当这个模块被其他文件导入而运行的时候,这个__name__的值是"module_1"   (即模块名)
功能:__name__就是用来区分这次跑的代码是自己在运行还是被导入的时候运行的	

11.5 包的使用

"""
1、import 包名.模块名 as 简写
    使用: 简写.变量名/函数名/类名

2、from 包名.模块名 import 变量名/函数名/类名
    使用:变量名/函数名/类名
    
3、from 包名.模块名 import *   # 表示在这个模块中导入任意的变量名/函数名/类名 
    使用:变量名/函数名/类名  
    
4、from 包名 import 模块名
    使用: 模块名.变量名/函数名/类名
    
5、from 包名 import *       # 特殊情况:需要这个包中的__init__.py文件中有__all__这个列表,并且列表中得有这个模块名,列表中出现的模块名才允许被导入
    使用: 模块名.变量名/函数名/类名

"""

# import module.module_1 as md_1
#
# print(md_1.a)
# md_1.fn1()
#  --------------------------

# from module.module_1 import a
# print(a)
# ---------------------------
# from module.module_1 import *
#
# print(a)
# fn1()
# ---------------------------
# from module import module_1
# print(module_1.a)
# module_1.fn1()
# ---------------------------

# from module import *
# print(module_1.a)

11.6 CS

"""

"""


class Player(object):

    def __init__(self, name):
        self.name = name
        self.hp = 100
        self.gun = None

    def __str__(self):
        return "%s的剩余血量为%s" % (self.name, self.hp)

    def take_gun(self, obj):
        self.gun = obj
        print("%s拿起了一把%s" % (self.name, obj.name))

    # 拿起枪
    # lao_zhuang.take_gun(gun)

    def biubiubiu(self, sbd):
        self.gun.shoot(sbd)


class Bullet(object):

    def hit(self, sbd):
        sbd.hp -= 20
        print("子弹打中了%s, 剩余的血量为:%s" % (sbd.name, sbd.hp))


class Gun(object):

    def __init__(self, name):
        self.name = name
        self.bullets = []   # 存放子弹

    def __str__(self):
        return "这是一把%s" % self.name

    def get_bullets(self):
        self.bullets = [Bullet() for _ in range(10)]
        print(self.bullets)

    def shoot(self, sbd):
        bullet = self.bullets.pop()   # self.bullets.pop()删除一颗子弹,并且返回这个对象,所以bullet就是子弹对象
        bullet.hit(sbd)


class Enemy(object):

    def __init__(self, name):
        self.name = name
        self.hp = 100

    def __str__(self):
        return "%s的剩余血量为%s" % (self.name, self.hp)

lao_zhuang = Player("老庄")
print(lao_zhuang)
gun = Gun("AK47")
print(gun)
enemy = Enemy("敌人")
print(enemy)
# 拿起枪
lao_zhuang.take_gun(gun)

# print(id(gun))      # 这两个id一致
# print(id(lao_zhuang.gun))
# 装子弹
gun.get_bullets()
# lao_zhuang.gun.get_buttles()
# 开枪
lao_zhuang.biubiubiu(enemy)
lao_zhuang.biubiubiu(enemy)
lao_zhuang.biubiubiu(enemy)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值