- vừa được xem lúc

Python the right way - Unpacking and tuple

0 0 2

Người đăng: Tài

Theo Viblo Asia

Trong series này, anh em sẽ cùng tôi đi qua các quy tắc được recommend trong cuốn Effective Python – 125 Specific Ways to Write Better Python của tác giả Brett Slatkin.
Đây là một cuốn sách hữu ích giúp anh em viết code Python tốt hơn, hiệu quả hơn, và tuân theo những best practice.

Tôi sẽ không chỉ đơn thuần tóm tắt lại nội dung cuốn sách, mà còn chia sẻ những trải nghiệm cá nhân, những bài học rút ra trong quá trình học Python từ góc nhìn của một người đã có kinh nghiệm với Java.

Let's get it.

I. Rule #5 - Prefer multiple assignment unpacking over indexing

1. Explanation

Thay vì sử dụng chỉ mục (index) để truy xuất phần tử trong iterable như tuple hay list.
Unpacking giúp code trở nên rõ ràng hơn, giảm thiểu lỗi, và tăng hiệu suất xử lý.

2. Terminologies

Tuple: được định nghĩa là một chuỗi các phần tử không thay đổi (immutable) được bọc trong dấu ngoặc đơn. Có một số tính chất như sau

  • Immutable: sau khi khởi tạo, không thể thêm, xóa, sửa phần tử trong tuple.
  • Có thể chứa nhiều kiểu dữ liệu khác nhau.
  • Truy suất nhanh hơn thông qua index nhờ tính immutable
  • Hỗ trợ cơ chế unpacking

Unpacking: là quá trình gán giá trị của một iterable (tuple, list, string, dictionary, etc) vào nhiều biến cùng lúc.
Sử dụng unpacking giúp code dễ đọc hơn, tránh việc phải sử dụng index để trích suất ra các phần từ trong iterable

3. Examples

Tuple unpacking

data = ("Ha Noi", "Da Nang", "SG")
hanoi, danang, sg = data print(hanoi) # Ha Noi
print(danang) # Da Nang
print(sg) # SG

List unpacking

data = ["Ha Noi", "Da Nang", "SG"]
hanoi, danang, sg = data print(hanoi) # Ha Noi
print(danang) # Da Nang
print(sg) # SG

Unpacking first and last element

data = ("Ha Noi", "Hue", "Da Nang", "Phu Yen", "Can Tho", "SG")
hanoi, *ignores, sg = data
print(hanoi) # Ha Noi
print(sg) # SG
print(ignores) # ['Hue', 'Da Nang', 'Phu Yen', 'Can Tho'] 

Unpacking tuple returned from a function

def get_user(): return "Bob", 31 name, age = get_user()
print(name, age) # Bob 31

Unpacking in the loop

employees = [("Alice", 21), ("Bob", 28), ("Carlo", 31)]
for index, (name, age) in enumerate(employees): print(f'No#{index + 1} - Name: {name}, age: {age}')
# No#1 - Name: Alice, age: 21
# No#2 - Name: Bob, age: 28
# No#3 - Name: Carlo, age: 31

4. Things to remember

  • Khác với Java, Python cung cấp cơ chế unpacking để gán giá trị cho nhiều biến trong cùng một statement.
  • Sử dụng unpacking khi có thể để code trở nên dễ đọc, dễ hiểu hơn

II. Rule #6 - Always surround single-element tuples with parentheses

1. Explanation

Để khai báo một tuple, ta thường sử dụng 1 trong các cách sau

# Single tuple
single_tuple = 1,
assert(isinstance(single_tuple, tuple))
single_tuple = (1,)
assert(isinstance(single_tuple, tuple))
#multiple tuple
multiple_tuple = (1,2)
assert(isinstance(multiple_tuple, tuple))
multiple_tuple = (1,2,)
assert(isinstance(multiple_tuple, tuple))
multiple_tuple = 1,2,
assert(isinstance(multiple_tuple, tuple))
multiple_tuple = 1,2
assert(isinstance(multiple_tuple, tuple))

Bỏ qua dấu ngoặc () khi khai báo tuple

Trong Python, anh em có thể bỏ qua dấu ngoặc () khi khai báo tuple. Ngoài ra, với tuple có nhiều phần tử, dấu phẩy cuối cùng cũng không bắt buộc.
Tuy nhiên, trong một số trường hợp, việc không sử dụng dấu ngoặc () có thể gây nhầm lẫn khi đọc code.

Hãy xem ví dụ sau:

to_refund = calculate_refund(
get_order_value(user, order.id),
get_tax(user.address, order.dest),
adjust_discount(user) + 0.1), print(type(to_refund)) # <class 'tuple'>

Trong trường hợp này, có thể anh em kỳ vọng to_refund là một giá trị numeric, nhưng thực tế nó lại là một tuple có một phần tử.

Best Practice: Luôn dùng dấu ngoặc () cho single tuple

Để tránh nhầm lẫn, anh em nên sử dụng dấu ngoặc () khi khai báo tuple có một phần tử.
Điều này giúp anh em và người đọc code dễ nhận biết rằng biến đang chứa một tuple.

Cách viết đúng:

to_refund = (calculate_refund( get_order_value(user, order.id), get_tax(user.address, order.dest), adjust_discount(user) + 0.1),) print(type(to_refund)) # <class 'tuple'>

2. Things to remember

  • Việc khai báo tuple trong Python có nhiều cách khác nhau bằng cách kết hợp () và "," -> dễ gây nhầm lẫn cho người mới.
  • Tuple thông thường được khai báo bằng cách sử dụng dấu () và phân tách các phần tử bằng dấu ","
  • Với tuple có một phần tử luôn phải đặt dấu phẩy "," ở cuối, dấu ngoặc () optional.
  • Best practice: luôn sử dụng dấu ngoặc () cho tuple một phần tử để tránh hiểu nhầm về ý nghĩa của biến.

Anh em có thể tham khảo các bài viết khác của tôi tại Blog cái nhân hoặc kết nối với tôi qua Linkedin

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thao tác với File trong Python

Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

1 1 135

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

1 1 238

- vừa được xem lúc

Sử dụng Misoca API (oauth2) với Python

Với bài viết này giúp chúng ta có thể nắm được. ・Tìm hiểu cách xử lý API misoca bằng Python.

1 1 123

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 3)

Tiếp tục phần 2 của series Pandas DataFrame nào. Let's go!!. Ở phần trước, các bạn đã biết được cách lấy dữ liệu một row hoặc column trong Pandas DataFame rồi phải không nào. 6 Hoc.

1 1 137

- vừa được xem lúc

Lập trình socket bằng Python

Socket là gì. Một chức năng khác của socket là giúp các tầng TCP hoặc TCP Layer định danh ứng dụng mà dữ liệu sẽ được gửi tới thông qua sự ràng buộc với một cổng port (thể hiện là một con số cụ thể), từ đó tiến hành kết nối giữa client và server.

0 0 149

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 2)

Nào, chúng ta cùng đến với phần 2 của series Pandas DataFrame. Truy xuất Labels và Data. Bạn đã biết cách khởi tạo 1 DataFrame của mình, và giờ bạn có thể truy xuất thông tin từ đó. Với Pandas, bạn có thể thực hiện các thao tác sau:.

0 0 166