CodeBlanks Logo Icon CodeBlanks

Generator ile pipeline

PHP kursu · Uzman · Ders 6/54

Birden fazla generator'ı pipeline gibi zincirleyi veri akışı kurmayı öğrenirsin.

Generator pipeline

Birden fazla generator'ı zincirleyebilirsin: her generator bir öncekinin çıktısını alıp işler. Veri akış halinde işlenir; ara diziler hiç oluşturulmaz.

Örneğin bir generator sayıları üretir, ikincisi süzer, üçüncüsü dönüştürür. Her adım tek değer aktarır; böylece büyük veri setleri belleğe yüklenmeden kolayca işlenir.

return ve getReturn()

Bir generator return ile son bir değer döndürebilir. Bu değer yield ile yayılmaz; generator tamamen bittikten sonra getReturn() ile alınır.

Bu, bir akışın sonucunu özetlemek için kullanışlıdır. Örneğin sayıları yield ile üretip döngü sonunda return $sum / $count; ile ortalamayı döndürebilirsin.

Uygulama Süzme ve dönüştürme pipeline'ı

filterEven(array $nums): \Generator fonksiyonu yaz: çift sayıları yield ile üret. squares(array $nums): \Generator fonksiyonu yaz: filterEven($nums)'ı foreach ile yinele ve her değerin karesini yield ile üret. foreach ile squares([1, 2, 3, 4, 5, 6]) yinele ve her kareyi yazdır.

Örnek çözümü göster
filterEven'de foreach ($nums as $n) ile dön, $n % 2 === 0 ise yield $n;. squares'te foreach (filterEven($nums) as $n) ile dön, yield $n * $n;. Sonra foreach (squares([1, 2, 3, 4, 5, 6]) as $n) ile yinele ve echo $n . "\n"; yaz.
Örnek çözüm:
<?php
function filterEven(array $nums): \Generator {
    foreach ($nums as $n) {
        if ($n % 2 === 0) {
            yield $n;
        }
    }
}

function squares(array $nums): \Generator {
    foreach (filterEven($nums) as $n) {
        yield $n * $n;
    }
}

foreach (squares([1, 2, 3, 4, 5, 6]) as $n) {
    echo $n . "\n";
}

Uygulama Ortalama hesapla ve getReturn ile al

average(array $nums): \Generator fonksiyonu yaz: her sayıyı yield ile üret, sonra return ile ortalamayı döndür. $gen = average([10, 20, 30]) ile oluştur, foreach ile her sayıyı yazdır. Sonra $gen->getReturn() ile ortalamayı yazdır.

Örnek çözümü göster
" . $gen->getReturn() . "\n"; yaz.
Örnek çözüm:
<?php
function average(array $nums): \Generator {
    $sum = 0;
    $count = 0;
    foreach ($nums as $n) {
        $sum += $n;
        $count++;
        yield $n;
    }
    return $sum / $count;
}

$gen = average([10, 20, 30]);
foreach ($gen as $n) {
    echo $n . "\n";
}
echo "Ortalama: " . $gen->getReturn() . "\n";

Kendini test et

  1. Generator pipeline'ın avantajı nedir?

    • Ara diziler oluşturmaz, bellek tasarrufu sağlar
    • Daha hızlı çalışır çünkü paraleldir
    • Tüm veriyi bir seferde belleğe yükler
    • Hata yakalamayı otomatikleştirir
    Cevabı göster

    Ara diziler oluşturmaz, bellek tasarrufu sağlar — Doğru. Her adım tek değer aktarır; ara diziler oluşmaz, bellek korunur.

  2. Generator'ın son değerini al

    $gen = counter();
    foreach ($gen as $n) { echo $n; }
    echo $gen->____();
    
    Cevabı göster
    $gen = counter();
    foreach ($gen as $n) { echo $n; }
    echo $gen->getReturn();
    

Uzman bölümündeki tüm dersler