send ve throw
- Python kursu
- Orta seviye
- Ders 103/116
- 5 dk
send() ve throw() ile generator etkileşimini öğrenirsin.
send metodu
Bir üreteç dışarıdan değer alabilir. g.send(deger) çağrısı, üretecin beklediği yield ifadesine değer gönderir ve bir sonraki yield'e kadar ilerletir. Bu, üreteçleri esnek eşyordam (coroutine) gibi kullanmayı sağlar.
Örnek: v = yield total. g.send(5) çağrısı v'ye 5 atar. İlk send'den önce next(g) çağrısı yapılarak üreteç ilk yield'e ilerletilmelidir; bu işleme priming denir.
throw metodu
g.throw(Exception) çağrısı, üretecin beklediği yield noktasında bir istisna fırlatır. Üreteç bu istisnayı try/except ile yakalayabilir ya da yukarı yayabilir.
Örnek: üreteç try:\n v = yield total\nexcept ValueError:\n print("hata") gövdesine sahipse, g.throw(ValueError) çağrısı except bloğunu çalıştırır. Bu, üreteci dışarıdan hata sinyali vermek için kullanılır; özellikle uzun süren işlerde iptal ya da durum değişimi için pratiktir.
Uygulama acc üreteci ve send
def acc(): fonksiyonunu tanımla. Gövdede total = 0 yaz; while True: döngüsü aç; içinde v = yield total ve if v is not None: total += v yaz. g = acc() ile örnek oluştur, next(g) ile başlat. print(g.send(5)) ve print(g.send(10)) ile iki değer gönder ve sonucu yazdır.
Başlangıç kodu
# acc üreteci ve send ile değer toplaÖrnek çözüm
# acc üreteci ve send ile değer topla
def acc():
total = 0
while True:
v = yield total
if v is not None:
total += v
g = acc()
next(g)
print(g.send(5))
print(g.send(10))Beklenen çıktı
5 15
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 send ve throw parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
send |
Değer gönderir |
throw |
Hata fırlatır |
next(g) |
Başlatma |
v = yield |
Değer alımı |
2 send çağrısından önce ne yapılır?
- Üreteç silinir
- next(g) ile başlatılır Doğru cevap
- throw çağrılır
- close çağrılır
Açıklama: Next(g) ile başlatılır. Bu işlem priming olarak bilinir.
3 send çağrısı
g = acc()
next(g)
print(g.____(5))
g = acc()
next(g)
print(g.send(5))
Açıklama: g.send(5) üretece 5 gönderir.