100 câu hỏi phỏng vấn thuật toán hàng đầu năm 2022
CÁC CÂU HỎI VỀ NGÔN NGỮ1) List và tuple khác nhau thế nào?
Khi nào nên sử dụng list, khi nào nên dùng tuple: Show
Nên dùng tuple để lưu trữ những thông tin bạn không muốn thay đổi trong quá trình thực thi, chẳng hạn như danh sách chọn lựa giới tính của một người, chúng ta có thể định nghĩa dưới dạng một tuple như sau: gender_chocies = ((1, 'Nam'), (2, 'Nữ'), (3, 'Không tiết lộ')). Khi lưu vào database, chúng ta chỉ cần lưu các giá trị 1, 2, hoặc 3 để tiện xử lý. Khi hiện thị, chúng ta có thể dễ dàng hiện thị Nam thay cho giá trị 1, Nữ thay cho giá trị 2, và Không tiết lộ thay cho giá trị 3. Vì lists có thể thay đổi được sau khi khởi tạo, chúng ta nên dùng nó để chứa các thông tin cần thay đổi trong quá trình thực thi chương trình. Ví dụ: danh sách các mã chứng khoán đáp ứng một tiêu chí lọc. Chúng ta lưu trong list để có thể thay đổi thứ tự của các mã chứng khoán trong danh sách đó theo tên, hoặc theo giá. 2) Làm sao để chuyển một list thành một tuple?
3) List và array khác nhau thế nào?
4) Làm sao để chuyển một list thành một array?Khi lập trình, sẽ có lúc chúng ta cần chuyển list thành array để thực hiện các phép toán trên đó một cách hiệu quả hơn. Để thực hiện việc này, chúng ta sử dụng hàm
5) Python
quản lý bộ nhớ thế nào?
6) Bạn thực hiện đa luồng (multithreading) trong Python thế nào?
7) Monkey patching là gì?Trong Python, thuật ngữ monkey patch chỉ việc thay đổi một lớp (class) hay một module trong quá trình thực thi (run-time) 8) Hàm lambda là gì? Cho 1 ví dụ để minh hoạ khi nào nên dùng, khi nào không nên dùng.Hàm lambda là một hàm nhỏ không có tên và trả về một đối tượng. Đối tượng do hàm lambda trả về thường được gán cho 1 biến hoặc được sử dụng như một thành phần của một hàm lớn hơn. Thay vì dùng từ khoá def để định nghĩa hàm như thông thường, hàm lambda được định nghĩa bằng cách dùng từ khoá lambda. Ví dụ, ta có thể tạo hàm lambda để cộng thêm 10 vào biến a như sau:
Kết quả trả về của x(5) sẽ là 15 Mục tiêu của hàm lambda Hàm lambda dễ đọc hơn nhiều so voi một hàm thông thường vì nó có thể được viết trên 1 dòng lệnh. Do đó, dùng hàm lambda khi biểu thức hàm nhỏ là một cách thực hành tốt. Cái đẹp của hàm lambda là nó trả về một đối tượng hàm. Đặc tính này làm cho hàm lambda trở nên hữu dụng khi sử dụng với các hàm map hoặc filter vốn đòi hỏi các đối tượng hàm làm tham số. Hàm lambda không hữu dụng khi biểu thức hàm vượt quá 1 dòng. 9) Pickling và unpickling là gì?Module Pickle nhận một đối tượng Python, chuyển nó thành chuỗi đại diện, và lưu nó ra tập tin bằng hàm dump. Quá trình này gọi là pickling. Quá trình ngược lại, nghĩa là chuyển một chuỗi đại diện thành đối tượng Python được gọi là unpickling. 10) Numpy array có lợi thế gì so với list (hoặc list lồng trong list - nested list)?
11) Giải thích cơ chế kế thừa trong Python và đưa ra một ví dụ minh hoạ:Kế thừa cho phép một Lớp (Class) thừa hưởng tất cả các thành phần (thuộc tính và hàm) của một Lớp khác. Kế thừa giúp tăng khả năng tái sử dụng mã nguồn, giúp dễ tạo và bảo trì các ứng dụng. Lớp cho kế thừa được gọi là Lớp cha (super class) và lớp kế thừa từ lớp khác được gọi là Lớp con (child class.) Python hỗ trợ 4 kiểu kế thừa sau:
12) Tính đa hình (Polymorphism) trong Python là gì?Tính đa hình chỉ khả năng một đối tượng có thể có nhiều hình thức khác nhau. Ví dụ, nếu Lớp cha có một hàm tên ABC, Lớp con có thể có một hàm cùng tên nhưng với các tham số và biến khác nhau. Python hỗ trợ tính đa hình. 13) Hãy giải thích sự khác nhau giữa hàm range() và hàm xrange():Trong phần lớn các trường hợp range() và xrange() chỉ cùng một tính năng. Chúng đều cho chúng ta tạo ra một Danh sách (List) các số nguyên để sử dụng. Sự khác biệt duy nhất là hàm range trả về một đối tượng Danh sách của Python, còn hàm xrange trả về một đối tượng xrange. 14) Hãy giải thích sự khác nhau giữa Flask và DiangoDjango là một khung ứng dụng web (Web framework) mã nguồn mở, trình độ cao giúp "khuyến khích việc phát triển nhanh, thiết kế thực dụng, tinh tế và sạch sẽ." Django chạy nhanh, an toàn, và có khả thể mở rộng (scalable) nhanh. Django có hỗ trợ cộng đồng mạnh mẽ và tài liệu chi tiết. Django là một gói tổng thể, trong đó bạn sẽ có Bảng điều khiển quản trị (Admin panel,) giao diện cơ sở dữ liệu (CSDL,) và cấu trúc thư mục ngay khi tạo ứng dụng. Ngoài ra, nó còn nhiều tính năng, nên bạn không cần thêm các thư viện riêng và các thư viện phụ thuộc. Một vài tính năng sẵn có là xác thực người dùng, động cơ mẫu (template engine,) định tuyến (routing,) quản lý thay đổi và dịch chuyển thiết kế CSDL (database schema migration,) và rất nhiều tính năng khác. Django rất linh động. Bạn có thể dùng Django để làm các ứng dụng tối thiểu (MVP - Minimum Viable Product) cho đến các ứng dụng cho các công ty lớn. Để tiện hình dung, một số công ty lớn sử dụng Django là Instagram, Dropbox, Pinterest, và Spotify. Flask là một khung ứng dụng web vi mô (microframework.) Nó không bao gồm sẵn các thư viện cần thiết cho việc phát triển web toàn tập như Django. Flask tiếp cận theo hướng tối giản, nghĩa là bạn sẽ thêm các thư viện trong quá trình lập trình thay vì đóng gói chúng sẵn trong khung ứng dụng. Triết lý của Flask là Flask chỉ cung cấp những thành phần bạn cần để xây dựng một ứng dụng để bạn có sự linh hoạt và kiểm soát. Nói cách khác, Flask không giả định bạn sẽ cần thư viên này hay thư viên khác và đóng gói chúng sẵn. Thay vào đó, Flask để bạn chọn lựa và thêm các thư viện khi mình cần. Một số tính năng Flask cung cấp là Máy chủ phục vụ web (dành cho quá trình phát triển,) xử lý yêu cầu RESTFUL, http, và rất nhiều tính năng khác. 15) PYTHONPATH là gì?Đó là một biến môi trường được sử dụng khi một đơn nguyên ứng dụng (module) được nhập (import) vào chương trình. Khi nhập một module, PYTHONPATH sẽ được tìm kiếm để kiểm tra sự có mặt của module được yêu cầu nhập trong các thư mục khác. Trình phiên dịch dùng biến PYTHONPATH để xác định module nào sẽ được tải vào bộ nhớ. Nguồn: lược dịch từ https://dev.to/educative/50-python-interview-questions-and-answers-nh2#q12 16) PEP 8 là gì?PEP là chữ viết tắt của Python Enhancement Proposal (Đề xuất tăng cường Python.) Đó là một bộ các quy ước về cách viết, định dạng mã nguồn, một bộ các đề xuất về cách viết mã nguồn Python để dễ đọc hơn. 17) Vật trang trí (decorator) Python là gì?Vật trang trí là một mẫu thiết kế (design pattern) trong Python cho phép người dùng thêm tính năng cho một đối tượng sẵn có mà không cần sửa đổi cấu trúc của nó. Vật trang trí thường được gọi trước định nghĩa hàm chúng ta muốn trang trí. 18) Init là gì?__init__ là một hàm tạo dựng (constructor) trong Python. Hàm này tự động được gọi để phân chia bộ nhớ khi một đối tượng hay một thực thể (instance) của một Lớp được khởi tạo. Tất cả các Lớp đều có hàm __init__ 19) Toán tử bộ ba là gì?Toán tử bộ ba là một cách viết câu lệnh điều kiện trong Python. Như từ 'bộ ba' trong tên gợi ý, toán tử này bao gồm 3 thành phần:
Toán tử bộ ba có thể được xem như một phiên bản đơn giản hoá, 1 dòng của câu lệnh if-else với một điều kiện. Cú pháp
Biến var bên tay trái của toán tử gán sẽ có giá trị:
20) Biến toàn cục (global) và biến địa phương (local) trong Python là gì?Biến toàn cục là các biến được khai báo bên ngoài phạm vi một hàm hoặc được khai báo trong không gian toàn cục. Các biến này có thể được truy xuất bởi bất kỳ hàm nào trong chương trình. Biến địa phương là các biến được khai báo trong phạm vi của một hàm. Các biến địa phương tồn tại trong không gian địa phương, và không tồn tại trong không gian toàn cục. Biến địa phương chỉ có thể được truy xuất trong phạm vi hàm mà nó được khai báo. 21) @property trong Python là gì?@property là một vật trang trí trong Python. @property trước định nghĩa một hàm cho phép truy xuất hàm đó như cách truy xuất một thuộc tính (không cần cặp ngoặc đơn sau tên hàm.) 22) try / except được sử dụng thế nào trong Python?Một "ngoại lệ" (exception) là một lỗi xảy ra trong quá trình thực thi một chương trình. Khi lỗi này phát sinh, chương trình sẽ dừng lại và tạo ra một "ngoại lệ" và chuyển những "ngoại lệ" này qua bộ xử lý riêng để ngăn chương trình bị dừng thực thi do lỗi (crash.) Những ngoại lệ được tạo ra bởi một chương trình có thể được bắt trong khối lệnh try và xử lý trong khối lệnh except.
23) Hãy giải thích sự khác biệt giữa Python 2 và Python 3
24) Hàm join trong Python là gì?Hàm Cách
Output: 25) Toán tử tạo từ điển từ biến khả lặp (dictionary comprehension) là gì?Đây là một cách tạo 1 từ điển trong Python. Nó tạo ra một từ điển bằng cách sáp nhập 2 bộ dữ liệu ở dạng danh sách (list) hoặc mảng (array.) Dữ liệu của một trong hai list / array sẽ trở thành 'từ khoá' của từ điển, cái còn lại là giá trị. Mỗi 'từ khoá' sẽ là khoá nhận dạng duy nhất cho 1 giá trị, và do đó, kích thước của 2 list/array nên bằng nhau. Cú pháp chung: tu_dien_moi = {key:value for (key, value) in bien_kha_lap} Ví dụ: Ví dụ dưới đây áp dụng cho CSDL của trường đại học và sử dụng phương pháp sáp nhập đơn giản (không có điều kiện.) Giả sử CSDL chưa nhiều dữ liệu như địa chỉ, điểm, học phí, mã số SV, v.v... Bây giờ chúng ta cần xác định mỗi SV duy nhất và tạo ra một từ điển chỉ chứa thông tin các sinh viên. Quyết định của chúng ta đơn giản dựa vào 2 câu hỏi: Từ khoá (key) nên là thông tin nào? Giá trị (value) nên là thông tin nào? Ở đây chúng ta chọn Mã số SV làm từ khoá và tên sinh viên là giá trị, vì mã số SV là duy nhất, còn tên có thể bị trùng.
Output: 26) Làm sao để tạo ra bản sao sâu (deep copy) trong Python?Tạo bản sao sâu chỉ việc sao chép một đối tượng. Khi dùng toán tử gán (=,) chúng ta không tạo ra bản sao của một đối tượng, mà thay vào đó, chúng ra chỉ trỏ biến của mình vào cùng một đối tượng (tạo bản sao nông.) Điều này nghĩa là thay đổi giá trị của một biến cũng sẽ ảnh hưởng đến giá trị của biến kia, vì nó cùng trỏ về một đối tượng. Sự khác biệt giữa bản sao sâu và bản sao nông chỉ áp dụng với các đối tượng chứa các đối tượng khác như danh sách (list) và các biến thực thể của Lớp. Phương pháp Để tạo bản sao sâu của một đối tượng, chúng ta nhập vào chương trình module copy trong Python. Module này có chứa hàm deepcopy() giúp đơn giản hoá công việc của chúng ta. Cú pháp Hàm này nhận đối tượng chúng ta muốn tạo bản sao làm tham số, và trả về bản sao của đối tượng đó.
Output: 27) Làm sao để kiểm tra xem một từ điển có chứa một từ khoá nào đó?Kiểm tra xem một từ khoá có trong từ điển hay không trước khi truy xuất giá trị của từ khoá đó trong từ điển là một cách thực hành an toàn. Để làm việc này, Python cung cấp 2 hàm sẵn có (built-in):
Hàm has_key() trả về kết quả True nếu từ khoá có trong từ điển, và False trong trường hợp ngược lại.
Output: Key exists Câu lệnh if-in kiểm tra xem một từ khoá có trong từ điển hay không
Output: Key exists 28) Bạn thực hiện kỹ thuật nhớ kết quả tạm (memoization) trong Python thế nào?Memoization là một kỹ thuật cải thiện tốc độ tính toán của các chương trình sử dụng thuật toán đệ quy (recursive.) Kỹ thuật Memoization lưu các kết quả tính toán của các bước trung gian trong một mảng, và truy xuất chúng trong các bước đệ quy sau, thay vì phải tính lại kết quả của các bước trước đó. Để minh hoạ, hãy xem đoạn mã rất tốn kém về mặt tính toán sau:
Ứng dụng kỹ thuật nhớ tạm (memoization) có thể được thực hiện qua việc dùng vật trang trí Python như sau:
Output: 4.9035000301955733e-05 29) Bạn xếp thứ tự từ điển trong Python thế nào?Chúng ta có thể xếp thứ tự từ điển theo 'từ khoá' hoặc theo 'giá trị' dùng hàm sorted(). Trước hết, chúng ta cần biết cách lấy dữ liệu từ từ điển để truyền vào hàm sorted. Có 3 cách lấy dữ liệu từ từ điển:
Cú pháp: Sorted(data[bắt buộc], key[tuỳ chọn], reverse[tuỳ chọn]) Hàm sorted nhận một tham số bắt buộc và 2 tham số tuỳ chọn.
30) Bạn dùng hàm any() và all() thế nào và khi nào?Hàm
Truyền biến khả lặp cho hàm any() để kiểm tra xem có thành phần nào có giá trị True hay không có thể được thực hiện như sau:
Output: Lệnh in đầu tiên trả về kết quả True vì một trong những thành phần của biến one_truth có giá trị True. Trong khi đó, lệnh in thứ hai trả về kết quả False vì không một thành phần nào trong biến three_lies có giá trị True. Dùng hàm any() để kiểm tra một chuỗi dài các điều kiện or Hàm
Output: Câu lệnh đầu tiên trả về kết quả True vì all_true bao gồm tất cả các thành phần có giá trị True. Truyền biến one_true cho hàm all() trả về kết quả False vì tham số có 1 chứa 1 hoặc nhiều hơn một giá trị False. Và sau cùng, truyền biến all_false cho hàm all(), chúng ta nhận được kết quả False vì tham số bao gồm một hoặc nhiều hơn giá trị False. Dùng hàm all() khi cần kiểm tra một chuỗi dài các điều kiện and 31) Python Docstring là gì?Python docstrings là một cách thích hợp để gắn tài liệu thuyết minh mã lập trình với:
Nó là đoạn văn bản nhất định cho đoạn mã gắn liền với nó. Không như những lời bình lập trình (code comments,) docstring mô tả việc mà một hàm thực hiện, không phải cách nó thực hiện. docstring có thể được truy xuất bằng cách gọi hàm:
32) Missing question?To be filled out later 33) Hãy giải thích sự khác nhau giữa Bộ tạo (generator) và Bộ lặp (iterator) trong Python.Bộ lặp (iterator) trong Python đóng vai trò như một kẻ giữ chỗ cho các đối tượng để nó có thể duyệt qua; Bộ tạo (generator) tạo điều kiện dễ dàng cho việc tạo một bộ lặp tuỳ biến. Như vậy, một bộ tạo luôn luôn là một bộ lặp, nhưng không phải lúc nào một bộ lặp cũng là một bộ tạo. Ngoài những khác biệt về cú pháp, còn có các khác biệt đáng kể sau:
Ví dụ về một Bộ lặp
Output: Ví dụ về Bộ tạo
Output: 34) |