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

