Softmush.com, teknoloji, yazılım ve dijital dünyaya dair derinlemesine içeriklerle bilgiye ulaşmanın güvenilir adresi. - Softmush.com
“ Söz konusu olan vatansa, gerisi teferruat. ”
Mustafa K. Atatürk
Python Dilinde Yapısal Desen Eşleştirme (Structural Pattern Matching) ve Match Deyimi Kullanımı

Python Dilinde Yapısal Desen Eşleştirme (Structural Pattern Matching) ve Match Deyimi Kullanımı

Python 3.10 ile tanıtılan yapısal desen eşleştirme (structural pattern matching) özelliği, programcılara kodlarını daha okunaklı ve yönetilebilir hale getirme imkanı sunar. Özellikle karmaşık veri yapılarını analiz ederken veya farklı durumları işlerken, match deyimi if/elif/else zincirlerine modern ve güçlü bir alternatif sunar. Bu makale, Python'daki match deyiminin temel prensiplerini, sözdizimini ve çeşitli kullanım senaryolarını detaylı bir şekilde açıklamaktadır.

Sözdizimi


Python'daki match deyiminin temel sözdizimi aşağıdaki gibidir:


match konu:
    case desen_1:
        # desen_1 eşleşirse çalışacak kod
    case desen_2 if koşul:
        # desen_2 eşleşirse ve koşul doğruysa çalışacak kod
    case _:
        # hiçbir desen eşleşmezse çalışacak kod (isteğe bağlı)

Detaylı Açıklama


match deyiminin her bir bileşeni belirli bir amaca hizmet eder:


  • match konu:
    konu ifadesi, eşleştirme yapılmak istenen herhangi bir Python objesidir. Bu, bir değişken, bir fonksiyon çağrısının sonucu veya doğrudan bir değer olabilir. match deyimi, bu konu objesini sırasıyla tanımlanan case desenleriyle karşılaştırır.

  • case desen:
    Her case bloğu, konu ile eşleştirilmeye çalışılan bir desen tanımlar. Desenler çeşitli tiplerde olabilir ve aşağıdaki gibi farklı eşleştirme mekanizmalarını destekler:


    • Değer Desenleri (Literal Patterns): Sabit değerlerle (sayılar, dizeler, True, False, None) eşleşir. Örn: case 1:, case "hata":.

    • Yakalama Desenleri (Capture Patterns): Bir değeri bir değişkene atar. Örn: case x:. Eğer x daha önce tanımlanmamışsa, eşleşen değeri x'e atar. Eğer _ kullanılırsa, bu bir wildcard (joker) deseni olarak kabul edilir ve değeri yakalamaz, sadece eşleşir.

    • Sıra Desenleri (Sequence Patterns): Listeler veya tuple'lar gibi sıralı veri yapılarını eşleştirmek için kullanılır. Örn: case [x, y]:, case (başlangıç, *diğerleri):.

    • Haritalama Desenleri (Mapping Patterns): Sözlükler gibi anahtar-değer çiftlerini içeren veri yapılarını eşleştirmek için kullanılır. Örn: case {"tip": "hata", "kod": c}:.

    • Sınıf Desenleri (Class Patterns): Belirli bir sınıfın örneklerini eşleştirmek ve bu örneklerin niteliklerine erişmek için kullanılır. Örn: case Nokta(x=nx, y=ny):.

    • OR Desenleri (OR Patterns): Birden fazla deseni | operatörü ile birleştirerek, herhangi bir desenin eşleşmesi durumunda kod bloğunun çalışmasını sağlar. Örn: case "a" | "b":.

    • AS Desenleri (AS Patterns): Bir deseni eşleştirirken aynı zamanda eşleşen değeri başka bir değişkene atamak için kullanılır. Örn: case ["komut", *args] as tüm_komut:.


  • if koşul: (Guard)
    Her case deseninin arkasına isteğe bağlı olarak bir if koşul: ifadesi eklenebilir. Bu, desenin eşleşmesinin yanı sıra, belirtilen koşulun da doğru olmasını gerektirir. Koşul, desende yakalanan değişkenleri kullanabilir. Örn: case {"yaş": y} if y >= 18:.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, match deyiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.


Örnek 1: Temel Değer Eşleştirme


Bir HTTP durum kodunu işleme:


durum_kodu = 200

match durum_kodu:
    case 200:
        print("OK - İstek başarıyla işlendi.")
    case 404:
        print("Bulunamadı - Kaynak mevcut değil.")
    case 500:
        print("Sunucu Hatası - İç sunucu hatası oluştu.")
    case _: # Joker desen, diğer tüm durumlar için
        print(f"Bilinmeyen durum kodu: {durum_kodu}")

Çıktı:


OK - İstek başarıyla işlendi.

Örnek 2: Sıra Desenleri ve Yakalama


Bir komut listesini ayrıştırma:


komut = ["yükle", "uygulama.exe", "--sessiz"]

match komut:
    case ["yükle", dosya, *argümanlar]:
        print(f"'{dosya}' yükleniyor. Argümanlar: {argümanlar}")
    case ["sil", dosya]:
        print(f"'{dosya}' siliniyor.")
    case _:
        print("Geçersiz komut.")

Çıktı:


'uygulama.exe' yükleniyor. Argümanlar: ['--sessiz']

Örnek 3: Haritalama Desenleri ve Koşullu Eşleştirme (Guard)


Bir kullanıcı objesini işleme:


kullanici_verisi = {"ad": "Mehmet", "rol": "admin", "aktif": True}

match kullanici_verisi:
    case {"rol": "admin", "aktif": True}:
        print("Yönetici girişi yapıldı.")
    case {"rol": "editor", "aktif": True, "ad": isim}:
        print(f"Editör '{isim}' giriş yaptı.")
    case {"aktif": False}:
        print("Kullanıcı hesabı pasif.")
    case _:
        print("Bilinmeyen kullanıcı durumu.")

Çıktı:


Yönetici girişi yapıldı.

Örnek 4: Sınıf Desenleri


Özel bir sınıfın örneklerini eşleştirme. Önce sınıfı tanımlayalım:


class Nokta:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Nokta(x={self.x}, y={self.y})"

nokta_objesi = Nokta(10, 20)
mesaj_objesi = "Merhaba"

match nokta_objesi:
    case Nokta(x=0, y=0):
        print("Orijin noktasında.")
    case Nokta(x=nx, y=ny) if nx == ny:
        print(f"x ve y değerleri eşit: {nx}")
    case Nokta(x=nx, y=ny):
        print(f"Farklı bir nokta: x={nx}, y={ny}")
    case _:
        print("Bir Nokta objesi değil.")

Çıktı:


Farklı bir nokta: x=10, y=20

Örnek 5: OR Desenleri ve AS Desenleri


Birden fazla durumu tek bir case altında işleme ve değeri yakalama:


durum = "başarılı"
# durum = "tamamlandı"
# durum = "işlem_yapılmadı"

match durum:
    case "başarılı" | "tamamlandı" as sonuc:
        print(f"İşlem {sonuc} şekilde tamamlandı.")
    case "hata" | "başarısız":
        print("İşlemde bir hata oluştu.")
    case _:
        print("Bilinmeyen durum.")

Çıktı:


İşlem başarılı şekilde tamamlandı.

Önemli Notlar


  • Sıralama Önemlidir: match deyimi, case bloklarını yukarıdan aşağıya doğru sırayla değerlendirir. İlk eşleşen case bloğu yürütülür ve match deyiminden çıkılır. Bu nedenle, daha spesifik desenler genel desenlerden önce gelmelidir.

  • _ (Wildcard): Alt çizgi (_), hiçbir şeyi yakalamayan ve her zaman eşleşen bir joker desendir. Genellikle match bloğunun son case'i olarak, varsayılan bir durumu ele almak için kullanılır (else gibi).

  • if Koşulları (Guards): Bir case deseni eşleşse bile, arkasından gelen if koşulu False ise o case bloğu yürütülmez. Bu, daha karmaşık koşulları desen eşleştirmeye dahil etmek için güçlü bir yoldur.

  • Değişken Yakalama: Bir desende kullanılan ve daha önce tanımlanmamış bir isim (örneğin case x:), eşleşen değeri o değişkene atar. Bu, yakalama deseni olarak bilinir.

  • Python 3.10 ve Sonrası: match deyimi, Python'ın 3.10 sürümü ile birlikte tanıtılmıştır. Daha eski Python sürümlerinde bu özellik bulunmamaktadır.

  • Performans: Küçük ve basit koşullar için if/elif/else zincirleri hala uygun olabilir. Ancak karmaşık veri yapıları üzerinde birden fazla durumu ele alırken match deyimi, kodu daha okunaklı ve sürdürülebilir hale getirir.


Yayınlanma Tarihi: 2025-10-17 15:00:46
SQL Dilinde COUNT Fonksiyonunun Detaylı Kullanımı
Önceki Haber

SQL Dilinde COUNT Fonksiyonunun Detaylı Kullanımı

SQL Makaleleri
Sonraki Haber

PHP Dilinde Öntanımlı Değişkenler Kullanımı

PHP Makaleleri
PHP Dilinde Öntanımlı Değişkenler Kullanımı

Yorum yap

Yorum yapabilmek için  giriş  yapmalısınız.

Yorumlar

Bu yazı hakkında henüz yorum yapılmamıştır.
× Python Dilinde Python Iterators Kullanımı
Bu ilginizi çekebilir

Python Dilinde Python Iterators Kullanımı

Python'da iterators (yineleyiciler), verimli ve bellek dostu bir şekilde veri...