Python入門(四):函數、類、模組

  • 2019 年 12 月 26 日
  • 筆記

python程式碼組織架構

  • 對於小型程式碼,實現功能即可
  • 對於大中型程式碼,則需要進行程式碼封裝,以方便重用和團隊協作

本節主要介紹函數、類、模組

一、函數

我們已經使用了許多內建的函數,比如len、range、split等都是函數

是能重用的程式段,給一塊程式碼起一個名字,然後在其它地方使用函數名字重複調用這塊程式碼。

  • 函數的主要作用
  1. 重複使用:主要目的,一次封裝可以任意的使用,如果變更函數則所有的使用方都會更新;
  2. 封裝複雜程式碼邏輯:用一個簡單的函數名,表達背後複雜的實現邏輯;
  • 函數的定義形式
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

Tags: