Import module
Bạn sẽ học được
- Các kiểu
importvà khi nào dùng kiểu nào. - Thư viện chuẩn hữu ích cho xử lý dữ liệu:
math,statistics,pathlib,json,datetime. - Viết module của riêng bạn và import nó.
if __name__ == "__main__":— vì sao cần.- Cài thư viện ngoài bằng
piptrong môi trường ảo.
Khái niệm cốt lõi
Module là một file .py chứa code dùng lại được. import đưa module vào và cho truy cập qua tên:
import math
print(math.sqrt(16), math.pi)4.0 3.141592653589793Có bốn kiểu import phổ biến:
| Cách viết | Truy cập | Nhận xét |
|---|---|---|
import math | math.sqrt | Rõ nguồn gốc, nên dùng |
import math as m | m.sqrt | Ngắn, hợp với tên dài |
from math import sqrt | sqrt | Gọn nhưng dễ trùng tên |
from math import * | sqrt | Tránh — che tên khó kiểm soát |
Với thư viện chuẩn trong bài này, import math rồi math.sqrt(...) là lựa chọn an toàn nhất: người đọc biết hàm đến từ đâu. Alias hữu ích với tên quen thuộc như import numpy as np, import pandas as pd.
import chỉ chạy module một lần dù nhiều nơi import; kết quả được lưu trong sys.modules. Vì vậy code cấp module có tác dụng phụ sẽ chỉ chạy lần đầu.
Thư viện chuẩn hay dùng
from math import floor, ceil
print(floor(3.7), ceil(3.2))3 4floor làm tròn xuống, ceil làm tròn lên — khác round (làm tròn gần nhất, với quy tắc chẵn-lẻ đã học ở chương 1).
import statistics as st
print(st.mean([1, 2, 3, 4]))
print(st.median([4, 9, 1, 7]))2.5
5.5statistics có mean, median, mode, stdev, quantiles. Với mảng lớn, numpy/pandas nhanh hơn nhiều, nhưng thư viện chuẩn đủ cho dữ liệu nhỏ và không cần cài gì.
from pathlib import Path
print(Path("data") / "sales.csv")data/sales.csvPath ghép đường dẫn bằng /, tự xử lý dấu phân cách trên Windows/Linux. Các thuộc tính hữu ích: .exists(), .suffix, .stem, .parent, .read_text(). Nên dùng Path thay cho nối chuỗi đường dẫn.
Các module khác sẽ gặp ở chương sau:
| Module | Việc nó làm |
|---|---|
json | Đọc/ghi JSON |
csv | Đọc/ghi CSV |
datetime | Ngày, giờ, khoảng thời gian |
collections | Counter, defaultdict, deque |
re | Biểu thức chính quy |
random | Sinh số ngẫu nhiên (có seed) |
Viết module của riêng bạn
Tạo file helpers.py:
"""Các hàm dùng chung cho báo cáo."""
def diem_trung_binh(rows):
if not rows:
return 0.0
return sum(score for _, score in rows) / len(rows)File main.py cùng thư mục:
from helpers import diem_trung_binh
rows = [("An", 85), ("Bình", 92)]
print(diem_trung_binh(rows))88.5Tên file là tên module (bỏ .py). Module phải nằm trong thư mục hiện tại hoặc trong sys.path. Khi dự án lớn dần, gom module vào package (thư mục có __init__.py) và import theo đường dẫn: from reports.helpers import diem_trung_binh.
if __name__ == "__main__":
Khi chạy trực tiếp python main.py, biến đặc biệt __name__ bằng "__main__". Khi file được import, __name__ là tên module:
def main():
print("Đang chạy chương trình")
if __name__ == "__main__":
main()Nhờ guard này, phần "chạy chương trình" không thực thi khi file được import. Nếu không có guard, mọi tác dụng phụ cấp module — đọc file, gọi API, in kết quả — sẽ chạy ngay khi import, gây khó chịu và có thể treo chương trình khác.
Quy ước: định nghĩa hàm ở cấp module, đặt phần thực thi trong main() và gọi dưới guard.
Cài thư viện ngoài
Thư viện chuẩn có sẵn khi cài Python. Thư viện ngoài cần pip, và nên cài trong môi trường ảo để không làm hỏng Python hệ thống:
python -m venv .venv
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows
pip install pandas
pip freeze > requirements.txtSau khi kích hoạt, python và pip trỏ vào môi trường ảo. pip freeze ghi phiên bản chính xác để người khác cài lại bằng pip install -r requirements.txt. Không cài trực tiếp vào Python hệ thống — nhiều dự án cần phiên bản khác nhau và có thể xung đột.
Thực hành
import math, insqrt(16)vàpi.from math import floor, ceil, thử với số âm và số dương.- Dùng
statistics.meanvàmediantrên một list. - Ghép đường dẫn bằng
Paththay vì nối chuỗi. - Tạo
helpers.pyvàmain.py, import hàm giữa hai file. - Thêm
if __name__ == "__main__":và kiểm tramain.pykhông chạy khi bị import.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
ModuleNotFoundError | Sai tên hoặc chưa cài | Kiểm tra tên, pip install |
| Import được ở REPL, lỗi khi chạy file | Chạy sai thư mục | Chạy từ gốc dự án |
| Tên bị che | from module import * | Import tường minh |
| Code chạy khi import | Thiếu if __name__ == "__main__" | Bọc phần thực thi |
pip install vào Python hệ thống | Chưa kích hoạt venv | Tạo và activate .venv |
| Hai thư viện xung đột phiên bản | Cài chung môi trường | Mỗi dự án một venv |
| Import vòng tròn | A import B, B import A | Tách module dùng chung |
Import vòng tròn thường lộ ra khi tách file: a.py cần hàm từ b.py, b.py lại cần từ a.py. Cách sửa là đưa phần dùng chung sang module thứ ba, hoặc import bên trong hàm thay vì ở đầu file.
Tóm tắt
import modulerõ nguồn gốc; tránhfrom module import *.- Thư viện chuẩn đủ cho nhiều việc:
math,statistics,pathlib,json,datetime. - File
.pylà module; import theo tên file, package theo thư mục. if __name__ == "__main__":ngăn code chạy khi import.- Cài thư viện ngoài trong venv và ghi
requirements.txt.
Dùng ← → để chuyển bài