Những Câu Hỏi Phỏng Vấn Python Phổ Biến Nhất - Cấp ĐỘ JUNIOR

By JoeVu, at: 15:54 Ngày 20 tháng 1 năm 2023

Thời gian đọc ước tính: __READING_TIME__ minutes

The Most Common Python Interviewing Questions - JUNIOR level
The Most Common Python Interviewing Questions - JUNIOR level

Cấp ĐỘ JUNIOR

 

1. Nêu sự khác biệt giữa list và tuple trong Python

- List có thể thay đổi (mutable), nghĩa là nội dung của nó có thể được thay đổi, trong khi tuple thì không thể thay đổi (immutable).

- List sử dụng dấu ngoặc vuông, [ ], trong khi tuple sử dụng dấu ngoặc đơn, ( ).

- List có thể chứa bất kỳ loại đối tượng nào, bao gồm cả các list khác, trong khi tuple chỉ có thể chứa các đối tượng cùng loại.

- List có thể được mở rộng hoặc thu hẹp theo ý muốn, trong khi tuple có số lượng phần tử cố định.


Khi nào nên sử dụng tuple, không nên sử dụng list

Tuple nên được sử dụng khi các phần tử của chuỗi sẽ không bị thay đổi. Điều này hữu ích khi chúng ta làm việc theo nhóm và có một biến được sử dụng ở nhiều nơi và bởi nhiều nhà phát triển. Tác giả của biến muốn giữ nguyên giá trị ban đầu của nó.

car_colors = (("black", 1), ("white", 2))

def pick_car_colors(color):
     for car_color in car_colors:
         if car_color[0] == color:
             print(color)
             car_color[1] += 1

In [26]: pick_car_colors("black")
black
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[26], line 1
----> 1 pick_car_colors("black")
Cell In[25], line 7, in pick_car_colors(color)
     5 if car_color[0] == color:
     6     print(color)
----> 7     car_color[1] += 1
TypeError: 'tuple' object does not support item assignment    

 

2. *args và **kwargs trong định nghĩa hàm là gì?

Trong Python, *args*kwargs là hai ký hiệu đặc biệt được sử dụng để truyền một số lượng đối số biến đổi cho một hàm.

Cú pháp đặc biệt, *args và **kwargs trong định nghĩa hàm được sử dụng để truyền một số lượng đối số biến đổi cho một hàm.

\*args được sử dụng để truyền một danh sách đối số có độ dài biến đổi không theo khóa cho hàm.

\*\*kwargs được sử dụng để truyền một danh sách đối số có độ dài biến đổi theo khóa cho hàm.

def print_arguments(*args, **kwargs):
     print(args)
     print(kwargs)

In [2]: print_arguments(1, 2, 3, name="Joe", age=34)
(1, 2, 3)
{'name': 'Joe', 'age': 34}

Tuy nhiên, không nên lạm dụng các từ khóa *args và **kwargs, vì điều này mâu thuẫn với triết lý "Clean Code" với giới hạn tham số của Hàm/Phương thức (tránh sử dụng >=3 tham số)


3. Sự khác biệt giữa shallow copy và deep copy là gì?

Shallow copy là bản sao của một đối tượng chỉ sao chép các giá trị trực tiếp của đối tượng, trong khi deep copy là bản sao của một đối tượng tạo ra một đối tượng hoàn toàn mới và nội dung của nó bằng cách sao chép tất cả các giá trị của đối tượng gốc.

Trong deep copy, tất cả các giá trị của đối tượng gốc đều được sao chép, bao gồm cả các đối tượng được tham chiếu bên trong đối tượng gốc. Trong shallow copy, chỉ các giá trị của đối tượng trực tiếp được sao chép, và bất kỳ đối tượng được tham chiếu nào đều không được sao chép.

original_list = [1, 2, 3]
shallow_copy = original_list

print(original_list)
print(shallow_copy)
original_list[0] = 100
[1, 2, 3]
[1, 2, 3]
print(original_list)
print(shallow_copy)
[100, 2, 3]
[100, 2, 3]

Ví dụ khác

import copy
original_list = [1, 2, [3, 4]]
deep_copy = copy.deepcopy(original_list)
print(original_list)
print(deep_copy)
[1, 2, [3, 4]]
[1, 2, [3, 4]]
original_list[0] = 100
print(original_list)
print(deep_copy)
[100, 2, [3, 4]]
[1, 2, [3, 4]]

 

4. Nêu sự khác biệt giữa biến cục bộ và biến toàn cục

Biến cục bộ là các biến được khai báo trong một hàm và chúng chỉ có thể được truy cập bên trong hàm đó. Biến toàn cục là các biến được khai báo bên ngoài bất kỳ hàm nào và chúng có thể được truy cập bởi bất kỳ hàm hoặc script nào khác.

Ví dụ về Biến Cục bộ: 
- Biến được khai báo trong hàm
- Biến được khai báo trong vòng lặp

Ví dụ về Biến Toàn cục: 
- Biến được khai báo bên ngoài bất kỳ hàm nào
- Biến được khai báo trong script chính

global_variable = "A1"
def get_shapes():
    local_variable = "cubic"
    global_variables = "B2"
    print(local_variable)
    print(global_variables)

 
get_shapes()
cubic
B2
global_variable
'A1'

 

5. Giải thích "list comprehension" trong Python.

List comprehension là một cách mạnh mẽ để tạo một danh sách mới từ một danh sách hiện có trong Python.

  • Đây là một cách viết ngắn gọn để tạo danh sách từ danh sách hiện có bằng cách áp dụng một biểu thức hoặc một bộ lọc cho từng phần tử trong danh sách.
  • Nó được sử dụng để tạo danh sách mới từ các danh sách, từ điển hoặc các đối tượng lặp khác hiện có.
  • Nó tương tự như việc sử dụng các hàm map() và filter() trong lập trình hàm.
  • List comprehension là một cách viết tắt của vòng lặp, và thường tốn ít bộ nhớ và thời gian thực thi hơn.

Ví dụ, giả sử bạn có một danh sách các số và bạn muốn tạo một danh sách mới chứa mỗi số nhân với chính nó. Bạn có thể làm điều này với list comprehension như sau:

In [1]: [x * x for x in [1, 2, 3, 4, 5]]
Out[1]: [1, 4, 9, 16, 25]

 

6. Nêu sự khác biệt chính giữa "range()" và "xrange()" trong Python 2

Range(): là một hàm tích hợp sẵn được sử dụng để tạo một chuỗi các số. Nó nhận 3 tham số, start, stop và step. Nó trả về một đối tượng list chứa các phần tử của chuỗi.

Ví dụ:
range(1, 10, 2)
-> [1, 3, 5, 7, 9]

xrange(): là một hàm tích hợp sẵn khác được sử dụng để tạo một chuỗi các số. Nó tương tự như range() nhưng trả về một đối tượng generator thay vì một list. Nó nhanh hơn range() và tiêu tốn ít bộ nhớ hơn.

Ví dụ:
xrange(1, 10, 2)
-> xrange(1, 10, 2)

 

7. Giải thích "chỉ số dương" và "chỉ số âm" trong Python

Chỉ số dương trong Python được sử dụng để tham chiếu đến các mục trong một chuỗi được xác định theo vị trí của chúng từ đầu chuỗi, bắt đầu từ 0.

Chỉ số âm trong Python được sử dụng để tham chiếu đến các mục trong một chuỗi được xác định theo vị trí của chúng từ cuối chuỗi, bắt đầu từ -1.

a = ['a', 'b', 'c', 'd', 'e', 'f']
a[0]
'a'

 

a[5]
'f'

 

a[-1]
'f'

 

a[-2]
'e'

 

a[-5]
'b'

 

a[-6]
'a'


8. "Iterator" trong Python là gì?

Iterator trong Python là một đối tượng có thể được lặp qua, nghĩa là nó có thể tạo ra một chuỗi các giá trị. Iterator được triển khai bằng cách sử dụng các hàm iter()next().

  • __iter__(): Phương thức iter() được gọi để khởi tạo một iterator. Nó trả về một đối tượng iterator
  • __next__(): Phương thức next() trả về giá trị tiếp theo cho đối tượng lặp. Khi chúng ta sử dụng vòng lặp for để duyệt qua bất kỳ đối tượng lặp nào. Phương thức này sẽ ném ra StopIteration để báo hiệu kết thúc quá trình lặp.

Ví dụ 1: Lặp qua một danh sách

numbers = [1, 2, 3, 4]
for number in numbers:
    print(number)

Kết quả 

1
2
3
4

Ví dụ 2: Lặp qua một từ điển

a_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key, value in a_dict.items():
    print(key, value)

Kết quả 

a 1
b 2
c 3
d 4

Ví dụ 3: Lặp qua một tập hợp

In [7]: a_set = set(['joe', 'snow', 'bill'])
   ...: for element in a_set:
   ...:     print(element)
   ...:

Kết quả 

snow
bill
joe


9. Toán tử "is" làm gì?

Toán tử "is" được sử dụng để kiểm tra xem hai biến có trỏ đến cùng một đối tượng hay không. Nó trả về True nếu cả hai biến trỏ đến cùng một đối tượng và False nếu chúng không trỏ đến.

Điều này cực kỳ hữu ích khi so sánh hai đối tượng None

Ví dụ 1

x = [1, 2, 3]
y = [1, 2, 3]
print(x is y)

Kết quả 

False

Ví dụ 2

x = [1,2,3]
y = x
print(x is y)

Kết quả 

True

 

Ví dụ 3

x = [1, 2, 3]
y = x
print(x is y)

Kết quả 

True

 

Ví dụ 4 

if x is None:
    print("x is None")

Kết quả 

x is None

10. Sự khác biệt giữa del() và remove() trên List là gì?

Hàm del() được sử dụng để xóa một mục tại một chỉ số được chỉ định trong khi hàm remove() được sử dụng để xóa một mục theo giá trị của nó.

Ví dụ 1

list1 = [1, 2, 3, 2, 3]
del list1[2]
print(list1)

Kết quả 

[1, 2, 2, 3]
 

Ví dụ 2 

list1 = [1, 2, 3, 2, 3]
list1.remove(2)
print(list1)

Kết quả 

[1, 3, 2, 3]


11. Làm thế nào để sử dụng toán tử ba ngôi (ternary operator) trong Python?

Toán tử ba ngôi là một cách viết tắt của câu lệnh if-else. Nó có dạng sau:

điều_kiện_nếu_đúng if điều_kiện else điều_kiện_nếu_sai

rating = 3
comment = "good" if rating >= 2.5 else "bad"
print(comment)

Kết quả 

good

 

12. Tại sao chúng ta sử dụng môi trường ảo (virtual environments)?

Môi trường ảo là một công cụ được sử dụng để tạo ra các môi trường Python cô lập, cho phép chúng ta cài đặt các gói và phụ thuộc mà không ảnh hưởng đến cài đặt Python toàn cầu, và cũng có thể giúp ngăn chặn xung đột giữa các phiên bản khác nhau của gói và phụ thuộc.

Một số gói môi trường ảo tốt là:

  • virtualenv
  • pyenv
  • anaconda
  • venv
  • conda
  • pipenv

 

13. Từ khóa yield được sử dụng để làm gì trong Python?

Trong Python, yield là một từ khóa được sử dụng để tạo ra các generator. Generator là các hàm đặc biệt có thể được sử dụng để tạo ra một tập hợp các mục có thể lặp lại. Bằng cách sử dụng từ khóa "yield", một hàm sẽ trả về một đối tượng generator có thể được sử dụng trong vòng lặp for hoặc được sử dụng để tạo danh sách, tuple hoặc set.

Ví dụ 1

def generate_guess_names():
    names = ['Johnson', 'Smith', 'Williams', 'Bill', 'Gate', 'Hilary', 'Tom', 'Hank']
    for name in names:
        yield name

for name in generate_guess_names():
    print(name)

Kết quả 

Johnson
Smith
Williams
Bill
Gate
Hilary
Tom
Hank
Tag list:
- Python
- Virtual Environment
- Interviewing Questions
- args
- kwargs
- pyenv
- List Comprehension

Liên quan

Python

Đọc thêm
Python Unit Test

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.