Ngày đăng: 07/06/2023 | Không có phản hồi
Ngày cập nhật: 07/06/2023
Python là một trong những ngôn ngữ lập trình phổ biến nhất trên thế giới. Với cú pháp đơn giản và dễ hiểu, Python thu hút được sự chú ý của nhiều nhà phát triển phần mềm và nhà tuyển dụng. Trên thực tế, khi đi xin việc trong lĩnh vực lập trình Python, bạn sẽ gặp hàng loạt câu hỏi phỏng vấn liên quan đến ngôn ngữ này.
Trong bài viết này, Glints sẽ cùng bạn tìm hiểu một số câu hỏi phỏng vấn Python phổ biến nhất mà bạn có thể gặp trong quá trình tìm việc của mình.
Đây có thể coi là câu hỏi phỏng vấn Python phổ biến nhất. Python là một ngôn ngữ lập trình thông dịch bậc cao được biết đến với tính đơn giản và dễ đọc. Nó bao gồm rất nhiều lợi ích, bao gồm:
Đọc thêm: Học Python Để Làm Gì? Lý Do Nên Học Ngôn Ngữ Lập Trình Python
Trước khi tìm hiểu Dynamically Typed Language, bạn cần hiểu Typed là gì. Typed đề cập đến type-checking hay dịch nôm na là “kiểm tra kiểu” trong ngôn ngữ lập trình. Trong một ngôn ngữ strongly-typed như Python, “1” + 2 sẽ dẫn đến lỗi loại vì các ngôn ngữ này không cho phép “type-coercion” (chuyển đổi ngầm định các loại dữ liệu). Mặt khác, một ngôn ngữ weakly-typed, chẳng hạn như Javascript, sẽ chỉ xuất ra kết quả là “12”.
Type-checking có thể được thực hiện ở hai giai đoạn –
Python là một ngôn ngữ được thông dịch, thực thi từng dòng câu lệnh theo từng dòng và do đó, việc type-checking được thực hiện nhanh chóng trong quá trình thực thi. Chính vì vậy, Python là một Dynamically Typed Language.
PEP là viết tắt của Python Enhancement Proposal, có thể dịch là Đề xuất cải tiến Python. PEP là một tài liệu thiết kế chính thức cung cấp thông tin cho cộng đồng Python hoặc mô tả một tính năng mới cho Python hoặc các quy trình của nó. PEP 8 đặc biệt quan trọng vì nó ghi lại các nguyên tắc về kiểu dáng cho Mã Python. Rõ ràng việc đóng góp cho cộng đồng mã nguồn mở Python đòi hỏi bạn phải tuân theo các nguyên tắc về phong cách này một cách nghiêm ngặt.
Lists và Tuples đều là các kiểu dữ liệu chuỗi có thể lưu trữ một tập hợp các đối tượng trong Python. Các đối tượng được lưu trữ trong cả hai chuỗi có thể có các kiểu dữ liệu khác nhau. Lists được biểu diễn bằng dấu ngoặc vuông [‘sara’, 6, 0,19], trong khi Tuples được biểu thị bằng dấu ngoặc tròn (‘ansh’, 5, 0,97).
Nhưng sự khác biệt thực sự giữa chúng là gì? Sự khác biệt chính giữa hai loại này là trong khi Lists có thể thay đổi, thì mặt khác, Tuples là các đối tượng không thay đổi. Điều này có nghĩa là Lists có thể được sửa đổi, nối thêm hoặc cắt khi đang di chuyển nhưng Tuples không đổi và không thể sửa đổi theo bất kỳ cách nào. Bạn có thể chạy ví dụ sau trên Python IDLE để xác nhận sự khác biệt:
my_tuple = ('sara', 6, 5, 0.97)
my_list = ['sara', 6, 5, 0.97]
print(my_tuple[0]) # output => 'sara'
print(my_list[0]) # output => 'sara'
my_tuple[0] = 'ansh' # modifying tuple => throws an error
my_list[0] = 'ansh' # modifying list => list modified
print(my_tuple[0]) # output => 'sara'
print(my_list[0]) # output => 'ansh'
Packages Python và Modules Python là hai cơ chế cho phép lập trình mô-đun trong Python. Mô-đun hóa có một số lợi thế –
Nói chung, các mô-đun chỉ đơn giản là các tệp Python có phần mở rộng .py và có thể có một tập hợp các hàm, lớp hoặc biến được xác định và triển khai. Chúng có thể được nhập và khởi tạo một lần bằng cách sử dụng câu lệnh nhập. Nếu cần một phần chức năng, hãy nhập các lớp hoặc hàm cần thiết bằng cách sử dụng from foo import bar.
Các Packages cho phép cấu trúc phân cấp của không gian tên mô-đun bằng cách sử dụng ký hiệu dấu chấm. Vì, các mô-đun giúp tránh xung đột giữa các tên biến toàn cục, theo cách tương tự, các Packages giúp tránh xung đột giữa các tên mô-đun.
Việc tạo một Package rất dễ dàng vì nó sử dụng cấu trúc tệp vốn có của hệ thống. Vì vậy, chỉ cần nhét các mô-đun vào một thư mục và ở đó bạn có nó, tên thư mục là tên Package. Nhập mô-đun hoặc nội dung của mô-đun từ Package này yêu cầu tên Package làm tiền tố cho tên mô-đun được nối bằng dấu chấm.
Phần tiếp theo sẽ tập trung vào các câu hỏi phỏng vấn Python dành cho các ứng viên đã có kinh nghiệm về ngôn ngữ này. Các câu hỏi dưới đây chủ yếu tập trung vào các khái niệm cao cấp hơn cũng như tư duy xử lý thuật toán.
Memory trong Python được xử lý tự động bởi trình thông dịch Python. Python sử dụng một kỹ thuật gọi là đếm tham chiếu để theo dõi các đối tượng trong Memory. Khi số lượng tham chiếu của một đối tượng bằng 0, nghĩa là nó không còn được sử dụng nữa, trình thu gom rác của Python sẽ giải phóng Memory do đối tượng đó chiếm giữ.
Trong Python, Namespaces là một hệ thống theo dõi các tên được gán cho các đối tượng. Namespaces giúp tránh xung đột khi đặt tên và cung cấp cách tổ chức và truy cập các biến, hàm và lớp. Chúng đảm bảo rằng các tên là duy nhất và có thể được sử dụng mà không có xung đột trong các phạm vi khác nhau. Python cung cấp các loại Namespaces khác nhau, bao gồm Namespaces toàn cầu, Namespaces cục bộ và Namespaces tích hợp.
Scope Resolution đề cập đến quá trình truy cập các biến, hàm hoặc lớp trong Python. Khi một tên được tham chiếu trong một chương trình, Python sẽ tìm kiếm nó theo một thứ tự cụ thể được gọi là quy tắc “LEGB”:
Hiểu được Scope Resolution là rất quan trọng để giải quyết xung đột đặt tên và truy cập các biến hoặc hàm chính xác.
Trong Python 2, xrange và range là hai hàm được sử dụng để tạo một chuỗi số. Sự khác biệt chính nằm ở việc sử dụng bộ nhớ của chúng.
Xrange trả về một trình vòng lặp tạo ra các số một cách nhanh chóng mà không lưu trữ toàn bộ chuỗi trong bộ nhớ. Nó rất hữu ích khi làm việc với phạm vi lớn hoặc trong các tình huống mà hiệu quả bộ nhớ là rất quan trọng.
Range trả về một danh sách chứa tất cả các số trong phạm vi đã chỉ định. Nó tiêu tốn bộ nhớ để lưu trữ chuỗi hoàn chỉnh trước. Lệnh này phù hợp với phạm vi nhỏ hơn hoặc khi cần truy cập ngẫu nhiên vào các phần tử.
Trong Python 3, xrange đã bị xóa và phạm vi hoạt động giống như xrange của Python 2, còn range thì chỉ gồm một trình vòng lặp thay vì một danh sách.
Để xóa một tệp trong Python, bạn có thể sử dụng hàm os.remove() hoặc os.unlink() từ mô-đun os. Các hàm này lấy đường dẫn tệp làm đối số và xóa tệp khỏi hệ thống tệp. Đây là một ví dụ:
import os
file_path = 'path/to/file.txt'
if os.path.exists(file_path):
os.remove(file_path)
print("File deleted successfully.")
else:
print("File does not exist.")
Hãy nhớ xử lý các ngoại lệ một cách thích hợp, chẳng hạn như FileNotFoundError nếu tệp không tồn tại. Cả hai hàm split() và join() thường được sử dụng khi làm việc với chuỗi và thao tác với dữ liệu văn bản.
Bạn có thể sử dụng hàm split() để tách một chuỗi dựa trên dấu phân cách thành danh sách các chuỗi.
Bạn có thể sử dụng hàm join() để nối danh sách các chuỗi dựa trên dấu phân cách để tạo thành một chuỗi.
Để tạo một lớp trong Python, bạn có thể sử dụng từ khóa lớp theo sau là tên của lớp. Đây là một ví dụ:
class MyClass:
# Class attributes and methods go here
pass
Bạn có thể thêm các thuộc tính và phương thức vào định nghĩa lớp để xác định hành vi và thuộc tính của các đối tượng được tạo từ lớp.
Kế thừa là một khái niệm quan trọng trong lập trình hướng đối tượng, cho phép một lớp kế thừa các thuộc tính và phương thức từ một lớp khác. Trong Python, bạn có thể tạo một lớp con bằng cách chỉ định lớp cơ sở trong dấu ngoặc đơn sau tên lớp.
Dưới đây là một ví dụ:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("Animal speaks")
class Dog(Animal):
def __init__(self, name):
super().__init__(name)
def speak(self):
print("Dog barks")
dog = Dog("Buddy")
dog.speak() # Output: "Dog barks"
Trong ví dụ này, lớp Dog kế thừa từ lớp Animal. Nó kế thừa thuộc tính name và phương thức speak(). Lớp Dog cũng có thể ghi đè phương thức được kế thừa để cung cấp cách triển khai của riêng nó.
Trong Python, bạn có thể truy cập các parent members (thuộc tính hoặc phương thức) trong một child class – lớp con bằng cách sử dụng hàm super(). Hàm super() trả về một đối tượng tạm thời của lớp parent, cho phép bạn gọi các phương thức của nó hoặc truy cập các thuộc tính của nó.
Đây là một ví dụ:
class Parent:
def __init__(self):
self.parent_attribute = "Parent attribute"
class Child(Parent):
def __init__(self):
super().__init__()
def access_parent_attribute(self):
print(self.parent_attribute)
child = Child()
child.access_parent_attribute() # Output: "Parent attribute"
Trong ví dụ này, lớp child kế thừa từ lớp parent. Lớp child có thể truy cập thuộc tính parent_attribute của lớp parent bằng cách sử dụng hàm super().
Trong Python, modifiers và override modifiers có liên quan đến ghi đè phương thức trong kế thừa.
Modifiers: Modifiers được sử dụng để thay đổi hành vi của các phương thức được kế thừa từ lớp parent mà không sửa đổi phương thức ban đầu. Các Modifiers được triển khai bằng cách sử dụng các trình trang trí @property, @classmethod hoặc @staticmethod. Chúng cho phép bạn thêm chức năng bổ sung hoặc sửa đổi hành vi của phương thức kế thừa.
Override modifiers: Override modifiers được sử dụng để ghi đè và thay thế việc triển khai một phương thức được kế thừa từ lớp cha. Bằng cách định nghĩa một phương thức có cùng tên trong lớp con, bạn có thể cung cấp một cách triển khai khác dành riêng cho lớp con. Điều này cho phép bạn tùy chỉnh hành vi của phương thức trong ngữ cảnh của lớp con.
Đọc thêm: Bạn Cần Học Bao Nhiêu Ngôn Ngữ Lập Trình Để Trở Thành Developer?
Vậy là Glints đã cùng bạn tìm hiểu top các câu hỏi phỏng vấn Python phổ biến nhất. Hy vọng những gợi ý trên sẽ giúp bạn có được sự chuẩn bị tốt nhất cho buổi phỏng vấn sắp tới. Glints còn rất nhiều bộ câu hỏi chuẩn bị hữu ích không chỉ Python mà còn về các ngôn ngữ lập trình phổ biến khác. Hãy thường xuyên ghé Blog của Glints để cập nhật những nội dung chất lượng nhất nhé!
Có thể bạn cũng thích
Viết CV Điều Dưỡng Không Khó & Tải Mẫu CV Điều Dưỡng Chuẩn Ngay
Huy Kieu - 14/05/2024
Mẫu CV Xin Việc Phục Vụ Nhà Hàng: Cách Viết CV Hiệu Quả
Huy Kieu - 09/05/2024
Cách Ghi Sơ Yếu Lý Lịch Học Sinh Sinh Viên Chi Tiết
Huy Kieu - 09/05/2024
Trả lời