python代码组织架构 - 对于小型代码,实现功能即可
- 对于大中型代码,则需要进行代码封装,以方便重用和团队协作
私信小编001 获取进阶教程,全套哦! 本节主要介绍函数、类、模块 一、函数 我们已经使用了许多内建的函数,比如len、range、split等都是函数 是能重用的程序段,给一块代码起一个名字,然后在其它地方使用函数名字重复调用这块代码。 - 重复使用:主要目的,一次封装可以任意的使用,如果变更函数则所有的使用方都会更新;
- 封装复杂代码逻辑:用一个简单的函数名,表达背后复杂的实现逻辑;
def functionname(parameters): """ 函数注释 """ function_suite return [expression]
正常情况下定义的参数需要按顺序传对应的参数; 参数可以设置默认值,调用时不用传这些参数的值; 关键字参数,可以用name=value的形式调用函数,并且顺序可以换; 传不可变对象string、tuple,数据不能被改变;传可变对象list、dict、set,数据可以被改变。 可以用return返回函数的计算结果; 可以用逗号分隔返回多个值,调用时拆包获取各值; 函数中定义的变量在函数外是不能使用的; 函数外面的变量是全局变量,可以读取,但是如果要更改,需要先用global关键字修饰; 称为匿名函数,函数的定义直接使用,不用起名字; 又称为一句话函数、逻辑简单到一行代码就能表达逻辑; 用于一些简单的、不会重复多次调用的情景; 定义形式: lambda 参数:操作(参数) 定义举例:sum = lambda x,y: x+y 调用举例:sum(1,2)
使用场景: 既然逻辑能够在一行完成,那直接写逻辑即可,为什么要写成一个函数? 因为有些python的有些高级函数,比如list.sort、sorted、map、reduce等,它们的调用需要传一个函数作为参数传入。 二、类 类一般是名词,代表一类事物,比如学生、汽车、电脑; 类定义了一个模板,一个类可以有多个实例对象,每个实例对象有自己的具体的属性取值; 类是包含数据和方法的一个打包,其中的方法可以对数据进行更新; 猫是一个类,hellokity 是一个实例; 学生是一个类,小明同学和小王同学都是实例; class Student: """ 类注释 """ # 类变量,所有实例共享 total_cnt = 0 def __init__(self, name, age): """ 初始化方法 """ # 普通实例变量,每个实例独有 self.name = name self.age = age Student.total_cnt += 1 def set_grade(self, grade): """ 普通方法 """ self.grade = grade
# 创建类的实例 # 会调用类的初始化函数__init__,不用传self s1 = Student('xiaoming', 20) s2 = Student('xiaowang', 25) # 访问类的属性 print(Student.total_cnt) # 访问实例的属性 print(s1.name, s1.age) # 调用实例的方法 s1.set_grade(100)
需求:用面向对象的方式解决学生成绩表问题,支持学生成绩导入,支持计算各科平均分最高分。 常用思路:把名词变成类、把数据变成属性、把动词变成方法(函数) 创建两个类: 类1:学生成绩表 SgradeTable---需求文档中的名词 属性: 学生成绩表:list(Sgrade)---需求文档中的数据 方法: 导入成绩表文件-----需求文档中的动词 计算各科的平均分---需求文档中的动词 计算各科的最高分---需求文档中的动词 类2:学生成绩 Sgrade---需求文档中的名词 属性: 学号------需求文档中的数据 语文成绩---需求文档中的数据 数学成绩---需求文档中的数据 英语成绩---需求文档中的数据
1、打开pycharm新建工程 2、打开工程,new->python package--calss_2 3、new->filte--input.txt 4、复制粘贴数据
5、new->python file--sgrade_test.py ---------------------------------------------------- class Sgrade: """ 学生成绩 """ def __init__(self, sno, yuwen, shuxue, yingyu): """ 初始化方法 :param sno: 学号 :param yuwen: 语文成绩 :param shuxue: 数学成绩 :param yingyu: 英语成绩 """ self.sno = sno self.yuwen = int(yuwen) self.shuxue = int(shuxue) self.yingyu = int(yingyu) class SgradeTable: """ 学生成绩表 """ def __init__(self): self.sgrade_table = [] # 定义方法函数:导入数据 def load_data(self, fname_sgrade_table): """ 载入成绩表文件 :param fname_sgrade_table: 成绩表文件名 :return: """ with open("input.txt") as fin: for line in fin: line = line.strip() sno, yuwen, shuxue, yingyu = line.split(" ") sgrade = Sgrade(sno, yuwen, shuxue, yingyu) self.sgrade_table.append(sgrade) print("sgrade table size:", len(self.sgrade_table)) # 定义方法函数:计算平均分 def compute_avg_score(self): """ 计算各科的平均分 :return: """ yuwen_total, shuxue_total, yingyu_total = 0,0,0 for sgrade in self.sgrade_table: yuwen_total += sgrade.yuwen shuxue_total += sgrade.shuxue yingyu_total += sgrade.yingyu count = len(self.sgrade_table) return yuwen_total/count, shuxue_total/count, yingyu_total/count # 定义方法函数:计算最高分 def compute_max_score(self): """ 计算各科的最高分 :return: """ yuwen_max, shuxue_max, yingyu_max = 0, 0, 0 for sgrade in self.sgrade_table: if sgrade.yuwen>yuwen_max: yuwen_max = sgrade.yuwen if sgrade.shuxue>shuxue_max: shuxue_max = sgrade.shuxue if sgrade.yingyu>yingyu_max: yingyu_max = sgrade.yingyu return yuwen_max, shuxue_max, yingyu_max # 创建成绩表的实例 sgrade_table = SgradeTable() # 加载成绩表文件 sgrade_table.load_data("input.txt") # 打印平均分和最高分 print(sgrade_table.compute_avg_score()) print(sgrade_table.compute_max_score())
右击选择 run sgrage_test.py即可看到程序执行结果: sgrade table size: 36 (65.86111111111111, 74.86111111111111, 80.83333333333333) (88, 98, 99)
三、模块 包package是一个目录,里面包含__init__.py和模块; 模块module是文件,以.py为后缀名,包含类、函数、语句; 包和模块都是为了更好的对代码进行组织,实现可重用和可维护; 包的__init__.py用于区分普通目录,包可以多级嵌套; import module1, module2 from pkg1.pkg2 import module from pkg1.pkg2.module import function/class
|