Python入门(四):函数、类、模块
- 2019 年 12 月 26 日
- 筆記
python代码组织架构
- 对于小型代码,实现功能即可
- 对于大中型代码,则需要进行代码封装,以方便重用和团队协作

本节主要介绍函数、类、模块
一、函数
我们已经使用了许多内建的函数,比如len、range、split等都是函数
是能重用的程序段,给一块代码起一个名字,然后在其它地方使用函数名字重复调用这块代码。
- 函数的主要作用
- 重复使用:主要目的,一次封装可以任意的使用,如果变更函数则所有的使用方都会更新;
- 封装复杂代码逻辑:用一个简单的函数名,表达背后复杂的实现逻辑;
- 函数的定义形式
def functionname(parameters):""" 函数注释"""function_suitereturn [expression]
- 函数参数
正常情况下定义的参数需要按顺序传对应的参数;
参数可以设置默认值,调用时不用传这些参数的值;
关键字参数,可以用name=value的形式调用函数,并且顺序可以换;
传不可变对象string、tuple,数据不能被改变;传可变对象list、dict、set,数据可以被改变。
- 函数返回值
可以用return返回函数的计算结果;
可以用逗号分隔返回多个值,调用时拆包获取各值;
- 函数内变量的作用域
函数中定义的变量在函数外是不能使用的;
函数外面的变量是全局变量,可以读取,但是如果要更改,需要先用global关键字修饰;
- lambda函数
称为匿名函数,函数的定义直接使用,不用起名字;
又称为一句话函数、逻辑简单到一行代码就能表达逻辑;
用于一些简单的、不会重复多次调用的情景;
定义形式: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__,不用传selfs1 = 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_23、new->filte--input.txt4、复制粘贴数据

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("t") 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和模块module
包package是一个目录,里面包含__init__.py和模块;
模块module是文件,以.py为后缀名,包含类、函数、语句;
包和模块都是为了更好的对代码进行组织,实现可重用和可维护;
包的__init__.py用于区分普通目录,包可以多级嵌套;
- 引入模块
import module1, module2 from pkg1.pkg2 import modulefrom pkg1.pkg2.module import function/class