{"id":31700,"date":"2025-10-13T01:01:56","date_gmt":"2025-10-12T22:01:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/"},"modified":"2025-10-13T01:01:56","modified_gmt":"2025-10-12T22:01:56","slug":"pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/","title":{"rendered":"Python&#8217;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler"},"content":{"rendered":"<p><body><\/p>\n<p>Python&#8217;\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?<\/p>\n<p>Python programlaman\u0131n kalbinde yer alan d\u00f6ng\u00fcler, veri koleksiyonlar\u0131 \u00fczerinde i\u015flem yapmam\u0131z\u0131 sa\u011flayan temel yap\u0131 ta\u015flar\u0131d\u0131r. Ancak, bu d\u00f6ng\u00fclerin perde arkas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, neden baz\u0131 yap\u0131lar\u0131n di\u011ferlerinden daha verimli oldu\u011funu hi\u00e7 merak ettiniz mi? \u00d6zellikle b\u00fcy\u00fck veri setleriyle veya sonsuz veri ak\u0131\u015flar\u0131yla \u00e7al\u0131\u015f\u0131rken, s\u0131radan d\u00f6ng\u00fclerin performans\u0131 ve bellek t\u00fcketimi konusunda yetersiz kald\u0131\u011f\u0131 durumlarla kar\u015f\u0131la\u015fabiliriz. \u0130\u015fte tam da bu noktada, Python&#8217;\u0131n iterasyon protokol\u00fc devreye girer: \u0130terable&#8217;lar, \u0130terat\u00f6rler ve Jenerat\u00f6rler. Bu kavramlar\u0131 ustaca kullanmak, kodunuzu sadece daha h\u0131zl\u0131 ve bellek dostu hale getirmekle kalmaz, ayn\u0131 zamanda daha temiz, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir bir yap\u0131ya kavu\u015fturur.<\/p>\n<p>Her Python geli\u015ftiricisinin s\u0131kl\u0131kla kulland\u0131\u011f\u0131 <code>for<\/code> d\u00f6ng\u00fcleri, listeler, demetler (tuple&#8217;lar) veya string&#8217;ler gibi koleksiyonlar \u00fczerinde zahmetsizce gezinmemizi sa\u011flar. Ancak bu kolayl\u0131\u011f\u0131n ard\u0131nda, Python&#8217;\u0131n incelikle tasarlanm\u0131\u015f bir iterasyon protokol\u00fc yatar. Bu protokol\u00fc anlamak, yaln\u0131zca kodumuzun neden \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavramam\u0131z\u0131 sa\u011flamaz, ayn\u0131 zamanda onu daha etkili bir \u015fekilde kullanmam\u0131z\u0131n da kap\u0131lar\u0131n\u0131 aralar. \u00d6zellikle modern uygulamalar\u0131n kar\u015f\u0131la\u015ft\u0131\u011f\u0131 zorluklar d\u00fc\u015f\u00fcn\u00fcld\u00fc\u011f\u00fcnde, b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015fmak, web servislerinden gelen s\u00fcrekli veri ak\u0131\u015flar\u0131n\u0131 i\u015flemek veya s\u0131n\u0131rl\u0131 bellek kaynaklar\u0131na sahip sistemlerde optimizasyon yapmak gibi konularda, iterasyon protokol\u00fc bilgisi kritik bir avantaj sa\u011flar.<\/p>\n<p>Bir veri yap\u0131s\u0131 \u00fczerinde basit\u00e7e d\u00f6ng\u00fc yapmak \u00e7o\u011fu zaman yeterli olsa da, bellek verimlili\u011fi ve performans s\u00f6z konusu oldu\u011funda, bu temel yakla\u015f\u0131m h\u0131zla yetersiz kalabilir. \u00d6rne\u011fin, milyonlarca sat\u0131rl\u0131k bir dosyay\u0131 okumak veya \u00e7ok b\u00fcy\u00fck bir liste olu\u015fturmak, uygulaman\u0131z\u0131n belle\u011fini h\u0131zla t\u00fcketerek \u00e7\u00f6kmeye yol a\u00e7abilir. \u0130\u015fte bu t\u00fcr senaryolarda, \u0130terable&#8217;lar, \u0130terat\u00f6rler ve \u00f6zellikle Jenerat\u00f6rler gibi ara\u00e7lar devreye girer. Bu yap\u0131lar, veriyi &#8220;ihtiya\u00e7 duyuldu\u011fu anda&#8221; \u00fcretme (lazy evaluation) ilkesine dayanarak, t\u00fcm veri setini belle\u011fe y\u00fcklemeye gerek kalmadan par\u00e7a par\u00e7a i\u015flenmesine olanak tan\u0131r. Bu da hem bellek ayak izini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r hem de b\u00fcy\u00fck veri ak\u0131\u015flar\u0131n\u0131 kesintisiz bir \u015fekilde i\u015flemenize yard\u0131mc\u0131 olur.<\/p>\n<p>\u00dcstelik, iterasyon protokol\u00fcn\u00fc kavramak, sadece performans avantajlar\u0131 sunmakla kalmaz, ayn\u0131 zamanda daha esnek ve mod\u00fcler kod yazman\u0131z\u0131 da te\u015fvik eder. Kendi \u00f6zel veri yap\u0131lar\u0131m\u0131z\u0131 olu\u015fturdu\u011fumuzda veya d\u0131\u015f kaynaklardan gelen verileri Python&#8217;\u0131n do\u011fal d\u00f6ng\u00fc mekanizmalar\u0131yla uyumlu hale getirmek istedi\u011fimizde, bu protokol bize yol g\u00f6sterir. B\u00f6ylece, kodumuz daha Pythonik, daha okunabilir ve ba\u015fkalar\u0131 taraf\u0131ndan anla\u015f\u0131lmas\u0131 daha kolay hale gelir. Bu makale boyunca, Python&#8217;\u0131n bu g\u00fc\u00e7l\u00fc mekanizmalar\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedecek, temel kavramlardan ba\u015flayarak ger\u00e7ek d\u00fcnya senaryolar\u0131na uzanan uygulamalarla bilginizi peki\u015ftirece\u011fiz. Peki, bu yolculukta ilk dura\u011f\u0131m\u0131z ne olmal\u0131? Elbette, iterasyonun temelini olu\u015fturan &#8216;\u0130terable&#8217; kavram\u0131.<\/p>\n<h2>Temel Kavramlar: \u0130terable Nedir ve Neden Python D\u00f6ng\u00fcleri \u0130\u00e7in Vazge\u00e7ilmezdir?<\/h2>\n<p>Python&#8217;da bir veri yap\u0131s\u0131n\u0131n \u00fczerinde <code>for<\/code> d\u00f6ng\u00fcs\u00fc kullanarak gezinebiliyorsan\u0131z, tebrikler, o bir &#8220;iterable&#8221;d\u0131r! Peki, bu tam olarak ne anlama geliyor? Basit\u00e7e ifade etmek gerekirse, <strong>iterable<\/strong> (T\u00fcrk\u00e7esi: yinelenebilir), elemanlar\u0131 \u00fczerinde gezinebildi\u011fimiz, yani birer birer eri\u015febildi\u011fimiz herhangi bir Python nesnesidir. Listeler, demetler (tuple&#8217;lar), string&#8217;ler, k\u00fcmeler (set&#8217;ler) ve s\u00f6zl\u00fckler (dictionary&#8217;ler) gibi s\u0131k\u00e7a kulland\u0131\u011f\u0131m\u0131z t\u00fcm yerle\u015fik veri yap\u0131lar\u0131 iterable&#8217;d\u0131r. Bir nesnenin iterable olmas\u0131n\u0131n temel \u015fart\u0131, <code>__iter__<\/code> \u00f6zel metoduna sahip olmas\u0131d\u0131r. Bu metod, bir <strong>iterat\u00f6r<\/strong> nesnesi d\u00f6nd\u00fcrmekten sorumludur.<\/p>\n<p>\u0130terable&#8217;lar, Python&#8217;\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131n temelini olu\u015fturur. Onlar sayesinde, bir koleksiyonun t\u00fcm elemanlar\u0131n\u0131 belle\u011fe tek seferde y\u00fcklemeye gerek kalmadan, ihtiya\u00e7 duyuldu\u011funda s\u0131rayla eri\u015febiliriz. Bu, \u00f6zellikle b\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken veya sonsuz bir veri ak\u0131\u015f\u0131n\u0131 i\u015flerken hayati \u00f6nem ta\u015f\u0131r. \u00d6rne\u011fin, bir liste t\u00fcm elemanlar\u0131n\u0131 bellekte tutarken, bir iterable nesne her zaman t\u00fcm elemanlar\u0131 \u00f6nceden haz\u0131rlamaz; bunun yerine, elemanlar\u0131 talep edildi\u011finde \u00fcretmek i\u00e7in bir mekanizma sunar. Bu &#8220;tembel de\u011ferlendirme&#8221; (lazy evaluation) yakla\u015f\u0131m\u0131, bellek verimlili\u011fi a\u00e7\u0131s\u0131ndan muazzam avantajlar sa\u011flar.<\/p>\n<p>\u015eimdi, bir iterable&#8217;\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair basit bir \u00f6rne\u011fe g\u00f6z atal\u0131m. Bir liste bir iterable&#8217;d\u0131r ve \u00fczerinde nas\u0131l d\u00f6ng\u00fc yapt\u0131\u011f\u0131m\u0131z\u0131 zaten biliyoruz:<\/p>\n<pre><code>\nsayilar = [1, 2, 3, 4, 5]\nfor sayi in sayilar:\n    print(sayi)\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>sayilar<\/code> listesi bir iterable'd\u0131r. <code>for<\/code> d\u00f6ng\u00fcs\u00fc, perde arkas\u0131nda <code>sayilar<\/code> \u00fczerinde <code>iter()<\/code> fonksiyonunu \u00e7a\u011f\u0131r\u0131r ve bu fonksiyon bir iterat\u00f6r nesnesi d\u00f6nd\u00fcr\u00fcr. Daha sonra, <code>next()<\/code> fonksiyonunu kullanarak bu iterat\u00f6rden s\u0131rayla elemanlar\u0131 al\u0131r. Peki, biz kendi iterable'\u0131m\u0131z\u0131 nas\u0131l olu\u015fturabiliriz? Kendi iterable s\u0131n\u0131f\u0131m\u0131z\u0131 tan\u0131mlamak i\u00e7in tek yapmam\u0131z gereken <code>__iter__<\/code> metodunu uygulamakt\u0131r. Bu metod, kendi iterat\u00f6r\u00fcm\u00fcz\u00fc d\u00f6nd\u00fcrmelidir.<\/p>\n<pre><code>\nclass MyIterable:\n    def __init__(self, limit):\n        self.limit = limit\n\n    def __iter__(self):\n        # Kendi iterat\u00f6r\u00fcm\u00fcz\u00fc d\u00f6nd\u00fcr\u00fcyoruz\n        return MyIterator(self.limit)\n\nclass MyIterator:\n    def __init__(self, limit):\n        self.limit = limit\n        self.current = 0\n\n    def __iter__(self):\n        return self # \u0130terat\u00f6rler de iterable'd\u0131r, kendilerini d\u00f6nd\u00fcr\u00fcrler\n\n    def __next__(self):\n        if self.current < self.limit:\n            self.current += 1\n            return self.current - 1\n        else:\n            raise StopIteration\n\n# Kullan\u0131m\nmy_obj = MyIterable(5)\nprint(\"Kendi Iterable Nesnem \u00fczerinde d\u00f6ng\u00fc yap\u0131yorum:\")\nfor num in my_obj:\n    print(num)\n\nprint(\"\\nTekrar d\u00f6ng\u00fc yapmak i\u00e7in yeni bir iterable \u00f6rne\u011fi olu\u015fturmal\u0131y\u0131m (veya iterat\u00f6r\u00fc resetlemeliyim).\")\nfor num in my_obj: # Bu, yeni bir iterat\u00f6r olu\u015fturacakt\u0131r.\n    print(num)\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>MyIterable<\/code> s\u0131n\u0131f\u0131, <code>__iter__<\/code> metodunu tan\u0131mlayarak bir iterable haline gelmi\u015ftir. Bu metod, her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda <code>MyIterator<\/code> s\u0131n\u0131f\u0131n\u0131n yeni bir \u00f6rne\u011fini d\u00f6nd\u00fcr\u00fcr. Bu, her <code>for<\/code> d\u00f6ng\u00fcs\u00fcnde veya <code>iter()<\/code> \u00e7a\u011fr\u0131s\u0131nda taze bir iterasyon ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar. Bu ayr\u0131m \u00e7ok \u00f6nemlidir: iterable, iterasyonu ba\u015flatan nesnedir; iterat\u00f6r ise iterasyonu y\u00f6neten nesnedir. Bu mekanizma sayesinde, Python veriler \u00fczerinde gezinirken hem esneklik hem de kontrol sa\u011flar. \u015eimdi gelin, bu iterasyon s\u00fcrecinin esas y\u00f6neticisi olan iterat\u00f6rleri daha derinlemesine inceleyelim.<\/p>\n<h2>\u0130terat\u00f6rler: Veri Ak\u0131\u015f\u0131n\u0131 Ad\u0131m Ad\u0131m Nas\u0131l Kontrol Ederiz ve Belle\u011fi Nas\u0131l Tasarruf Ederiz?<\/h2>\n<p>E\u011fer iterable'lar \u00fczerinde gezinebildi\u011fimiz nesnelerse, <strong>iterat\u00f6rler<\/strong> (T\u00fcrk\u00e7esi: yineleyiciler) tam da bu gezinti i\u015fini yapan nesnelerdir. Bir iterat\u00f6r, bir veri ak\u0131\u015f\u0131ndan elemanlar\u0131 s\u0131rayla \"\u00e7ekmek\" i\u00e7in kullan\u0131lan bir i\u015faret\u00e7i gibidir. Python'da bir iterat\u00f6r, <code>__iter__<\/code> ve <code>__next__<\/code> olmak \u00fczere iki \u00f6zel metodu uygulamak zorundad\u0131r. <code>__iter__<\/code> metodu, iterat\u00f6r\u00fcn kendisini d\u00f6nd\u00fcr\u00fcrken (bu da bir iterat\u00f6r\u00fcn de ayn\u0131 zamanda bir iterable oldu\u011fu anlam\u0131na gelir), <code>__next__<\/code> metodu ak\u0131\u015ftaki bir sonraki eleman\u0131 d\u00f6nd\u00fcrmekten sorumludur. Elemanlar bitti\u011finde ise, <code>StopIteration<\/code> istisnas\u0131 y\u00fckselterek d\u00f6ng\u00fcn\u00fcn sona erdi\u011fini bildirir.<\/p>\n<p>\u0130terat\u00f6rler, Python'\u0131n bellek verimlili\u011fi stratejisinin kilit bir bile\u015fenidir. \u00c7\u00fcnk\u00fc iterat\u00f6rler, koleksiyonun t\u00fcm elemanlar\u0131n\u0131 belle\u011fe bir kerede y\u00fcklemek yerine, yaln\u0131zca bir sonraki eleman\u0131 gerekti\u011finde hesaplar veya al\u0131r. Bu \"tembel\" yakla\u015f\u0131m, \u00f6zellikle b\u00fcy\u00fck dosyalar\u0131 okurken, veritaban\u0131 sorgu sonu\u00e7lar\u0131n\u0131 i\u015flerken veya s\u00fcrekli bir veri ak\u0131\u015f\u0131yla (\u00f6rne\u011fin, bir sens\u00f6rden gelen veriler) u\u011fra\u015f\u0131rken m\u00fcthi\u015f bir performans ve bellek tasarrufu sa\u011flar. \u00d6rne\u011fin, 10 GB'l\u0131k bir log dosyas\u0131n\u0131 bir liste olarak belle\u011fe y\u00fcklemeye \u00e7al\u0131\u015fsan\u0131z, sisteminiz muhtemelen \u00e7\u00f6kerdi. Ancak bir iterat\u00f6r kullanarak, dosyay\u0131 sat\u0131r sat\u0131r i\u015fleyebilir ve her seferinde sadece bir sat\u0131r\u0131n bellekte olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<p><code>for<\/code> d\u00f6ng\u00fclerinin perde arkas\u0131nda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na dair daha net bir fikir edinmek i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 inceleyelim:<\/p>\n<ol>\n<li><code>for eleman in iterable:<\/code> ifadesi \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Python \u00f6nce <code>iterable<\/code> \u00fczerinde <code>iter(iterable)<\/code> fonksiyonunu \u00e7a\u011f\u0131r\u0131r. Bu, <code>iterable<\/code>'\u0131n <code>__iter__<\/code> metodunu tetikler ve bir iterat\u00f6r nesnesi (<code>it<\/code>) d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li>Daha sonra, <code>for<\/code> d\u00f6ng\u00fcs\u00fc s\u00fcrekli olarak <code>next(it)<\/code> (yani <code>it.__next__()<\/code>) \u00e7a\u011f\u0131rarak iterat\u00f6rden bir sonraki eleman\u0131 ister.<\/li>\n<li>Her <code>next()<\/code> \u00e7a\u011fr\u0131s\u0131nda, iterat\u00f6r bir eleman d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li>Elemanlar t\u00fckendi\u011finde, iterat\u00f6r <code>StopIteration<\/code> istisnas\u0131 y\u00fckseltir.<\/li>\n<li><code>for<\/code> d\u00f6ng\u00fcs\u00fc bu istisnay\u0131 yakalar ve sessizce sonlan\u0131r.<\/li>\n<\/ol>\n<p>Kendi basit iterat\u00f6r\u00fcm\u00fcz\u00fc tekrar g\u00f6zden ge\u00e7irelim ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 daha iyi anlayal\u0131m:<\/p>\n<pre><code>\nclass TekrarEdenSayac:\n    def __init__(self, baslangic, adim, sinir):\n        self.current = baslangic\n        self.adim = adim\n        self.sinir = sinir\n\n    def __iter__(self):\n        return self # Bir iterat\u00f6r kendisi de bir iterable'd\u0131r.\n\n    def __next__(self):\n        if self.current < self.sinir:\n            deger = self.current\n            self.current += self.adim\n            return deger\n        else:\n            raise StopIteration\n\n# \u0130terat\u00f6r\u00fc manuel olarak kullanma\nsayac_iter = TekrarEdenSayac(0, 2, 10) # 0'dan ba\u015flay\u0131p 2'\u015fer atlayarak 10'a kadar\n\nprint(\"Manuel iterat\u00f6r kullan\u0131m\u0131:\")\nprint(next(sayac_iter)) # \u00c7\u0131kt\u0131: 0\nprint(next(sayac_iter)) # \u00c7\u0131kt\u0131: 2\nprint(next(sayac_iter)) # \u00c7\u0131kt\u0131: 4\nprint(next(sayac_iter)) # \u00c7\u0131kt\u0131: 6\nprint(next(sayac_iter)) # \u00c7\u0131kt\u0131: 8\n\ntry:\n    print(next(sayac_iter)) # StopIteration hatas\u0131 verir \u00e7\u00fcnk\u00fc 10'a ula\u015f\u0131ld\u0131 veya ge\u00e7ildi\nexcept StopIteration:\n    print(\"\u0130terasyon tamamland\u0131.\")\n\n# Ayn\u0131 iterat\u00f6r\u00fc for d\u00f6ng\u00fcs\u00fcnde kullanma (d\u00f6ng\u00fc, StopIteration'\u0131 kendi yakalar)\nprint(\"\\nFor d\u00f6ng\u00fcs\u00fcnde iterat\u00f6r kullan\u0131m\u0131:\")\nsayac_for = TekrarEdenSayac(10, 3, 25)\nfor s in sayac_for:\n    print(s)\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Kendi iterat\u00f6r s\u0131n\u0131f\u0131n\u0131z\u0131 yazmak, Python'\u0131n iterasyon protokol\u00fcn\u00fcn nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak i\u00e7in harika bir yoldur. Ancak \u00e7o\u011fu zaman, bu kadar detayl\u0131 bir s\u0131n\u0131f yazmak yerine, \u00e7ok daha basit ve Pythonik bir alternatif olan \"jenerat\u00f6rleri\" kullan\u0131r\u0131z. Jenerat\u00f6rler, iterat\u00f6r yazma s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir ve okunabilirli\u011fi art\u0131r\u0131r.\n<\/div>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, bir iterat\u00f6r durumunu (hangi eleman\u0131 d\u00f6nd\u00fcrece\u011fini) kendi i\u00e7inde saklar. Bu durum bilgisi, ayn\u0131 iterat\u00f6r nesnesinin sadece bir kez kullan\u0131labilmesine neden olur; bir kez t\u00fcketildi\u011finde, yeni bir iterasyon ba\u015flatmak i\u00e7in yeni bir iterat\u00f6r olu\u015fturman\u0131z gerekir. Bu prensip, iterat\u00f6rlerin tek kullan\u0131ml\u0131k oldu\u011funu g\u00f6sterir ve bu, onlar\u0131n bellek verimlili\u011fine katk\u0131da bulunan \u00f6nemli bir \u00f6zelli\u011fidir. \u015eimdi, bu g\u00fc\u00e7l\u00fc iterat\u00f6r prensibini Python'\u0131n en zarif \u00f6zelliklerinden biri olan jenerat\u00f6rlerle nas\u0131l daha kolay uygulayabilece\u011fimize bakal\u0131m.<\/p>\n<h2>Jenerat\u00f6rler: Verimli ve Tembel De\u011ferlendirme ile B\u00fcy\u00fck Veri Setlerini Nas\u0131l Y\u00f6netiriz?<\/h2>\n<p>Python'daki <strong>jenerat\u00f6rler<\/strong>, iterat\u00f6r olu\u015fturman\u0131n \u00e7ok daha basit ve zarif bir yoludur. Asl\u0131nda, jenerat\u00f6rler arka planda otomatik olarak iterat\u00f6r protokol\u00fcn\u00fc uygulayan \u00f6zel bir t\u00fcr fonksiyondur veya ifadedir. Bir fonksiyonu jenerat\u00f6r fonksiyonu yapan \u015fey, i\u00e7inde en az bir <code>yield<\/code> anahtar kelimesi kullanmas\u0131d\u0131r. Normal bir fonksiyon <code>return<\/code> ile bir de\u011fer d\u00f6nd\u00fcr\u00fcp sonlan\u0131rken, bir jenerat\u00f6r fonksiyonu <code>yield<\/code> ile bir de\u011fer \"\u00fcretir\" ve y\u00fcr\u00fctmeyi o noktada duraklat\u0131r. Bir sonraki eleman istendi\u011finde, jenerat\u00f6r kald\u0131\u011f\u0131 yerden devam eder.<\/p>\n<p>Bu <code>yield<\/code> mekanizmas\u0131, jenerat\u00f6rlerin \"tembel de\u011ferlendirme\" (lazy evaluation) prensibiyle \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Yani, t\u00fcm veri setini belle\u011fe \u00f6nceden y\u00fcklemek yerine, elemanlar ancak talep edildi\u011finde (yani <code>next()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda) tek tek \u00fcretilir. Bu, \u00f6zellikle b\u00fcy\u00fck veri dosyalar\u0131, sonsuz seriler veya bellek k\u0131s\u0131tl\u0131 ortamlar i\u00e7in inan\u0131lmaz derecede verimli bir yakla\u015f\u0131md\u0131r. Jenerat\u00f6rler sayesinde, on milyonlarca eleman\u0131 olan bir liste olu\u015fturmak yerine, bu elemanlar\u0131 teker teker \u00fcreten bir jenerat\u00f6r kullanabiliriz, b\u00f6ylece bellekte sadece o an i\u015flenen eleman bulunur.<\/p>\n<h3>Jenerat\u00f6r Fonksiyonlar\u0131: <code>yield<\/code> Anahtar Kelimesinin G\u00fcc\u00fc<\/h3>\n<p>Bir jenerat\u00f6r fonksiyonu tan\u0131mlamak, normal bir fonksiyon tan\u0131mlamaya benzer, ancak <code>return<\/code> yerine <code>yield<\/code> kullan\u0131l\u0131r:<\/p>\n<pre><code>\ndef baslangic_sayilari_uret(limit):\n    n = 0\n    while n < limit:\n        yield n  # De\u011fer \u00fcretir ve duraklar\n        n += 1\n\n# Jenerat\u00f6r nesnesini olu\u015fturma\nsayilar = baslangic_sayilari_uret(5)\n\nprint(\"Jenerat\u00f6rden de\u011ferleri alma (manuel):\")\nprint(next(sayilar)) # \u00c7\u0131kt\u0131: 0\nprint(next(sayilar)) # \u00c7\u0131kt\u0131: 1\nprint(next(sayilar)) # \u00c7\u0131kt\u0131: 2\n\nprint(\"\\nJenerat\u00f6rden kalan de\u011ferleri alma (for d\u00f6ng\u00fcs\u00fc ile):\")\nfor sayi in sayilar:\n    print(sayi) # \u00c7\u0131kt\u0131: 3, 4\n    \n# Not: Bir jenerat\u00f6r nesnesi bir kez t\u00fcketildi\u011finde, ba\u015ftan ba\u015flamak i\u00e7in\n# jenerat\u00f6r fonksiyonunu tekrar \u00e7a\u011f\u0131rman\u0131z gerekir.\nyeni_sayilar = baslangic_sayilari_uret(3)\nprint(\"\\nYeni jenerat\u00f6r nesnesi olu\u015fturup d\u00f6ng\u00fc yapma:\")\nfor s in yeni_sayilar:\n    print(s)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte <code>baslangic_sayilari_uret<\/code> bir jenerat\u00f6r fonksiyonudur. Onu \u00e7a\u011f\u0131rd\u0131\u011f\u0131m\u0131zda, do\u011frudan bir liste d\u00f6nd\u00fcrmek yerine, bir jenerat\u00f6r nesnesi d\u00f6nd\u00fcr\u00fcr. Bu jenerat\u00f6r nesnesi, <code>__iter__<\/code> ve <code>__next__<\/code> metotlar\u0131na sahip bir iterat\u00f6rd\u00fcr. Her <code>next()<\/code> \u00e7a\u011fr\u0131s\u0131nda (veya <code>for<\/code> d\u00f6ng\u00fcs\u00fc her bir eleman istedi\u011finde), <code>yield<\/code> ifadesinin bulundu\u011fu yerden fonksiyon kald\u0131\u011f\u0131 yerden devam eder, yeni bir de\u011fer \u00fcretir ve tekrar duraklar.<\/p>\n<h3>Jenerat\u00f6r \u0130fadeleri: List Comprehension'a Bellek Dostu Alternatif<\/h3>\n<p>Jenerat\u00f6r ifadeleri, list comprehension'lara benzer bir s\u00f6zdizimine sahiptir ancak k\u00f6\u015feli parantezler <code>[]<\/code> yerine parantezler <code>()<\/code> kullan\u0131r. Temel fark, list comprehension'\u0131n t\u00fcm listeyi belle\u011fe tek seferde in\u015fa etmesi, jenerat\u00f6r ifadesinin ise bir jenerat\u00f6r nesnesi d\u00f6nd\u00fcrmesi ve elemanlar\u0131 ihtiya\u00e7 duyuldu\u011funda \u00fcretmesidir.<\/p>\n<pre><code>\n# List Comprehension (t\u00fcm listeyi belle\u011fe y\u00fckler)\nkareler_liste = [x*x for x in range(1000000)] # B\u00fcy\u00fck bellek kullan\u0131m\u0131\n\n# Jenerat\u00f6r \u0130fadesi (bellek dostu)\nkareler_jenerator = (x*x for x in range(1000000)) # Sadece jenerat\u00f6r nesnesi bellekte\n\nprint(\"Jenerat\u00f6r ifadesi bir jenerat\u00f6r nesnesi d\u00f6nd\u00fcr\u00fcr:\", kareler_jenerator)\nprint(\"\u0130lk 5 kareyi alma:\")\nfor _ in range(5):\n    print(next(kareler_jenerator))\n\n# Kalan\u0131n\u0131 for d\u00f6ng\u00fcs\u00fc ile t\u00fcketebiliriz\n# for kare in kareler_jenerator:\n#    ...\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kar\u015f\u0131la\u015ft\u0131rma, jenerat\u00f6r ifadelerinin \u00f6zellikle b\u00fcy\u00fck veri setleriyle veya dinamik olarak \u00fcretilen serilerle \u00e7al\u0131\u015f\u0131rken ne kadar hayati olabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Bir milyona kadar say\u0131n\u0131n karesini alan liste, do\u011frudan belle\u011fe y\u00fcklenirken, jenerat\u00f6r ifadesi ayn\u0131 veriyi \u00e7ok daha k\u00fc\u00e7\u00fck bir bellek ayak iziyle, ad\u0131m ad\u0131m i\u015fleyebilir. Bu, Python'da verimli ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. \u015eimdi, jenerat\u00f6rlerin daha ileri d\u00fczey kullan\u0131mlar\u0131na ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131na g\u00f6z atal\u0131m.<\/p>\n<h2>\u0130leri D\u00fczey Kullan\u0131m: Jenerat\u00f6rlerin Gizli G\u00fcc\u00fcn\u00fc Ortaya \u00c7\u0131karma<\/h2>\n<p>Jenerat\u00f6rler, yaln\u0131zca basit de\u011fer \u00fcretmekle kalmaz, ayn\u0131 zamanda daha karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in de g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Bu b\u00f6l\u00fcmde, jenerat\u00f6rlerin baz\u0131 ileri d\u00fczey \u00f6zelliklerini ke\u015ffedece\u011fiz: sonsuz seriler olu\u015fturma, <code>send()<\/code> metodu ile \u00e7ift y\u00f6nl\u00fc ileti\u015fim kurma ve <code>yield from<\/code> ile jenerat\u00f6rleri birle\u015ftirme.<\/p>\n<h3>Sonsuz Seriler Olu\u015fturma: Belle\u011fi T\u00fcketmeden Sonsuz Ak\u0131\u015flar<\/h3>\n<p>Jenerat\u00f6rlerin tembel de\u011ferlendirme \u00f6zelli\u011fi sayesinde, teorik olarak sonsuz uzunlukta seriler olu\u015fturabiliriz. Bu t\u00fcr seriler, belirli bir ko\u015ful kar\u015f\u0131lanana kadar s\u00fcrekli veri \u00fcreten ak\u0131\u015flar i\u00e7in idealdir. \u00d6rne\u011fin, Fibonacci serisi gibi matematiksel serileri belle\u011fi \u015fi\u015firmeden \u00fcretebiliriz:<\/p>\n<pre><code>\ndef fibonacci_uret():\n    a, b = 0, 1\n    while True: # Sonsuz d\u00f6ng\u00fc\n        yield a\n        a, b = b, a + b\n\n# Sonsuz Fibonacci serisinden ilk 10 eleman\u0131 alal\u0131m\nfib_jenerator = fibonacci_uret()\nprint(\"Sonsuz Fibonacci serisinden ilk 10 eleman:\")\nfor _ in range(10):\n    print(next(fib_jenerator))\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>fibonacci_uret<\/code> fonksiyonu <code>while True<\/code> d\u00f6ng\u00fcs\u00fcyle sonsuza kadar de\u011fer \u00fcretebilir. Bellekte sadece <code>a<\/code> ve <code>b<\/code> de\u011fi\u015fkenleri yer kaplar, t\u00fcm seri asla belle\u011fe y\u00fcklenmez. Bu, a\u011fdan veya bir sens\u00f6rden s\u00fcrekli veri ak\u0131\u015f\u0131 geldi\u011finde \u00e7ok benzer bir mant\u0131kla kullan\u0131labilir.<\/p>\n<h3><code>send()<\/code> Metodu: Jenerat\u00f6re Geri Bildirim G\u00f6nderme<\/h3>\n<p>Jenerat\u00f6rler, sadece de\u011fer \u00fcretmekle kalmaz, ayn\u0131 zamanda <code>send()<\/code> metodu arac\u0131l\u0131\u011f\u0131yla d\u0131\u015far\u0131dan de\u011fer de alabilirler. Bu, jenerat\u00f6rler ile d\u0131\u015f kod aras\u0131nda \u00e7ift y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131 olu\u015fturur ve onlar\u0131 \"coroutines\" olarak bilinen yap\u0131lar\u0131n temelini olu\u015fturur.<\/p>\n<pre><code>\ndef islem_jeneratoru():\n    toplam = 0\n    while True:\n        girilen_deger = yield toplam # Hem de\u011fer \u00fcretir hem de de\u011fer bekler\n        if girilen_deger is None:\n            break\n        toplam += girilen_deger\n    yield \"\u0130\u015flem Sonland\u0131\" # Jenerat\u00f6r sonland\u0131\u011f\u0131nda bir final de\u011feri d\u00f6nd\u00fcr\u00fcr\n\nisleyici = islem_jeneratoru()\nprint(\"\u0130lk de\u011fer:\", next(isleyici)) # Jenerat\u00f6r\u00fc ba\u015flat\u0131r, ilk yield'e ula\u015f\u0131r (toplam=0)\n\nprint(\"\u0130\u015fleyiciye 5 g\u00f6nderildi:\", isleyici.send(5)) # toplam += 5 oldu, yeni toplam \u00fcretildi\nprint(\"\u0130\u015fleyiciye 10 g\u00f6nderildi:\", isleyici.send(10)) # toplam += 10 oldu, yeni toplam \u00fcretildi\nprint(\"\u0130\u015fleyiciye 3 g\u00f6nderildi:\", isleyici.send(3)) # toplam += 3 oldu, yeni toplam \u00fcretildi\n\ntry:\n    print(isleyici.send(None)) # None g\u00f6ndererek d\u00f6ng\u00fcy\u00fc k\u0131rar\u0131z, final de\u011feri beklenir.\nexcept StopIteration as e:\n    print(\"Jenerat\u00f6rden d\u00f6nen son mesaj:\", e.value) # \u0130\u015flem Sonland\u0131\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>send()<\/code> metodu ile jenerat\u00f6r\u00fcn i\u00e7ine de\u011ferler g\u00f6ndererek onun durumunu etkileyebiliyor ve d\u0131\u015far\u0131dan gelen girdilere g\u00f6re farkl\u0131 sonu\u00e7lar \u00fcretmesini sa\u011flayabiliyoruz. Bu ileri d\u00fczey kullan\u0131m, \u00f6zellikle asenkron programlama ve olay tabanl\u0131 sistemlerde b\u00fcy\u00fck esneklik sa\u011flar.<\/p>\n<h3><code>yield from<\/code>: Jenerat\u00f6rleri Birle\u015ftirme ve Yetkilendirme<\/h3>\n<p>Python 3.3 ile tan\u0131t\u0131lan <code>yield from<\/code> ifadesi, bir jenerat\u00f6r\u00fcn ba\u015fka bir jenerat\u00f6re (veya herhangi bir iterable'a) yetki vermesini, yani ondan gelen t\u00fcm de\u011ferleri do\u011frudan \u00e7a\u011f\u0131rana iletmesini sa\u011flar. Bu, jenerat\u00f6rleri mod\u00fcler bir \u015fekilde birle\u015ftirmek ve karma\u015f\u0131k jenerat\u00f6r zincirleri olu\u015fturmak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code>\ndef alt_jenerator(start, end):\n    for i in range(start, end):\n        yield i\n\ndef ana_jenerator():\n    yield from alt_jenerator(1, 4) # 1, 2, 3 \u00fcretilir\n    yield from alt_jenerator(5, 8) # 5, 6, 7 \u00fcretilir\n    yield 0 # Ekstra bir de\u011fer\n\nprint(\"<code>yield from<\/code> ile birle\u015ftirilmi\u015f jenerat\u00f6r:\")\nfor deger in ana_jenerator():\n    print(deger)\n<\/pre>\n<p><\/code><\/p>\n<p><code>yield from<\/code> sayesinde, <code>ana_jenerator<\/code> kendi i\u00e7inde d\u00f6ng\u00fc kurup <code>alt_jenerator<\/code>'den tek tek de\u011fer almak yerine, t\u00fcm yetkiyi ona devrediyor. Bu da kodu daha temiz, daha k\u0131sa ve daha anla\u015f\u0131l\u0131r hale getiriyor. Bu \u00f6zellik, veri i\u015flem hatlar\u0131 (data pipelines) olu\u015ftururken veya jenerat\u00f6rleri daha soyut ve yeniden kullan\u0131labilir bir \u015fekilde tasarlarken \u00e7ok faydal\u0131d\u0131r. \u0130leri d\u00fczey jenerat\u00f6r teknikleri, Python'da y\u00fcksek performansl\u0131 ve karma\u015f\u0131k veri ak\u0131\u015f y\u00f6netimi i\u00e7in vazge\u00e7ilmez ara\u00e7lard\u0131r. Bu yetenekleri kullanarak, daha \u00f6nce zorlay\u0131c\u0131 olan bir\u00e7ok problemi \u015f\u0131k ve verimli bir \u015fekilde \u00e7\u00f6zebilirsiniz. \u015eimdi, bu teorik bilgileri ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l uygulayabilece\u011fimize bakal\u0131m.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: \u0130terasyon Protokol\u00fcyle B\u00fcy\u00fck Problemleri Nas\u0131l \u00c7\u00f6zeriz?<\/h2>\n<p>Python'\u0131n iterasyon protokol\u00fcn\u00fc anlamak, yaln\u0131zca teorik bir bilgi y\u0131\u011f\u0131n\u0131 de\u011fildir; ayn\u0131 zamanda g\u00fcnl\u00fck programlama g\u00f6revlerimizde kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z pek \u00e7ok pratik sorunu \u00e7\u00f6zmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 setidir. \u0130\u015fte iterables, iterators ve generators'\u0131n ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131labilece\u011fine dair iki vaka analizi.<\/p>\n<h3>Vaka Analizi 1: B\u00fcy\u00fck Log Dosyalar\u0131n\u0131 Bellek Dostu Bir \u015eekilde \u0130\u015fleme<\/h3>\n<p>Bir web sunucusu veya bir mikroservis uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu uygulamalar genellikle gigabaytlarca boyutlara ula\u015fabilen log dosyalar\u0131 \u00fcretirler. E\u011fer bu dosyalar\u0131 analiz etmek i\u00e7in hepsini tek seferde belle\u011fe y\u00fcklemeye \u00e7al\u0131\u015f\u0131rsan\u0131z, uygulaman\u0131z\u0131n belle\u011fi h\u0131zla t\u00fckenir ve \u00e7\u00f6ker. \u0130\u015fte burada jenerat\u00f6rler devreye girer.<\/p>\n<p><strong>Problem:<\/strong> 10GB boyutunda bir <code>access.log<\/code> dosyas\u0131ndaki t\u00fcm \"HTTP 500\" hata kodlar\u0131n\u0131 bulup saymak.<\/p>\n<p><strong>Geleneksel (K\u00f6t\u00fc) Yakla\u015f\u0131m:<\/strong><\/p>\n<pre><code>\n# Bu kod \u00e7al\u0131\u015ft\u0131r\u0131lmamal\u0131d\u0131r! B\u00fcy\u00fck dosyalar i\u00e7in bellek hatas\u0131na neden olur.\n# with open('access.log', 'r') as f:\n#     tum_loglar = f.readlines() # T\u00fcm dosyay\u0131 belle\u011fe y\u00fckler\n#\n# hata_sayisi = 0\n# for satir in tum_loglar:\n#     if \"HTTP 500\" in satir:\n#         hata_sayisi += 1\n# print(f\"HTTP 500 hata say\u0131s\u0131: {hata_sayisi}\")\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, k\u00fc\u00e7\u00fck dosyalar i\u00e7in sorun olmasa da, b\u00fcy\u00fck dosyalar i\u00e7in bir felaket senaryosudur.<\/p>\n<p><strong>Jenerat\u00f6r Tabanl\u0131 (Verimli) Yakla\u015f\u0131m:<\/strong><\/p>\n<pre><code>\ndef log_dosyasi_satirlari(dosya_yolu):\n    with open(dosya_yolu, 'r', encoding='utf-8', errors='ignore') as f:\n        for satir in f: # 'for' d\u00f6ng\u00fcs\u00fc burada dosya nesnesini bir iterat\u00f6r gibi kullan\u0131r\n            yield satir.strip() # Her seferinde bir sat\u0131r \u00fcretir\n\n# \u00d6rnek bir log dosyas\u0131 olu\u015ftural\u0131m (ger\u00e7ekte b\u00fcy\u00fck bir dosya oldu\u011funu varsay\u0131n)\n# '\u00f6rnek_log.log' ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine \u015fu sat\u0131rlar\u0131 ekleyin:\n# 2023-10-27 10:00:01 GET \/api\/data 200\n# 2023-10-27 10:00:05 POST \/api\/submit 500 Internal Server Error\n# 2023-10-27 10:00:10 GET \/index.html 200\n# 2023-10-27 10:00:15 PUT \/api\/update 500 Database Error\n# 2023-10-27 10:00:20 GET \/admin 401 Unauthorized\n\nlog_dosyasi = \"ornek_log.log\" # Bu dosyan\u0131n mevcut oldu\u011funu varsayal\u0131m\nhata_sayisi = 0\n\nfor satir in log_dosyasi_satirlari(log_dosyasi):\n    if \"HTTP 500\" in satir or \"Internal Server Error\" in satir:\n        hata_sayisi += 1\n        print(f\"Hata Tespit Edildi: {satir}\")\n\nprint(f\"\\nToplam HTTP 500 hata say\u0131s\u0131: {hata_sayisi}\")\n<\/pre>\n<p><\/code><\/p>\n<p>Bu jenerat\u00f6r tabanl\u0131 yakla\u015f\u0131m, <code>log_dosyasi_satirlari<\/code> jenerat\u00f6r fonksiyonu sayesinde her seferinde sadece bir sat\u0131r\u0131 belle\u011fe al\u0131r. Bu sayede, dosya ne kadar b\u00fcy\u00fck olursa olsun, uygulaman\u0131z\u0131n bellek t\u00fcketimi sabit kal\u0131r. Bu, b\u00fcy\u00fck veri i\u015fleme senaryolar\u0131nda hayati bir optimizasyondur.<\/p>\n<h3>Vaka Analizi 2: Web Scraping veya API Yan\u0131tlar\u0131n\u0131 Ak\u0131\u015fl\u0131 \u0130\u015fleme<\/h3>\n<p>Bir web sitesinden veri kaz\u0131d\u0131\u011f\u0131m\u0131z\u0131 (web scraping) veya bir API'den s\u00fcrekli veri ak\u0131\u015f\u0131 ald\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcnelim. Genellikle, bu veriler JSON format\u0131nda gelir ve binlerce, hatta milyonlarca kayd\u0131 i\u00e7erebilir. T\u00fcm JSON yan\u0131t\u0131n\u0131 belle\u011fe y\u00fcklemek yerine, jenerat\u00f6rler kullanarak her bir kayd\u0131 an\u0131nda i\u015fleyebiliriz.<\/p>\n<p><strong>Problem:<\/strong> Bir API'den gelen \u00e7ok say\u0131da JSON nesnesini (\u00f6rne\u011fin, kullan\u0131c\u0131 kay\u0131tlar\u0131) tek tek i\u015flemek.<\/p>\n<p><strong>Jenerat\u00f6r Tabanl\u0131 Yakla\u015f\u0131m:<\/strong><\/p>\n<pre><code>\nimport json\n\ndef api_yanitlarini_isleme_jeneratoru(api_data_stream):\n    # api_data_stream, \u00f6rne\u011fin bir requests yan\u0131t\u0131n\u0131n i\u00e7eri\u011fi olabilir\n    # veya mock edilmi\u015f bir JSON string listesi\n    for item_str in api_data_stream:\n        try:\n            yield json.loads(item_str) # Her seferinde bir JSON nesnesi ayr\u0131\u015ft\u0131r\u0131p \u00fcretir\n        except json.JSONDecodeError:\n            print(f\"Hatal\u0131 JSON format\u0131 atland\u0131: {item_str}\")\n            continue\n\n# Mock API yan\u0131t\u0131 (ger\u00e7ekte bir requests.get().iter_lines() gibi bir \u015fey olurdu)\nmock_api_stream = [\n    '{\"id\": 1, \"name\": \"Alice\"}',\n    '{\"id\": 2, \"name\": \"Bob\"}',\n    '{\"id\": 3, \"name\": \"Charlie\"}',\n    '{\"id\": 4, \"name\": \"David\"}'\n]\n\n# Jenerat\u00f6r\u00fc kullanarak verileri i\u015fleme\nkullanici_sayisi = 0\nfor kullanici_nesnesi in api_yanitlarini_isleme_jeneratoru(mock_api_stream):\n    print(f\"Kullan\u0131c\u0131 ID: {kullanici_nesnesi['id']}, Ad\u0131: {kullanici_nesnesi['name']}\")\n    kullanici_sayisi += 1\n    # Burada kullan\u0131c\u0131 nesnesiyle ba\u015fka i\u015flemler yap\u0131labilir, \u00f6rne\u011fin veritaban\u0131na kaydetme\n\nprint(f\"\\nToplam i\u015flenen kullan\u0131c\u0131 say\u0131s\u0131: {kullanici_sayisi}\")\n<\/pre>\n<p><\/code><\/p>\n<p>Bu senaryoda, <code>api_yanitlarini_isleme_jeneratoru<\/code> fonksiyonu, her bir JSON string'ini bir jenerat\u00f6r arac\u0131l\u0131\u011f\u0131yla ayr\u0131\u015ft\u0131r\u0131r ve bir Python s\u00f6zl\u00fc\u011f\u00fc olarak d\u00f6nd\u00fcr\u00fcr. Bu, t\u00fcm veri ak\u0131\u015f\u0131n\u0131 belle\u011fe y\u00fcklemeye gerek kalmadan, her bir kayd\u0131 an\u0131nda i\u015flememizi sa\u011flar. Bu y\u00f6ntem, \u00f6zellikle mobil uygulamalar i\u00e7in veri sa\u011flayan backend servisleri geli\u015ftirirken veya b\u00fcy\u00fck veri kaynaklar\u0131ndan beslenen analitik sistemler tasarlarken kritik \u00f6neme sahiptir. Verilerin mobil cihazlara h\u0131zl\u0131 ve verimli bir \u015fekilde aktar\u0131lmas\u0131 ve sunulmas\u0131 i\u00e7in backend'deki bu t\u00fcr optimizasyonlar temel te\u015fkil eder. <\/p>\n<p>Bu t\u00fcr servislerden gelen veriler, kullan\u0131c\u0131 aray\u00fczlerinde g\u00f6rselle\u015ftirilirken, farkl\u0131 cihaz boyutlar\u0131na (mobil, tablet, masa\u00fcst\u00fc) uygun \u015fekilde sunulmas\u0131 i\u00e7in HTML ve CSS'te duyarl\u0131 tasar\u0131m (responsive design) ilkelerinin kullan\u0131lmas\u0131 kritik \u00f6neme sahiptir. \u00d6rne\u011fin, CSS'te medya sorgular\u0131 (media queries) ile ekran boyutuna g\u00f6re stil ayarlamalar\u0131 yap\u0131labilir:<\/p>\n<pre><code>\n@media (max-width: 768px) {\n    \/* K\u00fc\u00e7\u00fck ekranlar i\u00e7in stil kurallar\u0131 *\/\n    .container {\n        width: 90%;\n        padding: 10px;\n    }\n    .card {\n        flex-direction: column;\n    }\n}\n\n@media (min-width: 769px) and (max-width: 1024px) {\n    \/* Orta ekranlar i\u00e7in stil kurallar\u0131 *\/\n    .container {\n        width: 75%;\n        margin: 0 auto;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, Python'\u0131n iterasyon protokol\u00fcn\u00fcn sadece backend performans\u0131n\u0131 de\u011fil, ayn\u0131 zamanda son kullan\u0131c\u0131 deneyimini de dolayl\u0131 olarak nas\u0131l etkileyebilece\u011fini g\u00f6steren bir \u00f6rnektir. Verimli backend, h\u0131zl\u0131 y\u00fcklenen ve duyarl\u0131 frontend'lere zemin haz\u0131rlar. \u0130terasyon protokol\u00fc, Python geli\u015ftiricilerinin daha \u00f6l\u00e7eklenebilir, daha verimli ve daha g\u00fc\u00e7l\u00fc uygulamalar olu\u015fturmalar\u0131n\u0131 sa\u011flayan temel bir g\u00fc\u00e7 merkezidir.<\/p>\n<h2>Sonu\u00e7: Python \u0130terasyonunda Ustal\u0131k Neden Anahtar ve Gelecekte Ne Bekliyor?<\/h2>\n<p>Bu makale boyunca, Python'\u0131n iterasyon protokol\u00fcn\u00fcn temel ta\u015flar\u0131 olan iterable'lar\u0131, iterat\u00f6rleri ve jenerat\u00f6rleri derinlemesine inceledik. G\u00f6rd\u00fck ki, bu kavramlar sadece Python'daki <code>for<\/code> d\u00f6ng\u00fclerinin perde arkas\u0131n\u0131 ayd\u0131nlatmakla kalm\u0131yor, ayn\u0131 zamanda bellek verimlili\u011fi, performans ve kod okunabilirli\u011fi a\u00e7\u0131s\u0131ndan da b\u00fcy\u00fck faydalar sa\u011fl\u0131yor. \u0130terable'lar, \u00fczerinde gezinebildi\u011fimiz koleksiyonlar\u0131 tan\u0131mlarken, iterat\u00f6rler bu gezinti s\u00fcrecini ad\u0131m ad\u0131m y\u00f6neten i\u015faret\u00e7iler g\u00f6revi g\u00f6r\u00fcr. Jenerat\u00f6rler ise, <code>yield<\/code> anahtar kelimesiyle bu iterat\u00f6rleri \u00e7ok daha kolay ve Pythonik bir \u015fekilde olu\u015fturmam\u0131z\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir soyutlama katman\u0131 sunar. \u00d6zellikle b\u00fcy\u00fck veri setleriyle veya sonsuz veri ak\u0131\u015flar\u0131yla \u00e7al\u0131\u015f\u0131rken, jenerat\u00f6rlerin \"tembel de\u011ferlendirme\" yetene\u011fi sayesinde, belle\u011fi \u015fi\u015firmeden verileri i\u015fleyebiliyor ve uygulamalar\u0131m\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini art\u0131rabiliyoruz.<\/p>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, log dosyalar\u0131n\u0131 i\u015flemekten web scraping veya API yan\u0131tlar\u0131n\u0131 ak\u0131\u015fl\u0131 bir \u015fekilde analiz etmeye kadar pek \u00e7ok alanda, iterasyon protokol\u00fc bilgisi bize somut avantajlar sa\u011flamaktad\u0131r. Bu ara\u00e7lar\u0131 ustaca kullanmak, sadece daha h\u0131zl\u0131 ve daha az bellek t\u00fcketen kod yazmam\u0131za olanak tan\u0131makla kalmaz, ayn\u0131 zamanda daha mod\u00fcler, esnek ve Pythonik \u00e7\u00f6z\u00fcmler \u00fcretmemizi de te\u015fvik eder. Python'\u0131n s\u00fcrekli geli\u015fen ekosisteminde, asenkron programlama ve veri bilimi gibi alanlarda jenerat\u00f6rlerin ve iterat\u00f6rlerin \u00f6nemi giderek artmaktad\u0131r. Coroutines (<code>async\/await<\/code>) ve veri ak\u0131\u015f\u0131 k\u00fct\u00fcphaneleri (\u00f6rne\u011fin <code>dask<\/code>, <code>pandas<\/code>'\u0131n baz\u0131 fonksiyonlar\u0131) gibi modern Python yap\u0131lar\u0131, temelde bu iterasyon protokol\u00fc \u00fczerine in\u015fa edilmi\u015ftir. Bu nedenle, bu temel mekanizmalar\u0131 kavramak, sadece bug\u00fcnk\u00fc de\u011fil, gelecekteki Python projelerinizde de sizi bir ad\u0131m \u00f6ne ta\u015f\u0131yacakt\u0131r.<\/p>\n<p>Unutmay\u0131n, iyi bir Python geli\u015ftiricisi olmak, dilin sundu\u011fu ara\u00e7lar\u0131 sadece kullanmakla kalmaz, ayn\u0131 zamanda onlar\u0131n perde arkas\u0131ndaki \u00e7al\u0131\u015fma prensiplerini de derinlemesine anlamay\u0131 gerektirir. Iterables, Iterators ve Generators, bu anlay\u0131\u015f\u0131n kilit par\u00e7alar\u0131d\u0131r. Bu bilgilerle donanarak, Python'da kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131z her t\u00fcrl\u00fc veri i\u015fleme zorlu\u011funa kar\u015f\u0131 daha donan\u0131ml\u0131 ve yarat\u0131c\u0131 \u00e7\u00f6z\u00fcmler \u00fcretebilirsiniz. \u015eimdi, bu yolculukta akl\u0131n\u0131za tak\u0131labilecek baz\u0131 yayg\u0131n sorulara g\u00f6z atal\u0131m.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>1. Bir iterable ile bir iterat\u00f6r aras\u0131ndaki temel fark nedir?<\/dt>\n<dd>Bir <strong>iterable<\/strong>, \u00fczerinde <code>for<\/code> d\u00f6ng\u00fcs\u00fc yapabilece\u011finiz herhangi bir nesnedir (\u00f6rne\u011fin, bir liste veya string). Kendi <code>__iter__<\/code> metoduna sahiptir ve bu metod \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bir <strong>iterat\u00f6r<\/strong> nesnesi d\u00f6nd\u00fcr\u00fcr. Bir <strong>iterat\u00f6r<\/strong> ise, <code>__iter__<\/code> ve <code>__next__<\/code> metotlar\u0131na sahip, belirli bir s\u0131radaki bir sonraki eleman\u0131 veren ve durumu kendi i\u00e7inde tutan bir nesnedir. Iterable, \"nas\u0131l gezinece\u011fimi biliyorum\" der; iterat\u00f6r ise \"\u015fimdi geziniyorum\" der.<\/dd>\n<dt>2. Neden kendi iterat\u00f6r s\u0131n\u0131f\u0131m\u0131 yazmak yerine jenerat\u00f6r fonksiyonlar\u0131 kullanmal\u0131y\u0131m?<\/dt>\n<dd>Jenerat\u00f6r fonksiyonlar\u0131, iterat\u00f6r protokol\u00fcn\u00fc el ile <code>__iter__<\/code> ve <code>__next__<\/code> metotlar\u0131n\u0131 uygulayarak yazmaktan \u00e7ok daha k\u0131sa, okunabilir ve basittir. Python, <code>yield<\/code> anahtar kelimesiyle bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlar ve arka planda sizin i\u00e7in otomatik olarak bir iterat\u00f6r nesnesi olu\u015fturur. Bu, geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/dd>\n<dt>3. Jenerat\u00f6r ifadeleri ile list comprehension aras\u0131ndaki fark nedir?<\/dt>\n<dd>Her ikisi de Python'da koleksiyon olu\u015fturmak i\u00e7in kullan\u0131l\u0131r, ancak temel fark bellek kullan\u0131m\u0131 ve de\u011ferlendirme zaman\u0131d\u0131r. Bir <strong>list comprehension<\/strong> (<code>[x*x for x in range(10)]<\/code>) t\u00fcm elemanlar\u0131 \u00f6nceden hesaplar ve belle\u011fe y\u00fckler, bu da b\u00fcy\u00fck koleksiyonlar i\u00e7in bellek sorunlar\u0131na yol a\u00e7abilir. Bir <strong>jenerat\u00f6r ifadesi<\/strong> (<code>(x*x for x in range(10))<\/code>) ise bir jenerat\u00f6r nesnesi d\u00f6nd\u00fcr\u00fcr ve elemanlar\u0131 yaln\u0131zca talep edildi\u011finde (yani <code>next()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda) tek tek \u00fcretir. Bu \"tembel de\u011ferlendirme\" yakla\u015f\u0131m\u0131 sayesinde, jenerat\u00f6r ifadeleri b\u00fcy\u00fck veri setleri i\u00e7in \u00e7ok daha bellek dostudur.<\/dd>\n<dt>4. Jenerat\u00f6rler sonsuz d\u00f6ng\u00fclerle nas\u0131l ba\u015fa \u00e7\u0131kar?<\/dt>\n<dd>Jenerat\u00f6rler, <code>yield<\/code> anahtar kelimesi sayesinde sonsuz d\u00f6ng\u00fclerle (<code>while True<\/code>) bellek sorununa neden olmadan \u00e7al\u0131\u015fabilir. Her <code>yield<\/code> ifadesi, jenerat\u00f6r\u00fcn y\u00fcr\u00fctmesini duraklat\u0131r ve bir de\u011fer d\u00f6nd\u00fcr\u00fcr. Bir sonraki de\u011fer istendi\u011finde, jenerat\u00f6r kald\u0131\u011f\u0131 yerden devam eder. Bu sayede, sonsuz bir serinin tamam\u0131n\u0131 belle\u011fe y\u00fcklemeye gerek kalmadan, sadece ihtiya\u00e7 duyulan k\u0131s\u0131mlar\u0131n\u0131 anl\u0131k olarak \u00fcretebilirsiniz. D\u00f6ng\u00fcy\u00fc d\u0131\u015far\u0131dan <code>break<\/code> ile veya <code>StopIteration<\/code> y\u00fckselterek manuel olarak sonland\u0131rmak gerekir.<\/dd>\n<dt>5. <code>yield from<\/code> ne i\u015fe yarar?<\/dt>\n<dd><code>yield from<\/code> ifadesi, Python 3.3 ile tan\u0131t\u0131ld\u0131 ve bir jenerat\u00f6r\u00fcn ba\u015fka bir jenerat\u00f6re veya herhangi bir iterable'a yetki vermesini sa\u011flar. Yani, mevcut jenerat\u00f6r\u00fcn kendi de\u011ferlerini \u00fcretmek yerine, ba\u015fka bir jenerat\u00f6rden gelen de\u011ferleri do\u011frudan \u00e7a\u011f\u0131ran tarafa iletmesini sa\u011flar. Bu, jenerat\u00f6rleri daha mod\u00fcler bir \u015fekilde birle\u015ftirmek ve karma\u015f\u0131k veri i\u015flem hatlar\u0131n\u0131 daha temiz bir kodla olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Ayn\u0131 zamanda, i\u00e7 i\u00e7e jenerat\u00f6rlerin hata yakalama ve <code>send()<\/code> metotlar\u0131 ile ileti\u015fimini de basitle\u015ftirir.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Python&#8217;\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin.&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-31700","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python&#039;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler<\/title>\n<meta name=\"description\" content=\"Python&#039;\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python&#039;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler\" \/>\n<meta property=\"og:description\" content=\"Python&#039;\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-12T22:01:56+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python&#8217;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler\",\"datePublished\":\"2025-10-12T22:01:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\"},\"wordCount\":3900,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\",\"name\":\"Python'da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-12T22:01:56+00:00\",\"description\":\"Python'\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python&#8217;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python'da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler","description":"Python'\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/","og_locale":"tr_TR","og_type":"article","og_title":"Python'da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler","og_description":"Python'\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?","og_url":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-12T22:01:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python&#8217;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler","datePublished":"2025-10-12T22:01:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/"},"wordCount":3900,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/","url":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/","name":"Python'da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-12T22:01:56+00:00","description":"Python'\u0131n d\u00f6ng\u00fc mekanizmalar\u0131n\u0131 derinlemesine \u00f6\u011frenin. \u0130terable, iterat\u00f6r ve jenerat\u00f6rlerin g\u00fcc\u00fcn\u00fc ke\u015ffederek kodunuzu daha verimli ve okunabilir hale getirin. Kapsaml\u0131 rehberimizle bellek dostu \u00e7\u00f6z\u00fcmler \u00fcretin ve karma\u015f\u0131k veri ak\u0131\u015flar\u0131n\u0131 kolayca y\u00f6netin. Haz\u0131r m\u0131s\u0131n\u0131z?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/pythonda-iterasyon-protokolu-iterable-iterator-ve-jeneratorler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python&#8217;da \u0130terasyon Protokol\u00fc: \u0130terable, \u0130terat\u00f6r ve Jenerat\u00f6rler"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31700"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31700\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}