PHP
Generator ile pipeline
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
-
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.
-
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();
Sıradaki ders: Özet - Generator'lar