Nhưng nó không phải là câu lệnh switch chung hoặc garden của bạn như bạn thấy trong C hoặc Java — tất nhiên là không, đây là Python. Trăn 3. 10 triển khai So khớp mẫu cấu trúc có thể đơn giản như câu lệnh chuyển đổi nhưng cũng có thể hơn thế nữa
Tôi đã trình bày kiến thức cơ bản về So khớp mẫu cấu trúc tại đây — bài viết này đi sâu hơn một chút vào chủ đề này, xem xét việc nắm bắt các mẫu phù hợp (lấy giá trị của một mẫu phù hợp có thể có nhiều hơn một giá trị) và thêm điều kiện cho các mẫu
Nhưng, trước tiên, hãy xem lại những điều cơ bản. Các mẫu đối sánh cấu trúc được triển khai với từ khóa match. Điều này bao gồm một khối có chứa một danh sách các câu lệnh case cho mỗi trận đấu. Bạn có thể xem cú pháp trong đoạn mã bên dưới — nó rất gọn gàng và dễ hiểu
Đoạn mã dưới đây chạy một vòng lặp đưa ra các giá trị 1,2,3,4 và 5 cho biến He's gone to meet his maker.
He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!0. Chúng tôi xác định bốn trường hợp, trường hợp đầu tiên khớp với các số 1 hoặc 4 (ký tự He's gone to meet his maker.
He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!1 là toán tử OR); . Các trường hợp được xử lý theo thứ tự để ký tự đại diện chỉ khớp nếu bất kỳ trường hợp nào trước đó không khớp. Ngoài ra, không giống như C, không có câu lệnh 'break' — sau khi khối mã cho mỗi trường hợp được thực thi, điều khiển được chuyển đến cuối của match
match quote:
case 1|4:
print("He's gone to meet his maker.")
case 2:
print("He should be pushing up the daisies.")
case 3:
print("He's shuffled off his mortal coil.")
case _:
print("This is a dead parrot!")
Đây là kết quả của việc chạy mã
He's gone to meet his maker.He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!
Chụp các mẫu phù hợp
Đôi khi, khi khớp một mẫu OR, chúng tôi muốn có thể sử dụng giá trị khớp
Hãy tưởng tượng một số mọt sách, với sự quen thuộc tình cờ với Python, đã quyết định trình bày một tập lệnh Monty Python như thế này
script = [["The Dead Parrot Sketch"],["Cast","Customer","Shop Owner"],
["Customer","He's gone to meet his maker."],
["Owner","Nah, he's resting."],
["Customer","He should be pushing up the daisies."],
["Owner", "He's pining for the fjords"],
["Customer", "He's shuffled off his mortal coil."],
["Customer", "This is a dead parrot!"]]
Đó là một danh sách các danh sách. Cái đầu tiên chứa một chuỗi đơn - tiêu đề. Thứ hai, dàn diễn viên là chuỗi “Cast” theo sau là một số chuỗi khác đại diện cho nhân vật kịch tính. Phần còn lại là danh sách hai chuỗi, diễn viên và dòng mà người đó sẽ nói
Không có giải thưởng cho thiết kế dữ liệu, ở đây
Làm thế nào để chúng tôi giải thích cấu trúc này? . Dàn diễn viên được so khớp bằng cách chỉ định một danh sách bắt đầu bằng chuỗi “Truyền” và theo sau là một số phần tử khác (He's gone to meet his maker.
He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!3 thực hiện điều này). Các dòng của tập lệnh được khớp với trường hợp cuối cùng. nó khớp với hai yếu tố, yếu tố đầu tiên là “Khách hàng” hoặc “Chủ sở hữu” và yếu tố thứ hai là He's gone to meet his maker.
He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!4 sẽ nắm bắt được dòng kịch bản. Vấn đề là chúng ta muốn sử dụng giá trị của “Customer” hoặc “Owner” trong đoạn mã sau nên chúng ta ràng buộc nó với biến He's gone to meet his maker.
He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!5 bằng cách sử dụng từ khóa He's gone to meet his maker.
He should be pushing up the daisies.
He's shuffled off his mortal coil.
He's gone to meet his maker.
This is a dead parrot!6
match line:
case [title]:
print(title)
case ["Cast",*actors]:
print("Cast:")
for a in actors: print(a)
print("---")
case [("Customer"|"Owner") as person, line] :
print(f"{person}: {line}")
Chạy mã, chúng tôi nhận được điều này
The Dead Parrot SketchCast:
Customer
Shop Owner
---
Customer: He's gone to meet his maker.
Owner: Nah, he's resting.
Customer: He should be pushing up the daisies.
Owner: He's pining for the fjords
Customer: He's shuffled off his mortal coil.
Customer: This is a dead parrot!
Trường hợp có điều kiện
Đây là trường hợp chúng tôi muốn tạo đối sánh với điều kiện đáp ứng một số tiêu chí nhất định. Nhìn vào mã dưới đây. chúng tôi có một danh sách các nhân vật trong Harry Potter và một danh sách các nhân vật trong Hitchhiker's Guide to the Galaxy
Chúng tôi yêu cầu nhập tên rồi thử khớp tên đó
harrypotter = ["Harry","Hermione","Ron"]hhgtg = ["Arthur","Ford","Zaphod","Trillian"]name = input("Enter a name: ")match name:case n if n in hhgtg:
print(f"{n} is a character in Hitchhiker's guide to the Galaxy.")
case n if n in harrypotter:
print(f"{n} is a character in the Harry Potter stories.")
case _:
print(f"{n} is an unknown character.")
Và sử dụng việc xây dựng
case <match> if <match> in <list>chúng tôi chỉ khớp một trường hợp nếu nó đáp ứng điều kiện là chuỗi chúng tôi muốn khớp có trong danh sách. Mã này khá dễ hiểu, tôi nghĩ vậy, vì vậy đây là kết quả của một vài lần chạy chương trình
Enter a name: HarryHarry is a character in the Harry Potter stories.Enter a name: Zaphod
Zaphod is a character in Hitchhiker's guide to the Galaxy.Enter a name: Elizabeth Bennet
Elizabeth Bennet is an unknown character.
Tất nhiên, trường hợp cuối cùng là thẻ hoang dã sẽ khớp với bất kỳ thứ gì chưa được xử lý trước đó
Để tìm hiểu thêm, hãy truy cập Python. org và đọc PEP 636, đây là hướng dẫn về So khớp mẫu cấu trúc
Và để tìm hiểu thêm về các tính năng mới trong Python 3. 10, bạn có thể xem các bài báo khác trên Phương tiện, chẳng hạn như Các tính năng mới của James Briggs trong Python 3. 10 hoặc hoặc Tất cả các tính năng và thay đổi quan trọng của Martin Heinz trong Python 3. 10
Như tôi đã đề cập trong bài viết trước, bạn không nên sử dụng Python 3. 10 một cách nghiêm túc, bởi vì nó vẫn là bản phát hành beta nhưng bản beta đó có thể tải xuống từ trang web Python nếu bạn muốn thử với nó