Hướng dẫn what is meant by pattern matching in python? - khớp mẫu trong python có nghĩa là gì?

Cú pháp phù hợp với mẫu được giới thiệu trong Python 3.10 cho phép các kỹ thuật lập trình mới mạnh mẽ để ra quyết định trong các ứng dụng.

Nhà văn cao cấp, Infoworld |InfoWorld |

Hướng dẫn what is meant by pattern matching in python? - khớp mẫu trong python có nghĩa là gì?
Hình ảnh Robynmac / Getty

Mục lục

Cho xem nhiều hơn

Python, đối với tất cả sức mạnh và sự phổ biến của nó, từ lâu đã thiếu một hình thức kiểm soát dòng chảy được tìm thấy trong các ngôn ngữ khác, một cách để có giá trị và phù hợp với nó một cách tao nhã với một trong một số điều kiện có thể. Trong C và C ++, nó đã xây dựng switch/case; Trong rỉ sét, nó được gọi là phù hợp với mô hình.

Những cách truyền thống để làm điều này trong Python aren aren thanh lịch. Một là viết một chuỗi if/elif/else của các biểu thức. Cái còn lại là lưu trữ các giá trị để khớp dưới dạng các khóa trong từ điển, sau đó sử dụng các giá trị để thực hiện một hành động, ví dụ, lưu trữ một hàm làm giá trị và sử dụng khóa hoặc một số biến khác làm đầu vào. Trong nhiều trường hợp, điều này hoạt động tốt, nhưng có thể cồng kềnh để xây dựng và duy trì.

Sau nhiều đề xuất để thêm một cú pháp giống như ____ 5 vào Python đã thất bại, một đề xuất gần đây của người tạo ngôn ngữ Python Guido Van Rossum và một số người đóng góp khác đã được chấp nhận cho Python 3.10: khớp mẫu cấu trúc. Phù hợp với mô hình cấu trúc không chỉ làm cho nó có thể thực hiện các kết hợp kiểu switch/case đơn giản, mà còn hỗ trợ một loạt các trường hợp sử dụng rộng hơn.

Giới thiệu kết hợp mô hình cấu trúc Python

Kết hợp mô hình kết cấu giới thiệu câu lệnh match/case và cú pháp mẫu với Python. Tuyên bố match/case tuân theo các phác thảo cơ bản giống như switch/case. Nó có một đối tượng, kiểm tra đối tượng so với một hoặc nhiều mẫu khớp và thực hiện một hành động nếu tìm thấy một trận đấu.

match command:
    case "quit":
        quit()
    case "reset":
        reset()
    case unknown_command:
        print (f"Unknown command '{unknown_command}')

Mỗi câu lệnh

from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
2 được theo sau bởi một mẫu để phù hợp với. Trong ví dụ trên, chúng tôi sử dụng các chuỗi đơn giản làm mục tiêu khớp của chúng tôi, nhưng các trận đấu phức tạp hơn là có thể.

Python thực hiện các trận đấu bằng cách đi qua danh sách các trường hợp từ trên xuống dưới. Trong trận đấu đầu tiên, Python thực hiện các câu lệnh trong khối

from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
2 tương ứng, sau đó bỏ qua đến cuối khối
from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
4 và tiếp tục với phần còn lại của chương trình. Không có sự sụp đổ nào giữa các trường hợp, nhưng nó có thể thiết kế logic của bạn để xử lý nhiều trường hợp có thể trong một khối
from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
2. (Thêm về điều này sau.)

Nó cũng có thể nắm bắt tất cả hoặc một phần của trận đấu và sử dụng lại nó. Trong

from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
6 Trong ví dụ của chúng tôi ở trên, giá trị được ghi lại trong biến
from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
7 để chúng tôi có thể sử dụng lại nó.

Kết hợp với các biến với mô hình cấu trúc Python phù hợp

Một lưu ý quan trọng là đáng để đưa lên đây. Nếu bạn liệt kê các tên biến trong câu lệnh

from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
2, điều đó không có nghĩa là một trận đấu nên được thực hiện với nội dung của biến được đặt tên. Các biến trong
from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()
2 được sử dụng để thu được giá trị đang được khớp.

Nếu bạn muốn khớp với nội dung của một biến, biến đó phải được biểu thị dưới dạng tên chấm, giống như một enum. Đây là một ví dụ:

from enum import Enum
class Command(Enum):
    QUIT = 0
    RESET = 1

match command:
    case Command.QUIT:
        quit()
    case Command.RESET:
        reset()

Một người không phải sử dụng một enum; Bất kỳ tên tài sản chấm chấm sẽ làm. Điều đó nói rằng, Enums có xu hướng là cách quen thuộc và thành ngữ nhất để làm điều này trong Python.

Kết hợp với nhiều yếu tố với mô hình cấu trúc Python phù hợp

Chìa khóa để làm việc hiệu quả nhất với kết hợp mẫu không chỉ là sử dụng nó để thay thế cho việc tra cứu từ điển. Nó để mô tả cấu trúc của những gì bạn muốn phù hợp. Bằng cách này, bạn có thể thực hiện các trận đấu dựa trên số lượng các yếu tố mà bạn phù hợp với hoặc kết hợp của chúng.

Ở đây, một ví dụ phức tạp hơn một chút. Ở đây, người dùng gõ một lệnh, tùy chọn theo sau là tên tệp.

command = input()
match command.split():
    case ["quit"]:
        quit()
    case ["load", filename]:
        load_from(filename)
    case ["save", filename]:
        save_to(filename)
    case _:
        print (f"Command '{command}' not understood")

Hãy để kiểm tra các trường hợp này theo thứ tự:

  • command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    0 Các kiểm tra nếu những gì chúng tôi
    from enum import Enum
    class Command(Enum):
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit()
        case Command.RESET:
            reset()
    
    4ing chống lại là một danh sách chỉ với mục
    command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    2, có nguồn gốc từ việc chia đầu vào.
  • command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    3 kiểm tra nếu phần tử phân chia đầu tiên là chuỗi
    command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    4 và nếu có một chuỗi thứ hai theo sau. Nếu vậy, chúng tôi lưu trữ chuỗi thứ hai trong biến
    command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    5 và sử dụng nó cho công việc tiếp theo. Tương tự cho
    command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    6.
  • command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    7 là một trận đấu đại diện. Nó phù hợp nếu không có trận đấu nào khác được tạo ra cho đến thời điểm này. Lưu ý rằng biến nhấn mạnh, & nbsp; ____ 28, không thực sự liên kết với bất cứ điều gì; Tên
    command = input()
    match command.split():
        case ["quit"]:
            quit()
        case ["load", filename]:
            load_from(filename)
        case ["save", filename]:
            save_to(filename)
        case _:
            print (f"Command '{command}' not understood")
    
    8 được sử dụng làm tín hiệu cho lệnh
    from enum import Enum
    class Command(Enum):
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit()
        case Command.RESET:
            reset()
    
    4 rằng trường hợp trong câu hỏi là ký tự đại diện. (Đó là lý do tại sao chúng tôi đề cập đến biến
    match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    1 trong phần thân của khối
    from enum import Enum
    class Command(Enum):
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit()
        case Command.RESET:
            reset()
    
    2;

Các mẫu trong kết hợp mô hình cấu trúc Python

Các mẫu có thể là các giá trị đơn giản hoặc chúng có thể chứa logic phù hợp phức tạp hơn. Vài ví dụ:

  • match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    3: khớp với giá trị đơn
    match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    4.
  • match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    5: Kết hợp với bộ sưu tập
    match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    6.
  • match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    7: Kết hợp với một bộ sưu tập với hai giá trị và đặt giá trị thứ hai trong biến chụp
    match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    8.
  • match media_object:
        case Image(type="jpg"):
            # Return as-is
            return media_object
        case Image(type="png") | Image(type="gif"):
            return render_as(media_object, "jpg")
        case Video():
            raise ValueError("Can't extract frames from video yet")
        case other_type:
            raise Exception(f"Media type {media_object} can't be handled yet")
    
    9: Kết hợp với một bộ sưu tập có ít nhất một giá trị. Các giá trị khác, nếu có, được lưu trữ trong
    match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    0. Lưu ý rằng bạn chỉ có thể bao gồm một mục được gắn sao cho mỗi bộ sưu tập (vì nó sẽ có với các đối số sao trong hàm Python).
  • match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    1: Toán tử
    match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    2 (
    match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    3) có thể được sử dụng để cho phép xử lý nhiều trường hợp trong một khối
    from enum import Enum
    class Command(Enum):
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit()
        case Command.RESET:
            reset()
    
    2. Ở đây, chúng tôi phù hợp với ________ 34, ____ 46 hoặc
    match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    7.
  • match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    8: Tương tự như trên, ngoại trừ bây giờ chúng tôi đặt mục phù hợp vào biến
    match media_object:
        case Image(type=media_type):
            print (f"Image of type {media_type}")
    9.
  • switch/case0: Chỉ phù hợp với việc bắt giữ nếu switch/case1 là đúng. Các biến chụp có thể được sử dụng trong biểu thức. Chẳng hạn, nếu chúng tôi sử dụng switch/case2,
    from enum import Enum
    class Command(Enum):
        QUIT = 0
        RESET = 1
    
    match command:
        case Command.QUIT:
            quit()
        case Command.RESET:
            reset()
    
    2 sẽ chỉ hợp lệ nếu giá trị bị bắt switch/case4 trên thực tế trong bộ sưu tập switch/case5.
  • switch/case6: Bất kỳ bộ sưu tập các mặt hàng bắt đầu với switch/case7 sẽ khớp.

Kết hợp với các đối tượng có mô hình cấu trúc Python phù hợp

Tính năng tiên tiến nhất của hệ thống khớp mẫu cấu trúc của Python là khả năng khớp với các đối tượng với các thuộc tính cụ thể. hàm số.

match media_object:
    case Image(type="jpg"):
        # Return as-is
        return media_object
    case Image(type="png") | Image(type="gif"):
        return render_as(media_object, "jpg")
    case Video():
        raise ValueError("Can't extract frames from video yet")
    case other_type:
        raise Exception(f"Media type {media_object} can't be handled yet")

Trong mỗi trường hợp trên, chúng tôi đang tìm kiếm một loại đối tượng cụ thể, đôi khi với các thuộc tính cụ thể. Trường hợp đầu tiên khớp với đối tượng if/elif/else0 với thuộc tính if/elif/else1 được đặt thành if/elif/else2. Trường hợp thứ hai phù hợp nếu if/elif/else1 là if/elif/else4 hoặc if/elif/else5. Trường hợp thứ ba phù hợp với bất kỳ đối tượng nào của loại if/elif/else6, bất kể thuộc tính của nó. Và trường hợp cuối cùng là tất cả chúng ta nếu mọi thứ khác thất bại.

Bạn cũng có thể thực hiện bắt giữ với các đối tượng phù hợp:

match media_object:
    case Image(type=media_type):
        print (f"Image of type {media_type}")

Sử dụng mô hình cấu trúc python phù hợp hiệu quả

Chìa khóa với kết hợp mô hình cấu trúc Python là viết các trận đấu bao gồm các trường hợp cấu trúc mà bạn đang cố gắng phù hợp với. Các bài kiểm tra đơn giản chống lại các hằng số là tốt, nhưng nếu đó là tất cả những gì bạn làm, thì việc tra cứu từ điển đơn giản có thể là một lựa chọn tốt hơn. Giá trị thực của khớp mẫu cấu trúc là có thể tạo ra các trận đấu với một mẫu của các đối tượng, không chỉ một đối tượng cụ thể hoặc thậm chí là một lựa chọn của chúng.

Một điều quan trọng khác cần ghi nhớ là thứ tự của các trận đấu. Điều phù hợp với bạn kiểm tra đầu tiên sẽ có tác động đến hiệu quả và độ chính xác của tổng thể phù hợp của bạn. Hầu hết những người đã xây dựng chuỗi if/elif/else dài sẽ nhận ra điều này, nhưng khớp mẫu đòi hỏi bạn phải suy nghĩ về trật tự thậm chí cẩn thận hơn, do sự phức tạp tiềm năng. Đặt các trận đấu cụ thể nhất của bạn trước tiên và các trận đấu chung nhất cuối cùng.

Cuối cùng, nếu bạn có một vấn đề có thể được giải quyết bằng một chuỗi if/elif/else đơn giản hoặc tra cứu từ điển - sử dụng điều đó thay thế! Kết hợp mẫu là mạnh mẽ, nhưng không phổ quát. Sử dụng nó khi nó có ý nghĩa nhất cho một vấn đề.

Serdar Yegulalp là một nhà văn cao cấp tại Infoworld, tập trung vào học máy, container hóa, devops, hệ sinh thái Python và đánh giá định kỳ.

Bản quyền © 2021 IDG Communications, Inc.

Ý nghĩa của việc khớp mẫu là gì?

Trong khoa học máy tính, kết hợp mô hình là hành động kiểm tra một chuỗi mã thông báo nhất định cho sự hiện diện của các thành phần của một số mẫu.the act of checking a given sequence of tokens for the presence of the constituents of some pattern.

Phù hợp với mẫu là gì cho một ví dụ?

Ví dụ: x* khớp với bất kỳ số lượng ký tự x nào, [0-9]* khớp với bất kỳ số chữ số nào và.* Khớp với bất kỳ số lượng nào.Một mẫu biểu thức thông thường khớp thành công nếu mẫu khớp với bất cứ nơi nào trong giá trị đang được kiểm tra.x* matches any number of x characters, [0-9]* matches any number of digits, and . * matches any number of anything. A regular expression pattern match succeeds if the pattern matches anywhere in the value being tested.

Kết hợp mẫu được sử dụng để làm gì?

Kết hợp mẫu được sử dụng để xác định xem các tệp nguồn của các ngôn ngữ cấp cao có đúng về mặt cú pháp hay không.Nó cũng được sử dụng để tìm và thay thế một mẫu phù hợp trong một văn bản hoặc mã bằng một văn bản/mã khác.Bất kỳ ứng dụng nào hỗ trợ chức năng tìm kiếm đều sử dụng khớp mẫu bằng cách này hay cách khác.to determine whether source files of high-level languages are syntactically correct. It is also used to find and replace a matching pattern in a text or code with another text/code. Any application that supports search functionality uses pattern matching in one way or another.

Mã hóa phù hợp với mẫu là gì?

Kết hợp mẫu là một kỹ thuật mà bạn kiểm tra một biểu thức để xác định xem nó có đặc điểm nhất định không.Kết hợp mẫu C# cung cấp cú pháp ngắn gọn hơn để kiểm tra các biểu thức và thực hiện hành động khi một biểu thức khớp.a technique where you test an expression to determine if it has certain characteristics. C# pattern matching provides more concise syntax for testing expressions and taking action when an expression matches.