一、模塊和包
? ? ? ? 將一段代碼保存為應該擴展名為.py 的文件,該文件就是模塊。Python中的模塊分為三種,分別為:內置模塊、第三方模塊和自定義模塊。
- 內置模塊和第三方模塊又稱為庫
- 內置模塊,有 python 解釋器自帶,不用單獨安裝
- 第三方模塊,需要下載后手動安裝
- 如果內置模塊和第三方模塊沒有需要的功能,就需要用戶自己編寫程序,將程序保存為.py 文件,即是自定義模塊。
無論哪種模塊都需要使用 import 調用后,才能在程序中調用其中的功能函數。
? ? ? ?
????????將功能近似的、關聯較強的模塊組織起來,形成一個目錄,叫做包。
python中的包是模塊包,文件名。包括:
- 一組模塊
- _init_.py 文件
- 支持多層嵌套
- .py 程序文件中可以直接定義一些變量,函數和類
- 使用時,通過import 導入,如: import math
他們的關系如下:
? ? ? ? 包——>? 模塊 ——> 函數
二、函數
1、函數的定義函數的語法格式如下:? ? ? ?
def 函數名( [ 次數1,參數2,…,參數n?] ):語句塊[ return [ 返回值1,返回值2,…,返回值n] ]
2、函數的定義和調用
(1)def 為python保留字,用于定義函數,函數名的命名規則和變量一致;
(2)括號中是函數的參數,參數可以為空,此時,括號()不能省略,函數參數也可以是多個,多個參數之間有英文逗號隔開;
(3)語句塊是函數體,可以對函數進行調用,完成函數的主要功能;
(4)retrun 是函數的返回保留字,當函數沒有返回值時,return 保留字可以省略,函數有多個返回值時,在return 保留字后面,將多個返回值以英文逗號隔開;
#無返回值時省略return
def greet(name):print(f"Hello, {name}!")
result = greet("Alice") # 輸出: Hello, Alice!
print(result) # 輸出: None#單返回值
def add(a, b):return a + b
sum_result = add(3, 5) # sum_result = 8#多返回值
def calculate(a, b):add = a + bsub = a - breturn add, sub # 實際返回元組 (add, sub)result = calculate(10, 5)
print(result) # 輸出: (15, 5)# 解包返回值
sum_result, diff_result = calculate(10, 5)
print(sum_result) # 輸出: 15
print(diff_result) # 輸出: 5
這里的解包返回值,大家不懂的話不要害怕,我在最后做了補充。
(5)函數的類型和函數的返回值類型相同,當返回值是多個時,函數的返回值是元組類型。
- 單返回值類型:若函數返回單個值(如?
int
),則直接標注為對應類型。
def get_number() -> int:return 42
- 多返回值類型:若函數返回多個值(如?
a, b
),Python 會將其轉換為元組。此時返回值類型應標注為?tuple[類型1, 類型2, ...]
。
def calculate(a: int, b: int) -> tuple[int, int]:return a + b, a - b # 實際返回 (int, int) 類型的元組
三、函數的參數
1、形參與實參
- 函數定義時,圓括號內參數列表的參數,不代表具體的數據,稱為形參;
- 函數調用時,將具體的數據傳遞給形式參數,此時的參數稱為實參。
- 根據參數的不同數據類型,將實參的值或者引用傳遞給形參。
- 當參數類型為不可變數據類型時,在函數內部直接修改形參的值不會影響實參;
- 但當參數類型為可變數據類型時,在函數內部使用下標或其他方式為其增加、刪除元素或修改元素值時,修改后的結果是可以傳遞到函數之外的,即實參也會得到相應的修改。
2、必備參數、默認參數、可變參數和關鍵字參數
- 函數調用時,必須傳遞的參數,稱為必備參數,也稱必選參數;
- 函數定義時,設置了默認值的參數函數調用時,可以傳遞實參,也可以不傳遞參數,不傳遞時,參數取定義時的默認值,這種參數,稱為默認參數,也稱可選參數。
- 需要注意的是,必備參數必須在前面定義,其他參數在后面定義。
3、參數傳遞
- 在函數調用參數傳遞時,按位置形參和實參一一對應傳遞稱為位置傳遞;
- 在函數調用參數傳遞時,按照參數的名稱顯式的傳遞,稱為名稱傳遞。
????????按位置傳遞,不需要給出參數的名稱,但形參和實參的位置相同、類型相同,否則容易出錯;按名稱顯式的傳遞參數,則不關心參數的前后順序,在參數較多時,不容易混淆。
4、全局變量與局部變量
- 在函數外部定義的變量,稱為全局變量;在函數內部定義的變量稱為局部變量。
- 全局變量的生命周期是程序的整個運行周期,只有程序被關閉后全局變量才會被銷毀并釋放內存空間,因此,全局變量在整個程序中,都可以使用;
- 局部變量的生命周期是函數調用時間,函數調用結束返回后,局部變量就銷毀并釋放內存空間,因此局部變量的作用范圍是這個函數內部,即只能在這個函數中使用,在函數的外部是不能使用的。
5、匿名函數
????????當函數一次性使用,函數體語句較少,如只有一個表達式,為了節省內存中變量定義空間就不需要定義函數名,此時,可以定義匿名函數。名函數的語法格式是:
?
????????函數名 =lambda」參數]:返回值
??????????????
????????匿名函數可以有0個或多個參數,但必須有返回值。匿名函數的調用和一般函數的調用相似可以單獨使用,也可以作為表達式的一部分。
常見使用場景
(1)作為參數傳遞(如?sorted
,?map
,?filter
)
# 按字符串長度排序列表
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words) # 輸出 ['date', 'apple', 'banana', 'cherry']# 過濾偶數
numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 輸出 [2, 4]# 對每個元素平方
squared = list(map(lambda x: x**2, numbers))
print(squared) # 輸出 [1, 4, 9, 16, 25]
?filter()函數在前面提過,過濾出滿足條件的函數。
(2)快速定義簡單邏輯
# 判斷是否為偶數
is_even = lambda x: x % 2 == 0
print(is_even(4)) # True# 拼接字符串
greet = lambda name: f"Hello, {name}!"
print(greet("Alice")) # Hello, Alice!
(3)結合條件表達式
# 返回兩數中的較大值
max_value = lambda a, b: a if a > b else b
print(max_value(5, 8)) # 8
四、補充:
解包返回值:
?????????Python 中一種便捷的語法,用于將函數返回的多個值(通常是元組、列表等可迭代對象)直接拆分并賦值給多個變量。它的核心目的是讓代碼更簡潔、可讀性更強。
【例】假設有一個函數返回兩個值:
?def get_coordinates():x = 3y = 4return x, y # 實際返回的是元組 (3, 4)?
不解包的情況:
直接獲取返回值時,會得到一個元組:
coords = get_coordinates()
print(coords) # 輸出 (3, 4)
print(coords[0]) # 輸出 3(通過索引訪問)
print(coords[1]) # 輸出 4
解包的情況:
將元組中的值直接拆分為兩個變量:
x, y = get_coordinates() # 解包賦值
print(x) # 輸出 3
print(y) # 輸出 4
解包具有靈活性:
(1)適用于任意可迭代對象
????????不僅是元組,列表、字符串等可迭代對象也可以解包:
def get_data():return ["Alice", 25, "Engineer"]name, age, job = get_data() # 解包列表
print(name) # Alice
(2)忽略不需要的值
????????用下劃線?_
?占位忽略不需要的返回值:
x, _ = get_coordinates() # 只要 x,忽略 y
print(x) # 3
(3)解包嵌套結構
????????甚至可以解包嵌套的返回值(如元組中的元組):
def nested_data():return (1, (2, 3))a, (b, c) = nested_data()
print(a, b, c) # 1 2 3
(4)使用?*
?處理剩余值
用?* 變量名
?接收剩余的所有值(返回列表):
def multiple_values():return 1, 2, 3, 4, 5first, *middle, last = multiple_values()
print(first) # 1
print(middle) # [2, 3, 4](中間的數值被封裝為列表)
print(last) # 5
注意事項:
(1)變量數量必須匹配:
????????左側變量數必須與返回值數量一致,否則會報錯:
x, y, z = get_coordinates() # 錯誤!元組只有 2 個值,但嘗試解包給 3 個變量
(2)返回值必須是可迭代對象:
????????如果函數返回單個值(非元組/列表等),嘗試解包會報錯:
def single_value():return 5a, b = single_value() # 錯誤!單個整數無法解包