目次
1. 前言
當你開始學習 Python 時,幾乎一定會遇到的語法就是import 語句。 在 Python 中,透過活用標準函式庫、外部函式庫,甚至是自製模組,可以更高效地撰寫程式。而實現這一點的關鍵機制就是 import。 本篇文章將以初學者也能理解的方式,詳細解說「import python」的基本用法、進階技巧,以及常見錯誤與對應解決方法。2. import python 的基本概念
2.1 什麼是 import?
在 Python 中,import
是一種將外部模組載入到程式中的機制。
Python 提供了眾多實用的標準函式庫,透過 import 語句 呼叫這些函式庫,就能更有效率地開發程式。 例如,若要使用執行數學運算的 math
模組,可以這樣寫:import math
print(math.sqrt(16)) # 4.0
在上述範例中,我們import 了 math
模組,並使用其中的 sqrt
(平方根)函數。2.2 使用 import 的好處
活用 Python 的 import 有以下幾個優點:- 提升程式碼的重複利用性
- 使用現有函式庫,無需從頭撰寫所有功能。
- 提升開發效率
- 例如,透過
random
模組可以輕鬆產生亂數。 - 範例:
import random print(random.randint(1, 100)) # 輸出 1 到 100 之間的隨機整數
- 擴充功能變得更容易
- 導入外部函式庫(如 NumPy 或 Pandas)可以實現更進階的處理功能。
3. Python 中 import 的基本用法
3.1 匯入標準函式庫
Python 提供了許多預先內建的標準函式庫。 例如,math
和 datetime
就是標準函式庫的一部分,可以直接 import 而無需另外安裝。 範例:使用 math 模組import math
print(math.pi) # 3.141592653589793
print(math.factorial(5)) # 5! = 120
範例:使用 datetime 模組import datetime
now = datetime.datetime.now()
print(now) # 輸出目前的日期與時間
3.2 使用 from … import …
也可以只匯入特定的函式或變數。 範例:只匯入 sqrt 函式from math import sqrt
print(sqrt(25)) # 5.0
使用這種方式,就可以直接使用 sqrt()
,不需寫成 math.sqrt()
,讓程式碼更簡潔。3.3 指定 import 的別名(別稱)
當模組名稱太長時,可以指定別名(alias)來簡化程式碼。 範例:將 numpy 以 np 作為別名匯入import numpy as np
arr = np.array([1, 2, 3, 4])
print(arr) # [1 2 3 4]
透過使用別名,可以提升程式碼的可讀性與開發效率。4. import 的執行順序與內部機制
4.1 模組的搜尋路徑
Python 在 import 模組時,會依照以下順序進行搜尋:- 當前目錄
- 環境變數
PYTHONPATH
所指定的目錄 - Python 的標準函式庫
site-packages
目錄(外部函式庫的安裝位置)
import sys
print(sys.path)
輸出結果會是一個列表,顯示 Python 尋找模組時所參考的目錄。4.2 使用 sys.path.append()
新增路徑
當需要 import 自訂模組時,可以透過手動新增路徑來讓 Python 找到該模組:import sys
sys.path.append('/path/to/custom/module')
import my_module # 匯入自訂模組
4.3 __init__.py
的作用
在 Python 中,若某個資料夾內有 __init__.py
檔案,該資料夾就會被視為一個套件(Package)。
這樣就可以 import 該資料夾中的子模組。5. 總結
- 透過 import 語句,可以有效活用 Python 的標準函式庫與外部函式庫。
- 可以像
import math
一樣匯入標準模組來使用其中的功能。 - 使用
from module import function
可以只匯入特定的函式。 - 利用別名(例如
import numpy as np
)可以簡化冗長的模組名稱。 - 理解模組的搜尋路徑,有助於避免 import 錯誤。
6. import 的進階技巧
Python 的import
語句不僅能用於基本的匯入操作,也能根據不同情境,靈活運用進階技巧。本章將深入說明 相對匯入、動態匯入,以及萬用字元匯入的風險。6.1 相對匯入與絕對匯入
在 Python 中,模組的匯入方式主要分為 「絕對匯入」 和 「相對匯入」 兩種。6.1.1 絕對匯入
絕對匯入 是指從專案根目錄(最上層目錄)開始指定模組的完整路徑。# 專案結構範例
my_project/
│── main.py
│── utils/
│ ├── helper.py
│ └── math_utils.py
若要在 main.py
中匯入 math_utils.py
,可使用以下方式:# main.py
import utils.math_utils # 絕對匯入
6.1.2 相對匯入
相對匯入 是透過相對於當前檔案位置的路徑,來匯入模組。 例如,從helper.py
匯入 math_utils.py
可寫成:# helper.py
from . import math_utils # 匯入同一目錄下的模組
from .. import another_module # 匯入上層目錄的模組
6.2 使用 importlib 進行動態匯入
通常,Python 的 import 語句會在程式執行時只被解析一次。但有時你可能需要根據執行時的情況,動態決定要匯入哪個模組,這時就可以使用importlib
模組。6.2.1 使用 importlib.import_module()
例如,你只想在已安裝numpy
的情況下匯入它,可以這麼寫:import importlib
module_name = "math"
math_module = importlib.import_module(module_name)
print(math_module.sqrt(25)) # 5.0
6.3 使用 import *(萬用字元匯入)的風險
使用from module import *
可一次匯入模組中的所有函式與變數:from math import *
print(sqrt(16)) # 4.0
6.3.1 為什麼要避免使用萬用字元匯入?
⚠ 不容易辨別實際匯入了哪些函式或變數 ⚠ 容易發生命名衝突(不同模組可能有同名函式) ⚠ 可能匯入不需要的物件,造成效能下降 建議做法- 明確指定所需的函式
from math import sqrt, pi
- 使用別名提高可讀性
import numpy as np
7. import 錯誤的原因與對策
在使用 Python 的import
語句時,初學者常會遇到幾種錯誤。本章將詳細說明 各種常見的 import 錯誤、成因與解決方法。7.1 ModuleNotFoundError: No module named 'xxx'
錯誤訊息範例:ModuleNotFoundError: No module named 'numpy'
可能原因:- 尚未安裝像
numpy
等外部函式庫 sys.path
中缺少模組所在的目錄- 使用了錯誤的 Python 虛擬環境
pip install numpy
✅ 檢查目前環境中已安裝的套件pip list
✅ 啟用虛擬環境(以 venv 為例)source venv/bin/activate # 適用於 Mac/Linux
venvScriptsactivate # 適用於 Windows
✅ 檢查模組搜尋路徑import sys
print(sys.path)
如果找不到目標模組,可使用 sys.path.append('路徑')
將自訂目錄加入搜尋路徑。7.2 ImportError: cannot import name 'xxx'
錯誤訊息範例:ImportError: cannot import name 'my_function' from 'my_module'
可能原因:my_module.py
中並未定義my_function
- import 語句語法錯誤(例如錯誤地匯入類別當成函式)
- 循環匯入(circular import)
my_module.py
是否正確定義了 my_function
。 ✅ 修正錯誤的 import 寫法# 錯誤
from my_module import my_function
# 正確
import my_module
print(my_module.my_function())
✅ 確認是否為循環匯入問題 請參考下方 7.3
小節說明。7.3 循環匯入(Circular Import)
錯誤訊息範例:ImportError: cannot import name 'A' from partially initialized module 'B'
可能原因:module_a.py
匯入了module_b.py
,而module_b.py
又反過來匯入了module_a.py
,造成循環
module_a.py
from module_b import B
class A:
pass
module_b.py
from module_a import A
class B:
pass
此時執行 module_a.py
,就會發生循環匯入錯誤。 解決方法: ✅ 將 import 移入函式內進行延遲匯入# module_a.py
def use_module_b():
from module_b import B
b_instance = B()
✅ 重新設計模組的相依關係- 盡量 減少模組之間的相依性
- 避免單一模組承擔多重責任
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from module_b import B
8. 常見問題(FAQ)
針對 Python 中的import
語句,這裡以 問與答形式,為初學者到中階使用者解答一些常見疑問,並結合實際錯誤訊息與範例,提供對應的解決方式。8.1 import
和 from ... import ...
有什麼不同?
A: import
與 from ... import ...
都是匯入模組的方法,但使用方式與結果略有不同。1. 使用 import
import math
print(math.sqrt(16)) # 4.0
- 這會將整個
math
模組匯入。 - 使用函式時必須加上模組名稱,例如
math.sqrt(16)
。
2. 使用 from ... import ...
from math import sqrt
print(sqrt(16)) # 4.0
- 這只會匯入
sqrt()
函式。 - 可以直接使用函式,不需加上模組名稱,讓程式碼更簡潔。
8.2 出現 ModuleNotFoundError: No module named 'xxx'
時怎麼辦?
✅ 確認是否已安裝該模組pip install numpy
✅ 確認是否已啟用正確的虛擬環境source venv/bin/activate # 適用於 Mac/Linux
venvScriptsactivate # 適用於 Windows
8.3 出現 ImportError: cannot import name 'xxx'
的原因是什麼?
✅ 確認模組內確實有該函式或類別import my_module
print(dir(my_module)) # 查看 my_module 中可用的物件
✅ 為了避免循環匯入,可將 import 移到函式內部def use_module_b():
from module_b import some_class
8.4 可以使用 import *
嗎?
A: 基本上不建議使用。 ⚠ 不易判斷實際匯入了哪些函式或變數 ⚠ 容易發生命名衝突 ⚠ 可能匯入不必要的物件,造成效能浪費 建議做法:from math import sqrt, pi
8.5 如何重新載入已匯入的模組?
✅ 使用 importlib.reload() 函式import importlib
import my_module
importlib.reload(my_module)
9. 結語(下一步學習建議)
透過本篇文章,相信你已經理解了 Python 中import
語句的運作方式,並學會了如何有效地使用模組與函式庫。我們從 基本用法、進階技巧,到常見錯誤的排除方法 都進行了詳細解說。 在 Python 程式設計中,掌握 import 機制是提升程式可讀性與開發效率的重要技巧。請善用這些知識,拓展你的 Python 技能與實務應用能力!9.1 下一步可以學什麼?
當你已經熟練掌握 import 的基本用法,建議可以繼續學習以下主題:1. Python 的套件管理工具(pip 與 venv)
在使用 import 語句時,如何安裝與管理外部函式庫非常關鍵。學會使用pip
來安裝套件,以及建立虛擬環境(venv
)可以讓你的開發環境更加穩定與專業。pip install requests # 安裝函式庫
python -m venv myenv # 建立虛擬環境
source myenv/bin/activate # 啟用虛擬環境(Mac/Linux)
myenvScriptsactivate # 啟用虛擬環境(Windows)
2. Python 的物件導向設計(類別與方法)
當你開始使用 import 將程式碼模組化後,學習 物件導向程式設計(OOP) 會進一步幫助你組織與擴展程式結構。class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "..."
class Dog(Animal):
def speak(self):
return "汪汪"
my_dog = Dog("小黑")
print(my_dog.speak()) # 汪汪
3. Python 的並行處理與多執行緒
若你希望挑戰更進階的開發內容,可以學習 並行處理與多執行緒,特別是在處理大量資料或 I/O 操作時非常實用。import threading
def print_numbers():
for i in range(5):
print(i)
thread = threading.Thread(target=print_numbers)
thread.start()
thread.join()
9.2 總結
- 活用 Python 的
import
,可以有效使用標準函式庫與外部套件。 - 理解 import 的運作機制,有助於撰寫模組化、可重用的程式碼。
- 進一步學習套件管理、物件導向、並行處理等主題,將有助於提升你的開發實力。
- 請搭配官方文件與學習資源,實際動手寫程式才是最有效的學習方式。