Python学习笔记5 模块module一个.py文件就是一个模块模块是Python程序的基本组织单位。在模块中可以定义变量、类、函数以及可执行的代码。使用import导入之后直接使用。导入模块语法导入形式代码样例调用方式调用样例import 模块名import random, os模块名.功能名random.randint(10, 100)import 模块名 as 别名import random as rd别名.功能名rd.randint(10, 100)form 模块名 import 功能名from random import randint功能名randint(10, 100)form 模块名 import 功能名 as 别名from random import randint as rint别名rint(10, 100)form 模块名 import *from random import *功能名randint(10, 100)自定义模块当开发一些复杂的项目为了让项目结构更清晰更便于项目的维护管理及代码的复用可以把一个项目拆分为若干的模块。每隔一python文件都可以作为一个模块模块的名字就是文件的名字。PI 3.1415926 NAME Miracle def log_separator1(): print(- * 30) def log_separator2(): print( * 30) def log_separator3(): print(* * 30) def log_separator4(): print(# * 30) # __name__: Python中的内置变量表示当前模块的名字 # 直接运行的当前模块__name__的值为__main__当该模块被导入时__name__的值就是模块名。 # 执行当前文件则会执行如下代码如果被当做模块导入就不会执行如下代码 if __name__ __main__: log_separator1()__all____all__是一个模块级别的特殊变量用于指定form 模块名 import *时会导入哪些功能*通配了哪些功能其他功能不能被调用。__all__ [log_separator1, PI, NAME] PI 3.1415926 NAME Miracle def log_separator1(): print(- * 30) def log_separator2(): print( * 30) def log_separator3(): print(* * 30) def log_separator4(): print(# * 30)包包本质就是一个文件夹该文件夹中可以包含若干python模块文件夹下还包含了一个__init__.py文件。模块文件较多时用来管理多个模块包的本质也是一个模块。导入形式代码样例调用方式调用样例import 包名.模块名import utils.my_func包名.模块名.功能名utils.my_func.log_separator1()from 包名 import 模块名from utils import my_func模块名.功能名my_func.log_separator1()form 包名 import *from utils import *模块名.功能名my_func.log_separator1()form 包名.模块名 import 功能名from utils.my_func import log_separator1功能名log_separator1()form 包名.模块名 import *from utils.my_func import *功能名log_separator1()如果要用form 包名 import *导入包中的所有模块需要在__init__.py中添加__all__ [模块名]面向对象基础面向过程编程把一个需求拆解成一系列要执行的步骤然后按照步骤依次执行这些任务关注的是流程和步骤。适用于简单、线性的任务。类描述的是一组具有相同属性特征和方法功能/行为的模板。对象对象可以理解为现实中具体的人/物在程序中的数字化身把一个人/物的特征属性和功能方法打包到一起是面向对象编程的基本单元。是类的实例是基于类创建出来的对象的实例化。类的定义class 类名: pass 对象名 类名() 对象名.属性名1 属性值1 对象名.属性名2 属性值2类名遵循大驼峰命名法每个单词的首字母都是大写单词之间没有分隔符。__dict__是python中用户自定义类实例的一个特殊属性用于以字典形式存储对象的属性。# 定义类 class Car: pass c1 Car() # 动态为对象添加属性-----不推荐 c1.color yellow c1.brand BMW c1.name X5 c1.price 500000 print(c1.__dict__) # 输出结果 # {color: yellow, brand: BMW, name: X5, price: 500000}定义在类的外面的称之为函数定义在类中的函数称之为方法。__init__初始化方法对象创建后自动调用主要用于设置对象的初始状态设置对象属性self为方法的第一个参数表示当前创建的实例对象。# 定义类 class 类名: # __init__初始化方法对象创建后自动调用主要用于设置对象的初始状态设置对象属性 def __init__(self, 参数列表): # 在类的定义中直接设置对象属性 self.属性名 参数值 self.属性名 参数值 # 创建对象 对象名 类名(参数列表)在类中定义实例方法时定义语法与之前的函数定义的方式是一样的。# 定义类 class 类名: def __init__(self, 形参列表): self.属性名 参数值 self.属性名 参数值 def 方法名(self, 形参列表): pass def 方法名(self, 形参列表): pass # 创建对象 对象名 类名(参数列表) 对象名.方法名(实参)魔法方法指Python中提供的以双下划线开头和结尾的特殊方法用于定义类的特殊行为比如__init__。不需要手动调用Python会在合适的时机自动调用。__init__初始化方法__str__字符串表示的方法__eq__比较两个对象是否相等__lt__, __le__, __gt__, __ge__支持比较两个对象的大小小于less than小于等于less than or equal大于gerater than大于等于greater than or equalclass Car: def __init__(self, c_color, c_brand, c_name, c_price): self.color c_color self.brand c_brand self.name c_name self.price c_price def running(self): print(f{self.brand} {self.name}正在行驶中...) # 定义魔法方法 def __str__(self): return f{self.brand} {self.name} {self.price} def __eq__(self, value): return self.price value.price and self.brand value.brand and self.name value.name and self.color value.color def __lt__(self, value): return self.price value.price c1 Car(yellow, BMW, X5, 50000) # BMW X5 50000 如果没有定义魔法方法输出__main__.Car object at 0x0000000003084610 print(c1) c2 Car(yellow, BMW, X5, 50000) # BMW X5 50000 如果没有定义魔法方法输出__main__.Car object at 0x0000000003084890 print(c2) # True 如果没有定义魔法方法输出False因为用是判断两个对象地址是否相等 print(c1 c2) # false 如果没有定义魔法方法报错 print(c1 c2)实例属性与类属性实例属性属于每个具体对象的属性每个对象都是独立的。是各个对象特有的数据。类属性是属于类本身的属性所有实例共享的。是所有对象共享的数据或配置。如果实例属性和类属性名称重复通过实例对象查找属性时会先查找实例属性如果实例属性不存在再查找类属性。# 定义类 class 类名: 类属性名 值 类属性名 值 def __init__(self, 参数列表): self.实例属性名 参数值 self.实例属性名 参数值 # 创建对象 对象名 类名(参数列表) 对象名.属性名案例要求采用面向对象的编程思想完成教务管理系统的开发。教务管理系统可以管理在校学生的成绩信息通过控制台菜单与用户交互具体功能如下1. 添加学生成绩根据输入的学生姓名、语文成绩、数学成绩、英语成绩记录在系统中2. 修改学生成绩根据输入的学生姓名修改对应的学生成绩3. 删除学生成绩根据输入的学生姓名删除对应的学生成绩4. 查询指定学生成绩根据输入的学生姓名查找对应的学生成绩并输出5.展示全部学生成绩展示出系统中所有学生的成绩思路首先确定需要两个类教务系统类EduManagement和学生类StudentStudent属性需要有学生姓名、语文成绩、数学成绩、英语成绩功能需要有修改成绩。EduManagement属性需要有在校学生信息以上要求中五个功能都是教务系统的功能。class Student: def __init__(self, s_name, s_chinese, s_math, s_english): self.name s_name self.chinese s_chinese self.math s_math self.english s_english # 查询 def __str__(self): return f姓名{self.name} | 语文{self.chinese} | 数学{self.math} | 英语{self.english} | 总分{self.chinese self.math self.english} # 修改 def edit(self, chineseNone, mathNone, englishNone): if chinese is not None: self.chinese chinese if math is not None: self.math math if english is not None: self.english english class EduMangement: system_version 1.0.0 system_name 教务管理系统 def __init__(self): # 记录在校学生信息 self.student_list [] # 添加学生成绩 def add_student(self): name input(请输入学生姓名) # 不支持重名 for stu in self.student_list: if stu.name name: print(添加失败该学生已存在) return chinese int(input(请输入语文成绩)) math int(input(请输入数学成绩)) english int(input(请输入英语成绩)) if 0 chinese 100 and 0 math 100 and 0 english 100: stu Student(name, chinese, math, english) self.student_list.append(stu) print(学生信息添加成功) else: print(学生各科成绩要在0~100范围内) # 修改学生成绩 def edit_student(self): name input(请输入要修改的学生姓名) for stu in self.student_list: if stu.name name: print(f当前成绩{stu}) chinese int(input(请输入语文成绩)) math int(input(请输入数学成绩)) english int(input(请输入英语成绩)) if 0 chinese 100 and 0 math 100 and 0 english 100: stu.edit(chinese, math, english) print(学生成绩修改成功) print(f修改后的成绩{stu}) return else: print(学生各科成绩要在0~100范围内) return else: print(该学生不在学生列表中修改失败) return # 删除学生成绩 def delete_student(self): name input(请输入要删除的学生姓名) for stu in self.student_list: if stu.name name: self.student_list.remove(stu) print(删除成功) return print(该学生不存在删除失败) # 查询指定学生成绩 def query_student(self): name input(请输入要查询的学生姓名) for stu in self.student_list: if stu.name name: print(f学生信息{stu}) return print(该学生不存在查询失败) # 展示全部学生成绩 def query_all(self): for stu in self.student_list: print(stu)系统要能在控制台进行输入输出故在教务管理系统中添加了新的方法run运行教务管理系统。# 运行系统 def run(self): print(f欢迎使用{EduMangement.system_name}, V{EduMangement.system_version}) while(True): print() print(################################################################################) print(# 1.添加学生 2.修改学生 3.删除学生 4.查询学生成绩 5.查询所有学生成绩 6.退出系统 #) print(################################################################################) print() flag input(请选择操作1-6) match flag: case 1: self.add_student() case 2: self.edit_student() case 3: self.delete_student() case 4: self.query_student() case 5: self.query_all() case 6: break case _: print(输入错误请输入1-6)执行edu EduMangement() edu.run()异常就是Bug指程序在运行过程中出现过的错误会中断程序的正常执行流程。可以保证数据、逻辑的正确性避免程序执行混乱。在开发阶段尽量发现更多的问题尽早解决问题保障程序正常执行。异常是编写健壮程序的重要工具。异常处理方案不做处理整个程序因为一个Bug中断执行。捕获异常按照自己的处理方式处理完异常程序继续执行。try: 可能出现过异常的代码1 可能出现过异常的代码2 ... except 异常类型 as 变量名: 出现异常时的预案 finally: 不管是否出现异常都会执行的代码异常的传递异常在函数调用中层层上报的过程直到有人处理它或者程序崩溃def fun1(): print(fun1-----------) fun2() def fun2(): print(fun2---------) fun3() def fun3(): print(fun3---------) print(name) if __name__ __main__: try: fun1() except Exception as e: print(e)文件操作日常操作文件时基本分为三步打开、读/写、关闭。编码是将字符转换为计算机能够存储和处理的数字代码的规则系统ASCII, GKB, UTF-8。# 打开文件 f open(文件目录/文件名, r, encodingutf-8) try: # 读取文件 content f.read() print(content) finally: # 关闭文件 如果操作完文件没有调用close方法关闭文件同时程序没有停止运行 # 那么这个文件将一直被Python程序占用无法操作 # 故需要释放资源 f.close()with语句核心作用是确保资源的总是被正确获取和释放即使发生异常也会被正确释放是项目开发中的推荐方式。with open(文件名, w, encodingutf-8) as f: f.write(1111111\n) f.write(2222222\n)