Bu örneğin çıktılarında, neden önce print’leri, sonra yield’leri veriyor, orasını anlayamadım. Shell’de oynadım, doğrudan next(g) yazınca hem print’i, hem yield’i veriyor. Neden next(g) değişkene atanıp sonra sadece değişken yazılınca sadece yield’i veriyor?
Teşekkür ederim.
def üreteç():
print("üreteç ilk defa next fonksiyonu ile kullanıldı.")
yield "1. yield"
print("üreteç ikinci defa next fonksiyonu ile kullanıldı.")
yield "2. yield"
print("üreteç üçüncü defa next fonksiyonu ile kullanıldı ve bitti.")
>>> g = üreteç()
>>> ilk_dönüş = next(g)
üreteç ilk defa next fonksiyonu ile kullanıldı.
>>> ikinci_dönüş = next(g)
üreteç ikinci defa next fonksiyonu ile kullanıldı.
>>> son_dönüş = next(g)
üreteç üçüncü defa next fonksiyonu ile kullanıldı ve bitti.
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
next(g)
StopIteration
>>>
>>> ilk_dönüş
'1. yield'
>>> ikinci_dönüş
'2. yield'
>>> son_dönüş
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
son_dönüş
NameError: name 'son_dönüş' is not defined```
print fonksiyonu çalıştığı anda kendisine verilen parametreler ekrana yazılıyor. Zaten print fonksiyonun işi bu.
Linkini verdiğiniz kodda yield ile döndürülen değerler sırasıyla ilk_dönüş, ikinci_dönüş ve son_dönüş değişkenlerine atanıyor. Yani ilk_dönüş = next(g) satırı çalıştığında önce print("üreteç ilk defa next fonksiyonu ile kullanıldı.") kodu çalışıyor ve yazı ekrana yazılıyor, daha sonra da yield "1. yield" ile döndürdüğümüz "1. yield" değeri ilk_dönüş değişkenine atanıyor. Diğerleri için de aynısı geçerli. En sonda da bu üç değişkeni etkileşimli kabuğa yazarak değerlerini görüyoruz.
Etkileşimli kabuk, expression’ların, yani eval fonksiyonuna parametre olarak verilebilecek veya arkasında bir değer bırakan ifadelerin (mesela 1+1 arkasında 2 değeri bırakır ve bir expression’dur ancak a=1 bir expression değildir.) sonucunu -eğer bu sonuç None değilse- ekrana yazdırma özelliğine sahip. Buna fonksiyonlar da dahil çünkü fonksiyonlar değer döndürüyor. Yani bu karşılaştığınız durum next(g) ifadesine özel değil:
next(g) için de yukarıdaki ile aynı durum geçerli, önce üreteç içindeki print ekrana yazı yazdırıyor, daha sonra da next(g) fonksiyonun döndürdüğü değer etkileşimli kabuk tarafından ekrana yazılıyor.