Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Python được dùng trong web, tự động hóa, phân tích dữ liệu và AI, nên câu hỏi phỏng vấn khá đa dạng. Dù bạn nhắm vị trí nào, một số khái niệm cốt lõi của ngôn ngữ luôn được kiểm tra. Hãy cùng điểm qua từ cơ bản đến trung cấp.
Kiểu mutable (list, dict, set) có thể thay đổi tại chỗ, kiểu immutable (int, str, tuple) thì không. Một bẫy kinh điển là tham số mặc định mutable:
def add_item(item, items=[]): # nguy hiểm items.append(item) return itemsprint(add_item(1)) # [1]print(add_item(2)) # [1, 2] chứ không phải [2]def add_item_ok(item, items=None): if items is None: items = [] items.append(item) return itemsGiá trị mặc định được tạo một lần khi định nghĩa hàm, nên danh sách bị dùng chung giữa các lần gọi.
squares = [x * x for x in range(5)] # tạo cả danh sáchlazy = (x * x for x in range(5)) # generator, tính khi cầndef countdown(n): while n > 0: yield n n -= 1Generator sinh giá trị từng phần nhờ yield, tiết kiệm bộ nhớ khi xử lý dữ liệu lớn vì không giữ toàn bộ kết quả cùng lúc.
Decorator là hàm nhận một hàm và trả về hàm mới, thường để thêm hành vi như ghi log, đo thời gian, kiểm tra quyền mà không sửa hàm gốc.
import timefrom functools import wrapsdef timed(fn): @wraps(fn) def wrapper(*args, **kwargs): start = time.perf_counter() result = fn(*args, **kwargs) print(fn.__name__, time.perf_counter() - start) return result return wrapper@timeddef work(): return sum(range(1000000))*args gom các đối số vị trí dư thành tuple, **kwargs gom đối số có tên thành dict. Chúng giúp viết hàm linh hoạt và chuyển tiếp đối số cho hàm khác.
Câu lệnh with bảo đảm tài nguyên được giải phóng đúng cách, ví dụ đóng file kể cả khi có lỗi: with open('a.txt') as f: data = f.read(). Bạn có thể tự viết bằng cách định nghĩa __enter__ và __exit__ hoặc dùng contextlib.contextmanager.
Trong CPython, Global Interpreter Lock (GIL) chỉ cho phép một luồng thực thi bytecode Python tại một thời điểm. Vì vậy luồng không tăng tốc được tác vụ tính toán nặng CPU; với loại này nên dùng multiprocessing. Với tác vụ chờ I/O, luồng hoặc asyncio vẫn rất hiệu quả.
== so sánh giá trị, is so sánh danh tính đối tượng.copy.copy chỉ sao chép lớp ngoài, copy.deepcopy sao chép toàn bộ đối tượng lồng nhau.venv tách thư viện giữa các dự án.Câu live coding quen thuộc là đếm số lần xuất hiện của mỗi từ. Bạn có thể giải bằng dict hoặc collections.Counter:
from collections import Counterdef count_words(text): words = text.lower().split() return Counter(words)print(count_words('a b a c b a').most_common(2))# [('a', 3), ('b', 2)]Khi giải thích, hãy nói rõ độ phức tạp thời gian là O(n) vì duyệt qua từng từ một lần. Sau đó đề xuất cải tiến như loại bỏ dấu câu bằng biểu thức chính quy, hoặc xử lý file lớn theo từng dòng bằng generator để tiết kiệm bộ nhớ. Những mở rộng nhỏ như vậy cho thấy bạn nghĩ xa hơn đáp án đầu tiên.
Hãy sẵn sàng nói về pytest: cách viết hàm test đơn giản, dùng fixture để chuẩn bị dữ liệu và parametrize để chạy cùng một bài test với nhiều bộ đầu vào. Bạn cũng nên biết dùng type hints và công cụ kiểm tra tĩnh để phát hiện lỗi sớm, dù Python không bắt buộc khai báo kiểu.
os, pathlib, subprocess, xử lý file và gọi API.Đừng chỉ học thuộc định nghĩa. Hãy tự viết các ví dụ nhỏ như trên, chạy thử và quan sát kết quả. Khi bạn giải thích bằng ví dụ do chính mình thử, câu trả lời sẽ thuyết phục hơn nhiều.
Nếu bạn muốn học Python có lộ trình và bài tập thực hành, hãy xem các khóa học trên codebem.com.
Nguyễn Đình Cường
0 comment