Computer >> Máy Tính >  >> Lập trình >> Python

Làm thế nào để giải nén bằng cách sử dụng biểu thức dấu sao trong Python?

Giới thiệu

Một trong những hạn chế cơ bản của việc giải nén là bạn phải biết trước độ dài của các trình tự mà bạn đang giải nén.

Cách thực hiện ..

random_numbers = [0, 1, 5, 9, 17, 12, 7, 10, 3, 2]
random_numbers_descending = sorted(random_numbers, reverse=True)
print(f"Output \n*** {random_numbers_descending}")

Đầu ra

*** [17, 12, 10, 9, 7, 5, 3, 2, 1, 0]

Nếu bây giờ tôi muốn tìm ra số lớn nhất và lớn nhất thứ hai từ các số, chúng tôi sẽ nhận được một ngoại lệ "quá nhiều giá trị để giải nén".

print(f"Output \n*** Getting the largest and second largest")
largest, second_largest = random_numbers_descending

Đầu ra

*** Getting the largest and second largest


---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in
1 print(f"Output \n*** Getting the largest and second largest")
----> 2 largest, second_largest = random_numbers_descending

ValueError: too many values to unpack (expected 2)

Python thường dựa vào lập chỉ mục và cắt. Ví dụ:khi tôi muốn trích xuất lớn nhất, lớn nhất thứ hai từ danh sách các mục bên dưới là cách chúng tôi có thể làm.

largest = random_numbers_descending[0]
print(f"Output \n*** Getting the largest - {largest}")

Đầu ra

*** Getting the largest - 17


second_largest = random_numbers_descending[1]
print(f"Output \n*** Getting the second largest - {second_largest}")

Đầu ra

*** Getting the second largest - 12


rest_of_numbers = random_numbers_descending[2:]
print(f"Output \n*** Getting the rest of numbers - {rest_of_numbers}")

Đầu ra

*** Getting the rest of numbers - [10, 9, 7, 5, 3, 2, 1, 0]

Trong khi điều này hoạt động, tất cả việc lập chỉ mục và phân loại đều bị nhiễu trực quan. Trong thực tế, rất dễ xảy ra lỗi khi chia các phần tử của một chuỗi thành các tập con khác nhau theo cách này.

Để làm điều đó tốt hơn, Python hỗ trợ giải nén toàn bộ thư thông qua biểu thức được gắn dấu sao.

Cú pháp có gắn dấu sao này cho phép một phần của nhiệm vụ giải nén nhận tất cả các giá trị không khớp với bất kỳ phần nào khác của mẫu giải nén.

largest,second_largest, *rest_of_numbers = random_numbers_descending
print(f"Output \n largest: {largest} \n second_largest:{second_largest} \n rest_of_numbers:{rest_of_numbers}")

Đầu ra

largest: 17
second_largest:12
rest_of_numbers:[10, 9, 7, 5, 3, 2, 1, 0]

Đoạn mã trên trông như thế nào? Trong một dòng đơn cũng dễ đọc hơn, chúng ta có thể hiểu rõ kết quả đầu ra. Biểu thức được gắn dấu sao có thể xuất hiện ở bất kỳ vị trí nào, vì vậy bạn có thể nhận được lợi ích của việc giải nén toàn bộ thư bất cứ lúc nào bạn cần trích xuất một lát

largest: 17
rest_of_numbers:[12, 10, 9, 7, 5, 3, 2, 1]
smallest:0


*rest_of_numbers, second_smallest, smallest = random_numbers_descending
print(f"Output \n rest_of_numbers:{rest_of_numbers} \n second_smallest: {second_smallest} \n smallest:{smallest}")


rest_of_numbers:[17, 12, 10, 9, 7, 5, 3, 2]
second_smallest: 1
smallest:0

Tuy nhiên, để giải nén các bài tập có chứa biểu thức được gắn dấu sao, bạn phải có ít nhất một phần bắt buộc, nếu không bạn sẽ nhận được Lỗi cú pháp. Chúng tôi không thể tự mình sử dụng biểu thức tóm tắt.

*rest_of_numbers = random_numbers_descending


File "", line 1
*rest_of_numbers = random_numbers_descending
^
SyntaxError: starred assignment target must be in a list or tuple

Chúng tôi cũng không thể sử dụng nhiều biểu thức tóm tắt trong một mẫu giải nén cấp một. Đây là một lưu ý quan trọng khác cần xem xét.

*rest_of_numbers, *more_smallest, smallest = random_numbers_descending


File "", line 1
*rest_of_numbers, *more_smallest, smallest = random_numbers_descending
^
SyntaxError: two starred expressions in assignment


Nhưng có thể sử dụng nhiều biểu thức được gắn dấu sao trong một câu lệnh phân công giải nén, miễn là chúng là phần tóm tắt cho các phần khác nhau của cấu trúc đa cấp đang được giải nén.

player_grandslame_and_atptitles = {
'Federer': (20, 103),
'Nadal': (20,84),}

((player1, (grandslam1, *atptitles1)), (player2, (grandslam2, *atptitles2))) = player_grandslame_and_atptitles.items()

print(f'Output \nPlayer - {player1} Have acheived {grandslam1} grandslams and , {atptitles1} atp tour titles')
print(f'Player - {player2} Have acheived {grandslam2} grandslams and , {atptitles2} atp tour titles')


Đầu ra


Player - Federer Have acheived 20 grandslams and , [103] atp tour titles
Player - Nadal Have acheived 20 grandslams and , [84] atp tour titles

Biểu thức được gắn dấu sao trở thành thể hiện danh sách trong mọi trường hợp. Nếu không có mục nào còn sót lại từ chuỗi đang được giải nén, phần tóm tắt sẽ là một danh sách trống. Điều này đặc biệt hữu ích khi bạn đang xử lý một chuỗi mà bạn biết trước có ít nhất N phần tử.

random_numbers = [0, 1]
first, second, *rest = random_numbers
print(f"Output \n{first, second, rest}")

Đầu ra

(0, 1, [])