Trận đấu Python có nhanh hơn nếu không?

Đối sánh mẫu không chỉ quá hạn vì các ngôn ngữ khác đã có từ lâu. Trong C và C++, nó được gọi là cấu trúc switch/case. Trong Rust, nó được gọi là khớp mẫu

Đối với người dùng Python, đó không chỉ là cách giải quyết các câu lệnh if...elif...else xấu xí. So khớp mẫu cấu trúc, như tên gọi của nó, không chỉ giúp khớp với các chuỗi ký tự. Bạn cũng có thể sử dụng nó để xử lý các mẫu chính xác — do đó có tên — bằng cách chỉ định tên biến, loại hoặc thậm chí các đối tượng mà bạn có thể muốn khớp với

Cú pháp cơ bản rất giống với câu lệnh switch/case của ngôn ngữ C. Từ khóa match lấy một đối tượng, kiểm tra đối tượng đó với một hoặc nhiều mẫu phù hợp và nếu tìm thấy mẫu phù hợp, nó sẽ thực thi bất cứ điều gì được yêu cầu trong trường hợp đó

Đây là một ví dụ cơ bản

Thấy cái này đẹp không? . Và một trường hợp điển hình khác là Python ngày càng có nhiều chức năng hơn

Điều làm cho đoạn mã này trở nên hấp dẫn là về cơ bản nó là các câu lệnh if được ngụy trang. Tuy nhiên, nó thanh lịch hơn nhiều vì nó có thể kiểm tra nhiều đối tượng cùng một lúc, như trong ví dụ chứa articlesentiment ở trên

Trong trường hợp một số hoặc tất cả các phần thông tin như article hoặc sentiment bị thiếu, chúng ta không cần phải dựa vào các tuyên bố else không đẹp mắt. Chúng tôi chỉ xử lý từng trường hợp một cách duyên dáng

Chúng tôi cũng có thể kiểm tra loại, như đã thực hiện ở trên với str() và nhiều thuộc tính khác bao gồm if...elif...else0 cho chuỗi. Tất nhiên, các thuộc tính khác có thể được kiểm tra cho các loại dữ liệu khác

Ngoài ví dụ này, nơi chúng tôi đã sử dụng từ điển, bạn cũng có thể đặt những thứ như danh sách, bộ dữ liệu, đối tượng, v.v. vào khớp mẫu. Điều này hoạt động theo cách khá giống với ví dụ trên

Bạn cũng có thể sử dụng hoặc-toán tử if...elif...else1 để nhóm nhiều trường hợp lại với nhau. Cú pháp cho điều này là if...elif...else2

Bây giờ, hãy xem ví dụ của chúng tôi hoạt động như thế nào

Nếu chúng tôi muốn chức năng bóng bẩy tương tự nhưng đã cố gắng đạt được mà không khớp mẫu mới, thì đây là những gì chúng tôi nhận được

Để tiết lộ đầy đủ, tôi quá lười để tự viết mã xấu xí như vậy, vì vậy tôi đã sử dụng phương pháp từ bài viết xuất sắc này. Ngoài ra, tôi thậm chí còn không điền vào mọi thứ vì tôi không muốn làm bạn ngập đầu với mã spaghetti như thế

Không cần phải nói, rõ ràng là trong những trường hợp như thế này, câu lệnh match mới đơn giản hơn rất nhiều để sử dụng và dễ đọc hơn

Tuy nhiên, một số nhà phê bình chỉ ra rằng câu lệnh match có đường cong học tập dốc hơn so với một số câu lệnh if...elif...else5. Điều này chắc chắn là đúng, nhưng tôi muốn nói rằng bạn nên bỏ ra 15 phút nỗ lực để nắm bắt điều này, hơn là dành 30 phút tiếp theo để viết mã kém khả năng bảo trì

Sử dụng sáng tạo của kết hợp mô hình cấu trúc

Những người chỉ trích đối sánh mẫu của Python cũng chỉ ra rằng có thể không có quá nhiều trường hợp sử dụng cho nó

Về cơ bản, nó tốt cho các tình huống có nhiều mẫu khác nhau có thể khớp và khi nhiều chi tiết về các mẫu này rất quan trọng. Cách để giải quyết vấn đề này từng là thông qua các biểu thức if...elif...else5 dài và lồng nhau một cách tỉ mỉ

Tuy nhiên, có những trường hợp khác khi sử dụng khớp mẫu cấu trúc.

Tôi đã đánh cắp ví dụ ngọt ngào này từ đây. Tuy nhiên, đó là một thứ khá tầm thường, có chức năng sẵn có trong gói if...elif...else7. Vì vậy, bạn có thể rất dễ dàng thay thế đoạn mã trên bằng cách này

import mathfor i in range(6):
print(i, math.factorial(i))

Điều này cũng nhanh hơn khoảng 12 lần so với mã ở trên, ít nhất là trên máy tính của tôi. (Mất 0. 13 giây, so với khoảng 1. 5 giây cho chức năng trên khi tôi cố gắng tính toán if...elif...else8 trên máy của mình. )

Mặt khác, việc xác định hàm giai thừa thông qua câu lệnh if...elif...else5 xấu xí cũng mất 1. 5 giây. Điều này cho thấy - mặc dù không có bằng chứng. — các câu lệnh if...elif...else5 lồng nhau và câu lệnh match có tốc độ nhanh như nhau

Vì vậy, khi bạn đang xác định các chức năng mà giải pháp sẵn có không tồn tại, bạn có thể sẽ không làm chậm mã của mình bằng cách sử dụng khớp mẫu cấu trúc

Nói nhanh về Khớp mẫu tuyệt vời

Có một cách khác để bạn có thể khớp mẫu trong Python. Kể từ phiên bản 3. 7, gói match2, viết tắt của Awesome Pattern Matching, đã và đang cung cấp cách riêng để xử lý các đoạn mã xấu trong khi mang lại các chức năng tốt

Các tác giả khẳng định rằng vẫn còn một số chức năng trong match2 mà tính năng so khớp mẫu tích hợp sẵn không có; . Một so sánh chuyên sâu cho thấy sự khác biệt chủ yếu trong cú pháp

Cá nhân tôi thích cú pháp khớp mẫu dựng sẵn hơn. Nhưng đối với những bạn thích sử dụng match2, tất nhiên bạn vẫn có thể sử dụng miễn phí

Những lời cuối cùng nổi tiếng

Khớp mẫu vẫn còn khá mới trong Python, nhưng rất có thể nhiều nhà phát triển sẽ nhanh chóng áp dụng nó

Điều này tất nhiên là dễ dàng để yêu cầu dựa trên thực tế rằng nó đã là một tính năng được yêu cầu nhiều từ cộng đồng. Nhưng có nhiều yêu sách hơn thế. Kết hợp mẫu cấu trúc có thể có đường cong học tập tương đối dốc so với các tính năng khác; . )

Khớp mẫu có nhanh hơn không?

Hóa ra là khớp mẫu trong ví dụ của họ nhanh hơn đáng kể so với các thử nghiệm if-else . Mặc dù mã không sử dụng bất kỳ trường hợp khớp mẫu đặc biệt nào không thể thực hiện được với các phép thử if-else, nhưng nó chỉ so sánh các số nguyên.

Elif có nhanh hơn if không?

Sự khác biệt giữa if và if elif else . Khi một điều kiện trong câu lệnh if elif other là đúng, Python sẽ ngừng đánh giá các điều kiện khác. Do đó, if elif other nhanh hơn ba câu lệnh if .

Tôi có thể sử dụng cái gì thay vì khớp trong Python?

Nếu bạn không thể sử dụng match-case , chúng tôi đã đề cập đến ba lựa chọn thay thế phổ biến. từ điển, thang if-elif hoặc lớp .

Liệu Python 3. 9 có khớp không?

Kể từ đầu năm 2021, từ khóa đối sánh không tồn tại trong các phiên bản Python đã phát hành . Vì Python không có bất kỳ chức năng nào tương tự như switch/case trong các ngôn ngữ khác, nên bạn thường sử dụng các câu lệnh if/elif/else lồng nhau hoặc từ điển.