DHDataHọc
Lý thuyếtBài 23/304 phút đọc+10 XP

Import module

Bạn sẽ học được

  • Các kiểu import và 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 pip trong 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:

code
import math

print(math.sqrt(16), math.pi)
code
4.0 3.141592653589793

Có bốn kiểu import phổ biến:

Cách viếtTruy cậpNhận xét
import mathmath.sqrtRõ nguồn gốc, nên dùng
import math as mm.sqrtNgắn, hợp với tên dài
from math import sqrtsqrtGọn nhưng dễ trùng tên
from math import *sqrtTrá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

code
from math import floor, ceil

print(floor(3.7), ceil(3.2))
code
3 4

floor 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).

code
import statistics as st

print(st.mean([1, 2, 3, 4]))
print(st.median([4, 9, 1, 7]))
code
2.5
5.5

statistics 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ì.

code
from pathlib import Path

print(Path("data") / "sales.csv")
code
data/sales.csv

Path 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:

ModuleViệc nó làm
jsonĐọc/ghi JSON
csvĐọc/ghi CSV
datetimeNgày, giờ, khoảng thời gian
collectionsCounter, defaultdict, deque
reBiểu thức chính quy
randomSinh số ngẫu nhiên (có seed)

Viết module của riêng bạn

Tạo file helpers.py:

code
"""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:

code
from helpers import diem_trung_binh

rows = [("An", 85), ("Bình", 92)]
print(diem_trung_binh(rows))
code
88.5

Tê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:

code
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:

code
python -m venv .venv
source .venv/bin/activate      # macOS/Linux
# .venv\Scripts\activate       # Windows
pip install pandas
pip freeze > requirements.txt

Sau 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

  1. import math, in sqrt(16) và pi.
  2. from math import floor, ceil, thử với số âm và số dương.
  3. Dùng statistics.mean và median trên một list.
  4. Ghép đường dẫn bằng Path thay vì nối chuỗi.
  5. Tạo helpers.py và main.py, import hàm giữa hai file.
  6. Thêm if __name__ == "__main__": và kiểm tra main.py không chạy khi bị import.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
ModuleNotFoundErrorSai tên hoặc chưa càiKiểm tra tên, pip install
Import được ở REPL, lỗi khi chạy fileChạy sai thư mụcChạy từ gốc dự án
Tên bị chefrom module import *Import tường minh
Code chạy khi importThiếu if __name__ == "__main__"Bọc phần thực thi
pip install vào Python hệ thốngChưa kích hoạt venvTạo và activate .venv
Hai thư viện xung đột phiên bảnCài chung môi trườngMỗi dự án một venv
Import vòng trònA import B, B import ATá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 module rõ nguồn gốc; tránh from module import *.
  • Thư viện chuẩn đủ cho nhiều việc: math, statistics, pathlib, json, datetime.
  • File .py là 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