Phỏng vấn Python: từ list, dict đến decorator, generator và GIL

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

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.

Cấu trúc dữ liệu cơ bản

  • list: có thứ tự, thay đổi được, cho phép trùng.
  • tuple: có thứ tự, không thay đổi được, dùng cho dữ liệu cố định hoặc làm khóa của dict.
  • dict: cặp khóa và giá trị, tra cứu nhanh, giữ thứ tự chèn từ Python 3.7.
  • set: tập hợp không trùng, kiểm tra thành viên nhanh.

Mutable và immutable

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 items

Giá 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.

List comprehension và generator

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 -= 1

Generator 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à gì?

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 và **kwargs

*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.

Context manager và with

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.

GIL và đa luồng

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ả.

Một số câu hỏi hay gặp khác

  • is và ==: == so sánh giá trị, is so sánh danh tính đối tượng.
  • Sao chép nông và sâu: copy.copy chỉ sao chép lớp ngoài, copy.deepcopy sao chép toàn bộ đối tượng lồng nhau.
  • Môi trường ảo: venv tách thư viện giữa các dự án.
  • PEP 8: quy ước định dạng code Python phổ biến.

Ví dụ thực hành: đếm từ trong một văn bả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.

Câu hỏi về kiểm thử và chất lượng code

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.

Python cho từng vị trí

  • Web: nên biết Django hoặc FastAPI, ORM, xác thực, REST.
  • Tự động hóa: thư viện chuẩn như os, pathlib, subprocess, xử lý file và gọi API.
  • Dữ liệu: pandas, NumPy, trực quan hóa, hiểu về làm sạch dữ liệu.

Kết luận

Đừ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.

author_photo
Nguyễn Đình Cường

0 comment