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)