Python零基础入门之函数、类、模块详解!此篇包你掌握!

python代码组织架构

  • 对于小型代码,实现功能即可
  • 对于大中型代码,则需要进行代码封装,以方便重用和团队协作

《Python零基础入门之函数、类、模块详解!此篇包你掌握!》
《Python零基础入门之函数、类、模块详解!此篇包你掌握!》

本节主要介绍函数、类、模块

一、函数

我们已经使用了许多内建的函数,比如len、range、split等都是函数

是能重用的程序段,给一块代码起一个名字,然后在其它地方使用函数名字重复调用这块代码。

  • 函数的主要作用
  1. 重复使用:主要目的,一次封装可以任意的使用,如果变更函数则所有的使用方都会更新;
  2. 封装复杂代码逻辑:用一个简单的函数名,表达背后复杂的实现逻辑;
  • 函数的定义形式
def functionname(parameters):
""" 
函数注释
"""
function_suite
return [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__,不用传self
s1 = Student('xiaoming', 20)
s2 = Student('xiaowang', 25)
# 访问类的属性
print(Student.total_cnt)
# 访问实例的属性
print(s1.name, s1.age)
# 调用实例的方法
s1.set_grade(100)
  • 实例演示:

需求:用面向对象的方式解决学生成绩表问题,支持学生成绩导入,支持计算各科平均分最高分。

常用思路:把名词变成类、把数据变成属性、把动词变成方法(函数)

《Python零基础入门之函数、类、模块详解!此篇包你掌握!》

创建两个类:
类1:学生成绩表 SgradeTable---需求文档中的名词
属性:
   学生成绩表:list(Sgrade)---需求文档中的数据
方法:
导入成绩表文件-----需求文档中的动词
计算各科的平均分---需求文档中的动词
计算各科的最高分---需求文档中的动词
类2:学生成绩 Sgrade---需求文档中的名词
属性:
学号------需求文档中的数据
语文成绩---需求文档中的数据
数学成绩---需求文档中的数据
英语成绩---需求文档中的数据
1、打开pycharm新建工程
2、打开工程,new->python package--calss_2
3、new->filte--input.txt
4、复制粘贴数据

《Python零基础入门之函数、类、模块详解!此篇包你掌握!》
《Python零基础入门之函数、类、模块详解!此篇包你掌握!》

记得看我主页!

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 module
from pkg1.pkg2.module import function/class

    原文作者:萌新程序员
    原文地址: https://zhuanlan.zhihu.com/p/59823930
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞