Làm việc với Module trong Python¶
I. Lý thuyết¶
1. Định nghĩa¶
Module là một file Python chứa các hàm, lớp, và biến có thể được sử dụng lại trong các chương trình khác. Module giúp tổ chức mã nguồn, tránh lặp lại mã, và tăng tính tái sử dụng.
2. Đặc điểm của Module¶
- Tái sử dụng: Viết một lần, sử dụng nhiều nơi.
- Tổ chức mã: Chia chương trình thành các phần nhỏ dễ quản lý.
- Namespace: Tránh xung đột tên hàm/biến.
- Thư viện: Python có nhiều module có sẵn (built-in).
- Tùy chỉnh: Có thể tạo module riêng theo nhu cầu.
3. Cách import Module¶
3.1. Import toàn bộ module¶
import math
import random
import datetime
3.2. Import với alias (bí danh)¶
import math as m
import datetime as dt
import random as rd
3.3. Import các hàm cụ thể¶
from math import sqrt, pi, sin, cos
from random import randint, choice
from datetime import datetime, timedelta
3.4. Import tất cả (không khuyến khích)¶
from math import *
4. Các module phổ biến¶
Module | Mô tả | Ví dụ sử dụng |
---|---|---|
math |
Tính toán toán học | math.sqrt(16) |
random |
Số ngẫu nhiên | random.randint(1, 10) |
datetime |
Thời gian, ngày tháng | datetime.now() |
os |
Tương tác với hệ điều hành | os.getcwd() |
json |
Xử lý dữ liệu JSON | json.dumps(data) |
re |
Biểu thức chính quy | re.search(pattern, text) |
II. Module math - Toán học¶
1. Các hàm toán học cơ bản¶
import math
# Căn bậc hai
print(math.sqrt(16)) # 4.0
print(math.sqrt(2)) # 1.4142135623730951
# Lũy thừa
print(math.pow(2, 3)) # 8.0
print(math.pow(5, 2)) # 25.0
# Làm tròn
print(math.ceil(4.3)) # 5 (làm tròn lên)
print(math.floor(4.7)) # 4 (làm tròn xuống)
# Hằng số
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
2. Hàm lượng giác¶
import math
# Chuyển đổi độ sang radian
goc_do = 90
goc_radian = math.radians(goc_do)
# Các hàm lượng giác
print(math.sin(goc_radian)) # 1.0
print(math.cos(goc_radian)) # 6.123233995736766e-17 (≈ 0)
print(math.tan(math.radians(45))) # 1.0
# Chuyển radian về độ
print(math.degrees(math.pi)) # 180.0
III. Module random - Số ngẫu nhiên¶
1. Tạo số ngẫu nhiên¶
import random
# Số nguyên ngẫu nhiên
so_nguyen = random.randint(1, 10) # Từ 1 đến 10
print(f"Số nguyên: {so_nguyen}")
# Số thực ngẫu nhiên
so_thuc = random.random() # Từ 0.0 đến 1.0
print(f"Số thực: {so_thuc:.3f}")
# Số thực trong khoảng
so_thuc_khoang = random.uniform(1.5, 5.5)
print(f"Số thực (1.5-5.5): {so_thuc_khoang:.2f}")
2. Chọn ngẫu nhiên từ danh sách¶
import random
# Chọn một phần tử
mon_hoc = ["Toán", "Lý", "Hóa", "Văn", "Anh"]
mon_chon = random.choice(mon_hoc)
print(f"Môn được chọn: {mon_chon}")
# Chọn nhiều phần tử (có thể trùng)
nhieu_mon = random.choices(mon_hoc, k=3)
print(f"3 môn: {nhieu_mon}")
# Chọn nhiều phần tử (không trùng)
khong_trung = random.sample(mon_hoc, 3)
print(f"3 môn không trùng: {khong_trung}")
# Xáo trộn danh sách
danh_sach = [1, 2, 3, 4, 5]
random.shuffle(danh_sach)
print(f"Đã xáo trộn: {danh_sach}")
IV. Module datetime - Thời gian¶
1. Làm việc với ngày giờ¶
from datetime import datetime, date, time, timedelta
# Thời gian hiện tại
hien_tai = datetime.now()
print(f"Hiện tại: {hien_tai}")
print(f"Năm: {hien_tai.year}")
print(f"Tháng: {hien_tai.month}")
print(f"Ngày: {hien_tai.day}")
print(f"Giờ: {hien_tai.hour}")
print(f"Phút: {hien_tai.minute}")
# Chỉ ngày
ngay_hom_nay = date.today()
print(f"Ngày hôm nay: {ngay_hom_nay}")
# Định dạng thời gian
dinh_dang = hien_tai.strftime("%d/%m/%Y %H:%M:%S")
print(f"Định dạng Việt Nam: {dinh_dang}")
2. Tính toán thời gian¶
from datetime import datetime, timedelta
# Thời gian hiện tại
hien_tai = datetime.now()
# Cộng/trừ thời gian
sau_7_ngay = hien_tai + timedelta(days=7)
truoc_30_ngay = hien_tai - timedelta(days=30)
sau_2_gio = hien_tai + timedelta(hours=2)
print(f"Sau 7 ngày: {sau_7_ngay.strftime('%d/%m/%Y')}")
print(f"Trước 30 ngày: {truoc_30_ngay.strftime('%d/%m/%Y')}")
print(f"Sau 2 giờ: {sau_2_gio.strftime('%H:%M:%S')}")
# Tính khoảng cách thời gian
sinh_nhat = datetime(2005, 5, 15) # 15/5/2005
tuoi = hien_tai - sinh_nhat
print(f"Số ngày sống: {tuoi.days}")
print(f"Tuổi (năm): {tuoi.days // 365}")
V. Tạo Module tùy chỉnh¶
1. Tạo file module¶
File: toan_hoc.py
"""
Module tính toán toán học dành cho học sinh
"""
def tinh_diem_trung_binh(diem_list):
"""Tính điểm trung bình"""
if not diem_list:
return 0
return sum(diem_list) / len(diem_list)
def xep_loai_hoc_luc(diem_tb):
"""Xếp loại học lực"""
if diem_tb >= 8.5:
return "Xuất sắc"
elif diem_tb >= 7.0:
return "Giỏi"
elif diem_tb >= 6.5:
return "Khá"
elif diem_tb >= 5.0:
return "Trung bình"
else:
return "Yếu"
def tinh_dien_tich_hinh_chu_nhat(dai, rong):
"""Tính diện tích hình chữ nhật"""
return dai * rong
def tinh_dien_tich_hinh_tron(ban_kinh):
"""Tính diện tích hình tròn"""
import math
return math.pi * ban_kinh ** 2
# Hằng số
PI = 3.14159
E = 2.71828
2. Sử dụng module tùy chỉnh¶
File: su_dung_module.py
# Import module tùy chỉnh
import toan_hoc
# Sử dụng các hàm
diem_so = [8, 7.5, 9, 8.5, 7]
diem_tb = toan_hoc.tinh_diem_trung_binh(diem_so)
loai = toan_hoc.xep_loai_hoc_luc(diem_tb)
print(f"Điểm trung bình: {diem_tb:.2f}")
print(f"Xếp loại: {loai}")
# Tính diện tích
dt_hcn = toan_hoc.tinh_dien_tich_hinh_chu_nhat(5, 3)
dt_ht = toan_hoc.tinh_dien_tich_hinh_tron(4)
print(f"Diện tích HCN: {dt_hcn}")
print(f"Diện tích hình tròn: {dt_ht:.2f}")
VI. Ví dụ minh họa thực tế¶
Ví dụ 1: Chương trình tính điểm và sinh số báo danh¶
import random
from datetime import datetime
def tao_so_bao_danh():
"""Tạo số báo danh ngẫu nhiên"""
nam_hien_tai = datetime.now().year
so_ngau_nhien = random.randint(1000, 9999)
return f"{nam_hien_tai}{so_ngau_nhien}"
def tinh_diem_tong_ket(toan, ly, hoa):
"""Tính điểm tổng kết và xếp loại"""
import math
# Tính điểm trung bình
diem_tb = (toan + ly + hoa) / 3
diem_tb = math.ceil(diem_tb * 10) / 10 # Làm tròn lên 1 chữ số
# Xếp loại
if diem_tb >= 8:
loai = "Giỏi"
elif diem_tb >= 6.5:
loai = "Khá"
elif diem_tb >= 5:
loai = "Trung bình"
else:
loai = "Yếu"
return diem_tb, loai
# Sử dụng
print("=== CHƯƠNG TRÌNH TÍNH ĐIỂM ===")
ten = input("Nhập tên học sinh: ")
toan = float(input("Điểm Toán: "))
ly = float(input("Điểm Lý: "))
hoa = float(input("Điểm Hóa: "))
so_bd = tao_so_bao_danh()
diem_tb, xep_loai = tinh_diem_tong_ket(toan, ly, hoa)
print(f"\n--- KẾT QUẢ ---")
print(f"Học sinh: {ten}")
print(f"Số báo danh: {so_bd}")
print(f"Điểm TB: {diem_tb}")
print(f"Xếp loại: {xep_loai}")
Ví dụ 2: Trò chơi tung xúc xắc¶
import random
import time
def tung_xuc_xac():
"""Tung một xúc xắc 6 mặt"""
return random.randint(1, 6)
def hieu_ung_tung():
"""Tạo hiệu ứng tung xúc xắc"""
print("Đang tung xúc xắc", end="")
for i in range(3):
time.sleep(0.5)
print(".", end="", flush=True)
print()
def choi_game():
"""Chơi game đoán kết quả xúc xắc"""
print("🎲 TRÒ CHƠI TUNG XÚC XẮC 🎲")
while True:
# Người chơi đoán
doan = int(input("Đoán kết quả (1-6): "))
# Tung xúc xắc
hieu_ung_tung()
ket_qua = tung_xuc_xac()
print(f"Kết quả: {ket_qua}")
if doan == ket_qua:
print("🎉 Chúc mừng! Bạn đoán đúng!")
else:
print("😞 Tiếc quá! Thử lại nhé!")
# Hỏi chơi tiếp
tiep_tuc = input("Chơi tiếp? (y/n): ")
if tiep_tuc.lower() != 'y':
break
# Chạy game
choi_game()
VII. Bài tập vận dụng tại lớp¶
Bài 1: Random số và thống kê¶
Đề bài: Sử dụng module random
để viết chương trình:
- Tạo danh sách 10 số ngẫu nhiên từ 1-100
- Tìm số lớn nhất và nhỏ nhất
- Tính trung bình các số
💡 Phân tích đề
Các bước thực hiện:
- Import module random
- Sử dụng random.randint() để tạo số ngẫu nhiên
- Tạo list 10 số bằng list comprehension
- Dùng max(), min() để tìm giá trị lớn nhất, nhỏ nhất
- Tính trung bình bằng sum()/len()
- Hiển thị kết quả đẹp mắt
Input/Output mẫu:
Danh sách | Min | Max | Trung bình |
---|---|---|---|
[45, 67, 23, 89, 12, 56, 78, 34, 91, 15] |
12 |
91 |
51.0 |
💡 Gợi ý code
import random
# Tạo danh sách 10 số ngẫu nhiên
so_ngau_nhien = [random.randint(1, 100) for _ in range(10)]
# Thống kê
so_lon_nhat = max(so_ngau_nhien)
so_nho_nhat = min(so_ngau_nhien)
trung_binh = sum(so_ngau_nhien) / len(so_ngau_nhien)
# Hiển thị kết quả
print(f"Danh sách: {so_ngau_nhien}")
print(f"Số lớn nhất: {so_lon_nhat}")
print(f"Số nhỏ nhất: {so_nho_nhat}")
print(f"Trung bình: {trung_binh:.2f}")
Bài 2: Tính hình tròn¶
Đề bài: Sử dụng module math
để viết chương trình tính:
- Chu vi và diện tích hình tròn với bán kính nhập từ bàn phím
- Sử dụng hằng số
math.pi
💡 Phân tích đề
Các bước thực hiện:
- Import module math
- Nhập bán kính từ bàn phím
- Sử dụng công thức chu vi = 2 * π * r
- Sử dụng công thức diện tích = π * r²
- Dùng math.pi cho hằng số π
- Hiển thị kết quả với 2 chữ số thập phân
Input/Output mẫu:
Bán kính | Chu vi | Diện tích |
---|---|---|
5 |
31.42 |
78.54 |
💡 Gợi ý code
import math
# Nhập bán kính
ban_kinh = float(input("Nhập bán kính hình tròn: "))
# Tính chu vi và diện tích
chu_vi = 2 * math.pi * ban_kinh
dien_tich = math.pi * ban_kinh ** 2
# Hiển thị kết quả
print(f"Bán kính: {ban_kinh}")
print(f"Chu vi: {chu_vi:.2f}")
print(f"Diện tích: {dien_tich:.2f}")
Bài 3: Tính tuổi và sinh nhật¶
Đề bài: Sử dụng module datetime
để viết chương trình:
- Nhập ngày sinh
- Tính tuổi hiện tại
- Tính ngày sinh nhật tiếp theo
💡 Phân tích đề
Các bước thực hiện:
- Import datetime
- Nhập ngày sinh theo định dạng dd/mm/yyyy
- Chuyển string thành datetime object
- Tính tuổi = năm hiện tại - năm sinh
- Tìm sinh nhật tiếp theo trong năm nay hoặc năm sau
- Tính số ngày còn lại đến sinh nhật
Input/Output mẫu:
Ngày sinh | Tuổi | Sinh nhật tiếp theo | Còn lại |
---|---|---|---|
15/03/2005 |
19 |
15/03/2025 |
45 ngày |
💡 Gợi ý code
from datetime import datetime, date
# Nhập ngày sinh
ngay_sinh_str = input("Nhập ngày sinh (dd/mm/yyyy): ")
ngay_sinh = datetime.strptime(ngay_sinh_str, "%d/%m/%Y").date()
# Tính tuổi
hom_nay = date.today()
tuoi = hom_nay.year - ngay_sinh.year
if hom_nay < date(hom_nay.year, ngay_sinh.month, ngay_sinh.day):
tuoi -= 1
# Tính sinh nhật tiếp theo
sinh_nhat_nam_nay = date(hom_nay.year, ngay_sinh.month, ngay_sinh.day)
if sinh_nhat_nam_nay < hom_nay:
sinh_nhat_tiep_theo = date(hom_nay.year + 1, ngay_sinh.month, ngay_sinh.day)
else:
sinh_nhat_tiep_theo = sinh_nhat_nam_nay
ngay_con_lai = (sinh_nhat_tiep_theo - hom_nay).days
print(f"Tuổi hiện tại: {tuoi}")
print(f"Sinh nhật tiếp theo: {sinh_nhat_tiep_theo.strftime('%d/%m/%Y')}")
print(f"Còn {ngay_con_lai} ngày nữa")
Bài 4: Module máy tính¶
Đề bài: Tạo module may_tinh.py
chứa các hàm tính toán cơ bản (+, -, *, /) và sử dụng trong chương trình chính.
💡 Phân tích đề
Các bước thực hiện:
- Tạo file may_tinh.py với 4 hàm cơ bản
- Mỗi hàm nhận 2 tham số và trả về kết quả
- Xử lý chia cho 0 trong hàm chia
- Tạo file chính import module
- Tạo menu lựa chọn phép toán
- Gọi hàm tương ứng từ module
Input/Output mẫu:
Phép toán | Số 1 | Số 2 | Kết quả |
---|---|---|---|
Cộng |
10 |
5 |
15 |
Chia |
10 |
0 |
Lỗi: Không thể chia cho 0 |
💡 Gợi ý code
# File: may_tinh.py
def cong(a, b):
return a + b
def tru(a, b):
return a - b
def nhan(a, b):
return a * b
def chia(a, b):
if b == 0:
return "Lỗi: Không thể chia cho 0"
return a / b
# File: main.py
import may_tinh
print("=== MÁY TÍNH ===")
print("1. Cộng")
print("2. Trừ")
print("3. Nhân")
print("4. Chia")
lua_chon = input("Chọn phép toán (1-4): ")
a = float(input("Nhập số thứ nhất: "))
b = float(input("Nhập số thứ hai: "))
if lua_chon == "1":
ket_qua = may_tinh.cong(a, b)
elif lua_chon == "2":
ket_qua = may_tinh.tru(a, b)
elif lua_chon == "3":
ket_qua = may_tinh.nhan(a, b)
elif lua_chon == "4":
ket_qua = may_tinh.chia(a, b)
print(f"Kết quả: {ket_qua}")
VIII. Bài tập về nhà¶
Bài 1: Module quản lý học sinh¶
Đề bài: Tạo module quan_ly_hoc_sinh.py
chứa các hàm quản lý thông tin học sinh (thêm, sửa, xóa, tìm kiếm) và viết chương trình sử dụng module này.
💡 Phân tích đề
Các bước thực hiện:
- Tạo module với list lưu trữ học sinh (dict)
- Hàm them_hoc_sinh(): thêm thông tin mới
- Hàm sua_hoc_sinh(): cập nhật thông tin theo ID
- Hàm xoa_hoc_sinh(): xóa học sinh theo ID
- Hàm tim_kiem(): tìm kiếm theo tên hoặc ID
- Hàm hien_thi_tat_ca(): hiển thị danh sách
- Chương trình chính với menu lựa chọn
Input/Output mẫu:
Chức năng | Input | Kết quả |
---|---|---|
Thêm | ID: HS001, Tên: An, Lớp: 10A |
Thêm thành công |
Tìm | Tên: An |
Tìm thấy HS001 |
Bài 2: Máy tính khoa học¶
Đề bài: Viết chương trình "Máy tính khoa học" sử dụng module math
với các chức năng:
- Tính căn bậc hai, lũy thừa
- Tính sin, cos, tan
- Chuyển đổi độ/radian
💡 Phân tích đề
Các bước thực hiện:
- Import module math
- Tạo menu với các chức năng khoa học
- Hàm căn bậc hai: math.sqrt()
- Hàm lũy thừa: math.pow() hoặc **
- Hàm lượng giác: math.sin(), cos(), tan()
- Chuyển đổi: math.radians(), math.degrees()
- Xử lý lỗi đầu vào và hiển thị kết quả
Input/Output mẫu:
Chức năng | Input | Kết quả |
---|---|---|
√ |
25 |
5.0 |
sin |
30° |
0.5 |
Bài 3: Module trò chơi¶
Đề bài: Tạo module tro_choi.py
chứa các mini game (đoán số, xúc xắc, kéo búa bao) và viết menu để chọn game.
💡 Phân tích đề
Các bước thực hiện:
- Tạo module với 3 game riêng biệt
- Game đoán số: random + logic đoán
- Game xúc xắc: random.randint(1,6)
- Game kéo búa bao: random.choice()
- Mỗi game trả về kết quả thắng/thua
- Menu chính cho phép chọn game
- Thống kê số game thắng/thua
Input/Output mẫu:
Game | Input | Kết quả |
---|---|---|
Đoán số | 50 |
Lớn hơn! |
Kéo búa bao | Kéo |
Máy: Bao, Bạn thắng! |
Bài 4: Lịch học tập¶
Đề bài: Viết chương trình "Lịch học tập" sử dụng module datetime
:
- Tạo lịch học trong tuần
- Tính thời gian còn lại đến kỳ thi
- Nhắc nhở deadline bài tập
💡 Phân tích đề
Các bước thực hiện:
- Import datetime, timedelta
- Tạo dict lịch học theo thứ trong tuần
- Hiển thị lịch học hôm nay
- Nhập ngày thi, tính countdown
- Tạo list deadline bài tập
- Kiểm tra deadline sắp đến (trong 3 ngày)
- Hiển thị thông báo nhắc nhở
Input/Output mẫu:
Ngày | Lịch học | Deadline | Nhắc nhở |
---|---|---|---|
Thứ 2 |
Toán, Văn |
Bài tập Toán: 15/03 |
Còn 2 ngày! |
IX. Ghi chú quan trọng¶
- Import đúng cách: Chỉ import những gì cần thiết để tránh làm chậm chương trình.
- Đặt tên module: Tên file module nên ngắn gọn, có ý nghĩa, không có dấu cách.
- Tài liệu: Nên viết docstring cho các hàm trong module tùy chỉnh.
- Kiểm tra module: Sử dụng
if __name__ == "__main__":
để test module. - Đường dẫn: Module phải ở cùng thư mục hoặc trong Python path.
- Phiên bản: Một số module có thể khác nhau giữa các phiên bản Python.