Bỏ Túi 12 Câu Hỏi Phỏng Vấn Python Thú Vị

Bỏ Túi 12 Câu Hỏi Phỏng Vấn Python Thú Vị

Chào các bạn, mình quay trở lại với chủ đề các câu hỏi phỏng vấn Python, lần này sẽ là các câu hỏi có tính tư duy và hiểu sâu hơn một chút về ngôn ngữ lập trình Python. Hy vọng sẽ giúp các bạn chủ động trong quá trình đi phỏng vấn, tìm kiếm công việc/thử thách mới.
Các bạn có thể xem lại các câu phỏng vấn nhanh ở phần một của chủ đề phỏng vấn: Tuyển Tập Câu Hỏi Phỏng Vấn Nhanh Về Python (Phần 1) 

1. Tại sao Python lại thực thi chậm và làm cách nào để cải thiện tốc độ thực thi ?

Lý do chính đằng sau việc Python thực thi chậm là vì nó là ngôn ngữ lập trình thông dịch.
Thông thường, chúng ta sẽ dùng Cython để thực hiện thông dịch source code Python sang thành định dạng trung gian là .pyc file (hay gọi là pycache) sau đó mới thực hiện biên dịch pyc file sang mã máy.
Với các ngôn ngữ lập trình khác thì việc thực hiện biên dịch sẽ đưa mã nguồn sang trực tiếp mã ngôn ngữ máy (C/C++).

Để cải thiện tốc độ xử lý của chương trình viết bằng Python, chúng ta có thể sử dụng các trình thông dịch khác như CPython, Numba,...
Ngoài ra có thể thực hiện thay đổi trong source code:
- Sử dụng các built-in function và các thư viện có sẵn thay vì cố viết lại các module bằng các thuật toán chưa tối ưu.
- Tối ưu thuật toán để giảm chi phí về bộ nhớ độ phức tạp tính toán.
- Hạn chế các đoạn code dư thừa, hoặc đưa chương trình vào các vòng lặp không có nhiều ý nghĩa (sử dụng break, continue đúng chỗ)

Các bạn có thể tham khảo về numba qua bài viết này của tôi: Lên Đời Tốc Độ Phép Tính Toán Trong Python Với Numba https://codelearn.io/sharing/make-python-faster-with-numba

2. Những đặc điểm khiến bạn thích thú với Python ?

- Dễ học, dễ ứng dụng (easy to code), dễ dàng thực hiện debug khi có nhu cầu.
- Miễn phí, mã nguồn mở và nhiều thư viện xây dựng sẵn của cộng đồng và bên thứ 3.
- Ngôn ngữ lập trình bậc cao, với đầy đủ các chức năng như OOP, function-programming,...
- Dễ dàng tích hợp hoặc mở rộng ứng dụng với cả các ứng dụng phiên bản cũ viết bằng C/C++
- Cung cấp đầy đủ các cấu trúc dữ liệu thông dụng và các built-in function đi kèm.

3. Dùng Python có thể làm được những ứng dụng gì ?

- Web development: Có thể sử dụng các framework như Flask/DJango/FastAPI/.... để xây dựng nhanh các ứng dụng web.
- Desktop GUI development: Sử dụng PyQt5, Tkinter, Kivy, ... để xây dựng các desktop application.
- Artificial Intelligence and Machine learning: Ngày càng có nhiều các thư viện, framework xây dựng trên nền tảng Python hỗ trợ lập trình viên xây dựng hiệu quả các ứng dụng AI/ML.
- Console Based Application: Viết các script chạy trên màn hình console để thực hiện tích hợp, phân tích, tổng hợp, xử lý nhanh dữ liệu. Một trong số những loại ứng dụng mà các sysadmin/devops engineer yêu thích.
- Software Testing/Web Automation: Với thư viện selenium, Python đang làm mưa làm gió với lĩnh vực automation testing và việc tự động lấy dữ liệu trên các trang web.
- Image Processing, Audio or Video-Based Application: Viết các ứng dụng xử lý hình ảnh, âm thanh và video để thu thập, trích xuất thông tin cần thiết.

4. Giới hạn hay nhược điểm của Python

- Tốc độ thực thi.
- Khả năng phát triển các ứng dụng cho điện thoại thông minh đang bị hạn chế.
- Khi thực thi chiếm nhiều dung lượng bộ nhớ.
- Sự không tương thích giữa version Python 2 và version Python 3
- Runtime Errors: Chương trình sẽ thực hiện thông dịch ngay tại thời điểm được gọi đến. Do vậy, một số lỗi tại các module được gọi đến sau khi chương trình đã chạy có thể bị lỗi mà không được phát hiện ra ngay từ đầu.
- Khó thực hiện bảo vệ source code.

5. Bộ nhớ được quản lý như thế nào trong Python?

Việc sử dụng bộ nhớ trong các ứng dụng Python được quản lý bởi Python private headspace. Tất cả các đối tượng trong Python và các loại cấu trúc dữ liệu đều được đặt ở private headspace.

Việc phân bổ các ô nhớ của private heapspace được quản lý bởi trình quản lý bộ nhớ Python.

Python cũng có một bộ thu gom rác tự động (garbage collector) để sẵn sàng thực hiện giải phóng các bộ nhớ không sử dụng và làm cho các headspace được available.

6. Python có các kiểu cấu trúc dữ liệu chính nào?

- List: Kiểu dữ liệu danh sách, cho phép lưu trữ tất cả các loại kiểu dữ liệu khác
- Sets: Kiểu dữ liệu danh sách, không cho phép dữ liệu trùng lặp trong set (sẽ tự thực hiện remove duplicate)
- Tuple: Kiểu dữ liệu theo từng cặp (2,3,4,... phần tử)
- Dictionary: Kiểu dữ liệu key-value

7. Phân biệt remove, del và pop trong list Python?

- pop: Xóa phần tử trên cùng khỏi danh sách. Trả về phần tử vừa xóa (nếu có dữ liệu hoặc None)
- remove: Xóa bỏ phần tử đầu tiên trong danh sách hoặc xóa bỏ một phần tử nào đó nếu có truyền vào giá trị tham số.
- del: Xóa các phần tử được chỉ định theo chỉ mục. Không có dữ liệu trả về.

8. Phân biệt cách sử dụng break, continue, và pass ?

- break: Làm chương trình thoát ra khỏi vòng lặp
- continue: Ngưng thực hiện các câu lệnh phía dưới, cho phép vòng lặp quay lại để nạp giá trị mới.
- pass: Bỏ qua việc thực thi các câu lệnh ở phía sau.

9. Phân biệt sự khác nhau của toán tử so sánh = và is ?

Toán tử == là để so sánh giá trị có bằng nhau hay không của các đối tượng hoặc các giá trị.
Is là để kiểm tra xem 2 đối tượng có cùng tham chiều đến một địa chỉ bộ nhớ hay không.

Ví dụ: 2 list bên dưới có giá trị bằng nhau nhưng id khác nhau (id - Số Thẻ Căn Cước Của Mỗi Đối Tượng Trong Python)
 

>>> lst1 = [1, 2, 3]
>>> lst2 = [1, 2, 3]
>>> lst1 == lst2
True
>>> lst1 is lst2
False
>>> id(lst1)
2410805405760
>>> id(lst2)
2410805406272

10. Lambda function là gì?

Lambda function là loại function viết trên một dòng, có thể hoặc không được gán tên, nhận nhiều input đầu vào nhưng chỉ có 01 output đầu ra.

Ví dụ: 

>>> call_sum = lambda x, y, z : x + y + z
>>> print(call_sum(1, 2, 3))
6

11. *args và **kwargs trong tham số vào của function là gì?

*args được sử dụng khi chúng ta chưa biết rõ số lượng của đối số truyền vào. args bản chất là một tuple. Để lấy ra các phần tử, dùng index hoặc đưa vào vòng lặp for.

**kwagrs được sử dụng khi muốn được truyền các thông tin dưới dạng key=value vào function mà chúng ta chưa biết có bao nhiêu cặp thông tin như thế. kwargs lúc này là một đối tượng kiểu dictionary

Ví dụ: 

>>> def demo(*args, **kwagrs):
...     print(type(args))
...     for index, value in enumerate(args):
...         print(index, value)
...     print(type(kwagrs))
...     print(kwagrs)
...
>>>
>>> demo(1, 2, 3, 4, 5, 6, key_1="code", key_2="learn", key_3=".io")
<class 'tuple'>
0 1
1 2
2 3
3 4
4 5
5 6
<class 'dict'>
{'key_1': 'code', 'key_2': 'learn', 'key_3': '.io'}

12. zip function có chức năng như thế nào?

Built-in function zip sẽ thực hiện ghép các dữ liệu trong 2 hoặc nhiều iterable thành một danh sách mới. Điều kiện là dữ liệu trong 2 iterable phải bằng nhau. Nếu số lượng phần tử không bằng nhau thì kết quả trả về sẽ là danh sách có số lượng tối đa phần tử bằng nhau. 

Ví dụ: 3 list dưới đây có 2 list là 3 phần tử, 1 list có 2 phần tử --> sau khi thực hiện zip thì thu được danh sách mới có 2 phần tử 

>>> numbers = [1, 2, 3]
>>> words = ['one', 'two', 'three']
>>> stars = ['*', '**']
>>> my_zip = zip(numbers, words, stars)
>>> print(set(my_zip))

{(2, 'two', '**'), (1, 'one', '*')}

Kết

Trên đây là 12 câu hỏi ngắn mà tôi vừa trải qua trong vài kỳ phỏng vấn gần đây. Câu hỏi cũng khá đơn giản với dạng câu hỏi mở và câu hỏi cần có sample để giải thích kỹ hơn. Hy vọng các bạn sau khi đọc xong bài viết này sẽ ôn luyện được một chút kiến thức. 

Cảm ơn các bạn đã đọc bài viết.