Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
case._.|.Instrukcja match w Pythonie jest przydatna, gdy jedna wartość może przyjmować kilka znanych kształtów lub poleceń. Przypomina switch z innych języków, ale Python nazywa ją strukturalnym dopasowywaniem wzorców.
match command:
case "start":
print("Starting")
case "stop":
print("Stopping")
case _:
print("Unknown command")Python sprawdza przypadki od góry do dołu i wykonuje pierwszy pasujący. Nie ma przechodzenia do kolejnych przypadków (fall-through), więc nie dodajesz break po każdej gałęzi.
Użyj |, gdy kilka wartości literalnych ma mieć wspólny wynik. Guard dodaje warunek if po wzorcu, gdy samo dopasowanie wartości nie wystarcza.
Dla prostych progów, takich jak score >= 90, zwykłe if / elif / else pozostaje czytelniejsze. Ta lekcja skupia się na literalnym kierowaniu, alternatywach, przypadkach awaryjnych i jednym przypadku z guardem — nie na zaawansowanych wzorcach sekwencji ani obiektów.
Każdy przypadek literalny obsługuje jedno znane polecenie.
command = "pause"
match command:
case "start":
print("Worker: starting")
case "pause":
print("Worker: paused")
case _:
print("Worker: unsupported")Wynik:
Worker: pausedWykonuje się tylko pierwszy pasujący przypadek.
Symbol _ obsługuje wartości, które nie zostały wymienione wprost.
export_format = "xml"
match export_format:
case "csv":
print("Exporter: CSV")
case "json":
print("Exporter: JSON")
case _:
print("Exporter: unavailable")Wynik:
Exporter: unavailableSymbol wieloznaczny powinien występować po przypadkach szczegółowych.
Użyj |, gdy kilka wzorców prowadzi do tej samej gałęzi.
method = "HEAD"
match method:
case "GET" | "HEAD":
print("Request: read")
case "POST" | "PUT":
print("Request: write")
case _:
print("Request: unsupported")Wynik:
Request: readGałąź wykonuje się, gdy pasuje któryś z literałów.
Guard doprecyzowuje dopasowany przypadek dodatkowym warunkiem.
event_type = "payment"
amount = 1250
match event_type:
case "payment" if amount >= 1000:
print("Payment: manual review")
case "payment":
print("Payment: automatic")
case _:
print("Event: ignored")Wynik:
Payment: manual reviewPrzypadek płatności z guardem musi znajdować się przed ogólniejszym przypadkiem płatności.
| Cel | Wzorzec |
|---|---|
| Dopasowanie jednego literału | case "start": |
| Dopasowanie któregokolwiek z literałów | `case "GET" |
| Dodanie kolejnego warunku | case "payment" if amount > 0: |
| Obsługa wszystkiego pozostałego | case _: |
break po każdym przypadku; Python nie przechodzi do następnego przypadku.case _ przed przypadkami szczegółowymi.match do zwykłych progów liczbowych, które są czytelniejsze z if / elif.