1.1 認識模組
在 Python 中,模組是 帶有 .py 擴展名的檔案,包含代碼。模組允許將大型代碼劃分為較小的、可管理的部分。每個模組可以包含函數、類別和變量,並在導入時執行某些代碼。
簡單模組的例子
創建一個模組 mymodule.py:
# mymodule.py
def greet(name):
return f"Hello, {name}!"
pi = 3.14159
現在這個模組可以在其他檔案中導入和使用。
1.2 導入模組
Python 提供了幾種導入模組的方法。讓我們逐一來看看。
導入整個模組
這種操作的一般語法如下:
import 模組
這種方法會導入整個模組,並且可以通過指定模組名來使用其函數和變量。
import 模組
print(模組.greet("Alice")) # 輸出: Hello, Alice!
print(模組.pi) # 輸出: 3.14159
我們之前用 math 模組做過類似事情,還記得嗎?
import math
print(math.ceil(13 / 7)) # 向上取整
print(math.floor(13 / 7)) # 向下取整
從模組中導入特定元素
可以選擇性地從模組中導入某些元素。這種操作的一般語法如下:
from 模組 import func, var
這種方法只導入模組中的某些特定函數、類別或變量,可以不指定模組名直接使用它們。
from mymodule import greet, pi
print(greet("Bob")) # 輸出: Hello, Bob!
print(pi) # 輸出: 3.14159
以別名導入模組
這種操作的一般語法如下:
import 模組 as alias
這種方法允許導入模組並賦予它另一個名稱,對於縮短冗長的模組名稱或解析名稱衝突很有用。
import mymodule as mm
print(mm.greet("Charlie")) # 輸出: Hello, Charlie!
print(mm.pi) # 輸出: 3.14159
導入模組中的所有元素
這種操作的一般語法如下:
from 模組 import *
這種方法會導入模組中的所有函數、類別和變量,可以不指定模組名直接使用它們。但是,不建議使用這種方法,因為它可能會引起名稱衝突,並使代碼難以閱讀。
from mymodule import *
print(greet("Dave")) # 輸出: Hello, Dave!
print(pi) # 輸出: 3.14159
1.3 導入過程的底層細節
模組搜索順序
當你導入一個模組時,Python 按照特定的順序搜索它:
- 當前目錄: Python 首先在當前目錄搜索模組,這是執行腳本的目錄。
- 環境變數
PYTHONPATH: 如果在當前目錄找不到模組,Python 會在PYTHONPATH指定的目錄中搜索它。 - 標準目錄: 如果模組仍然找不到,Python 會在標準目錄(如
sys.path指定的目錄)中搜索它。
例子:
import sys
for path in sys.path:
print(path)
局部與全局導入
可以在全局級別(檔案開頭)或局部級別(函數或方法內)導入模組。
全局導入
全局導入在檔案開頭執行,使導入的模組可在整個檔案中使用。
import math
def calculate_circle_area(radius):
return math.pi * radius ** 2
局部導入
局部導入在函數或方法內執行,使導入的模組僅在該函數或方法中可用。
def calculate_square_root(x):
import math
return math.sqrt(x)
print(calculate_square_root(16))
局部導入可能有助於減少模組加載時間或防止名稱衝突。
1.4 動態導入
動態導入允許在程序運行時導入模組。這在基於用戶輸入或其他動態條件需要導入模組時很有用。
這種操作的一般語法如下:
module = __import__("模組")
讓我們以此方式導入 math 模組作為例子。
module_name = "math"
module = __import__(module_name)
print(module.sqrt(16)) # 輸出: 4.0
後續的代碼操作類似於使用 import as,將 math 模組賦予別名 module。
1.5 使用 getattr 函數訪問模組屬性
getattr 函數允許動態獲取模組(或任何對象)中的屬性。當屬性的名稱在程序運行時未知或可能發生變化時,這非常有用。
getattr 函數的語法:
getattr(object, name, default = None)
其中 object 是要獲取屬性的對象,name 是包含屬性名稱的字符串,default 是當指定名稱的屬性不存在時返回的值。參數 default 的默認值為 None。
使用 getattr 函數的例子:
import math
# 從 math 模組獲取 sqrt 屬性
sqrt_function = getattr(math, 'sqrt')
print(sqrt_function(25)) # 輸出: 5.0
# 嘗試獲取不存在的屬性,返回默認值
non_existent_attr = getattr(math, 'non_existent', 'default_value')
print(non_existent_attr) # 輸出: default_value
在這個例子中,我們使用 getattr 函數從 math 模組中獲取 sqrt 函數,然後調用該函數計算數字 25 的平方根。如果指定名稱的屬性不存在,則返回默認值 default_value。
GO TO FULL VERSION