Birden Fazla Döngü Kullanımı

Birden Fazla Döngü Kullanımı

Birden Fazla Döngü Kullanımı, programlama dünyasında yaygın olarak kullanılan bir tekniktir Bu teknik sayesinde kodların daha etkili ve hızlı çalışması sağlanır Kendi projelerinizde de birden fazla döngü kullanarak daha verimli bir kod yazabilirsiniz Detaylı bilgi için yazımızı okuyun

Birden Fazla Döngü Kullanımı

Birden fazla döngü, programlama dillerinde sıklıkla kullanılan bir tekniktir. Bu teknik, bir döngü içinde başka bir döngüyü veya birden fazla döngüyü kullanarak belirli işlemleri gerçekleştirmeyi sağlar.

Birden fazla döngü kullanmanın birçok avantajı vardır. İlk olarak, kodunuzun daha düzenli, kolay okunur ve anlaşılır hale gelmesini sağlar. Ayrıca, birden fazla döngü kullanarak karmaşık işlemleri daha hızlı ve verimli bir şekilde gerçekleştirebilirsiniz. Bunun yanı sıra, birden fazla döngü kullanarak daha fazla kontrol ve esneklik elde edebilirsiniz.

Birden fazla döngü kullanmanın bazı dezavantajları da vardır. İç içe geçmiş döngüler birbiriyle çelişebilir veya yanlışlıkla sonsuz döngüler oluşturulabilir. Böyle durumlarda, programınız donabilir veya hata verebilir. Bu nedenle, birden fazla döngü kullanırken dikkatli olmak ve kodunuzu iyi test etmek gerekmektedir.


For Döngüsü ve While Döngüsü

Döngüler, programlamada tekrar eden işlemleri kolaylaştıran yapılar olarak kullanılır. Python'da en sık kullanılan döngü yapılarından ikisi for ve while döngüleridir.

For Döngüsü

For döngüsü, belirli bir listenin veya demetin elemanlarını, tek tek dolaşarak işlem yapmak için kullanılır. For döngüsü while döngüsünden farklı olarak bir listede belirli bir sayıda işlem yapmak için kullanılır. Python'daki for döngüsü, C ve Java'daki for döngüsünden farklıdır. Çünkü Python'daki for döngüsü, bir sayaç ve bir diziye ihtiyaç duymaz.

Range() Fonksiyonu

Range() fonksiyonu, belirli bir aralığın elemanlarını döndürür. For döngüsünde özellikle kullanılır. Örneğin;

Kod Çıktı
for i in range(5):
  print(i)
0
1
2
3
4

Enumerate() Fonksiyonu

Enumerate() fonksiyonu, bir dizi veya listedeki elemanların sırasını ve değerlerini döndürür. For döngüsünde kullanarak, elemanların sırasını ve değerlerini kolayca işleyebiliriz. Örneğin;

Kod Çıktı
adlar = ["Ali", "Veli", "Ayşe"]
for i, isim in enumerate(adlar):
  print(i, isim)
0 Ali
1 Veli
2 Ayşe

While Döngüsü

While döngüsü, belirli bir koşul sağlandığı sürece işlemlerin devam etmesi için kullanılır. While döngüsü for döngüsünden farklı olarak, elemanların sayısını belirlemeden istediğimiz koşul sağlandığı sürece işlemler yapar. For döngüsü gibi listenin elemanlarını tek tek işlemez.

Break ve Continue İfadelerinin Kullanımı

While döngüsünde break ifadesi, döngünün doğru çalıştığı koşulu bozarak çalışmayı sonlandırır. Continue ifadesi ise, koşul doğru olduğunda, hissettirmediği bir elemanı atlamak için kullanılır. Örneğin;

Kod Çıktı
x = 0
while x < 10:
  if x == 5:
    break
  print(x)
  x += 1
0
1
2
3
4

While True Döngüsü

While True döngüsü, while döngüsünden farklı olarak koşulu belirlemeden devamlı olarak döngü yapar. Burada, döngü içinde break ifadesiyle döngü bozulabilir. Örneğin;

Kod Çıktı
while True:
  cikti = input("Lütfen bir sayı girin veya 'q' tuşuna basarak çıkın:")
  if cikti == "q":
    break
  print("Girilen sayı:", cikti)
Lütfen bir sayı girin veya 'q' tuşuna basarak çıkın: 10
Girilen sayı: 10
Lütfen bir sayı girin veya 'q' tuşuna basarak çıkın: q

For Döngüsü

For döngüsü, programlama dillerinde en sık kullanılan döngü yapısıdır. For döngüsü, bir bloğun belirli sayıda tekrarlanmasını sağlar. Döngü için belirlenen sayı kadar tekrar yapılır ve döngü sonlanır. For döngüsü, özellikle belirli bir aralıkta işlem yapmak istediğimizde kullanılır.For döngüsü, genellikle bir sayaç değişkeniyle birlikte kullanılır. For döngüsü içinde yapılacak işlemler, belirli koşullar altında tekrar edilir. For döngüsü, range() fonksiyonu ile birlikte de kullanılır. Range() fonksiyonu, belirtilen aralıkta sayısal bir liste oluşturur. Bu sayısal liste, for döngüsündeki tekrar sayısını belirlemek için kullanılır.Ayrıca, for döngüsü içinde enumerate() fonksiyonu da kullanılabilir. Enumerate() fonksiyonu, bir dizinin değerlerini ve dizinin sayısal karşılığını içeren bir çift oluşturur. Bu sayede for döngüsü içinde hem dizinin değerleri hem de indeksleri kullanılabilir.Aşağıdaki örnekte, for döngüsü kullanılarak bir liste içindeki sayıların toplamı hesaplanmaktadır:```html

Sayılar Toplam
1
2
3
4
5

Python Kodu:

        toplam = 0        sayilar = [1, 2, 3, 4, 5]        for sayi in sayilar:            toplam += sayi            print(sayi)        print("Toplam:", toplam)    

Yukarıdaki örnekte, for döngüsü kullanılarak bir sayılar listesi içindeki tüm sayıların toplamı hesaplanmaktadır. For döngüsü, sayilar listesindeki her sayıyı tek tek alır ve toplam değişkenine ekler. Daha sonra toplam değişkeni ekrana yazdırılarak, sayıların toplamı elde edilir.

Range() Fonksiyonu

Range() fonksiyonu, döngülerin birçok kez kullanımında işlerimizi kolaylaştıran bir fonksiyondur. Bu fonksiyon, belirtilen başlangıç, bitiş ve adım özellikleri ile birlikte aralık oluşturarak for döngüsü içinde kullanılır.

Örnek olarak, 1'den 10'a kadar olan sayıları ekrana yazdırmak istediğimizi düşünelim. Bunun için aşağıdaki kodu kullanabiliriz:

for i in range(1, 11):   print(i)

Bu kodda, range(1, 11) fonksiyonu başlangıç değeri olarak 1'i, bitiş değeri olarak da 11'i belirtir. Ancak, bu aralıkta 11 sayısı dahil edilmez. Son olarak, adım değeri olarak varsayılan olarak 1 kullanılır.

Range() fonksiyonu aynı zamanda başlangıç veya adım değerleri belirtilmezse, varsayılan değerler olarak sırasıyla 0 ve 1'i kullanır. Ayrıca, negatif adım değerleri de belirtilerek aralıklar geriye doğru da oluşturulabilir.

for i in range(10, 0, -1):   print(i)

Yukarıdaki kodda range() fonksiyonu, başlangıç değeri olarak 10'u, bitiş değeri olarak 0'ı ve adım değeri olarak da -1'i kullanarak 10'dan başlayarak 1'e kadar olan sayıları geriye doğru yazdıracaktır.

Range() fonksiyonu, kullanımı kolay ve işlevsel bir yapıya sahiptir. Özellikle belirli bir aralıktaki sayıları işleme sokarken büyük kolaylık sağlar.


Enumerate() Fonksiyonu

Python'da for döngüsü, bir veri kümesindeki tüm öğeleri dolaşmak için sıradan bir tekniktir. Ancak, sadece öğeleri değil, aynı zamanda bir listedeki öğenin sırasını da görmemiz gerektiğinde, enumerate() fonksiyonu kullanılabilir.

Enumerate() fonksiyonu, bir dizi veya liste gibi indekslenmiş bir veri kümesindeki öğelerin hem değerlerini hem de indekslerini getirir. Böylece, hem öğe hem de oyuncunun indeksi birlikte döndürülür.

Kod: Çıktı:
oyuncular = ["LeBron James", "Stephen Curry", "Kevin Durant", "Kawhi Leonard"] for i, oyuncu in enumerate(oyuncular):    print(i, oyuncu)
0 LeBron James1 Stephen Curry2 Kevin Durant3 Kawhi Leonard

Yukarıdaki örnekte, enumerate() fonksiyonu, oyuncu listesindeki dört oyuncunun her birinin indeksini ve adını getirdi. Döngü sırasında her iterasyonda, enumerate() fonksiyonu, indeksi (i) ve aynı indeksteki oyuncuyu getirir.

Enumerate() fonksiyonu, ayrıca bir başlangıç değeri belirleyerek kullanılabilir. Bu, indeksleri saymaya başladığımız sayıdır.

Kod: Çıktı:
oyuncular = ["LeBron James", "Stephen Curry", "Kevin Durant", "Kawhi Leonard"] for i, oyuncu in enumerate(oyuncular, start=1):    print(i, oyuncu)
1 LeBron James2 Stephen Curry3 Kevin Durant4 Kawhi Leonard

Yukarıdaki örnekte, enumerate() fonksiyonu, indeksleri sıfırdan değil, 1'den başlatır. Böylece, her iterasyonda 1'den başlayarak indeks numarasını belirler.

Enumerate() fonksiyonu, for döngüsünde listelerle çalışırken özellikle kullanışlıdır ve programlamayı daha kolay ve hızlı hale getirir.


While Döngüsü

While döngüsü, bir koşul doğru olduğu sürece döngünün içindeki kodları çalıştırmaya devam eder. For döngüsünden farklı olarak, while döngüsü için başlangıç ve bitiş değerleri yoktur. While döngüsü, koşulun doğru ya da yanlış olduğunu kontrol eder ve koşul doğru olduğu sürece döngü devam eder. Eğer koşul yanlış ise döngü sona erer.While döngüsü ile örnek bir kod bloğu yapacak olursak:

i = 1
while i <= 5:
    print("Sayı:", i)
    i += 1

Bu örnekte, while döngüsü koşuluna göre, i değişkeninin 5'ten küçük olduğu sürece döngü devam eder. Döngü başladığında i değeri 1'dir. Döngü her çalıştığında, i değişkeninin değeri 1 arttırılır ve kod bloğu 5 kez çalışır. Sonuç olarak, sayıların 1'den 5'e kadar yazdırıldığı görülebilir.While döngüsü ile birlikte kullanılan break ve continue ifadeleri de for döngüsünde olduğu gibi kullanılabilir. Break ifadesi, döngüyü tamamen sonlandırırken, continue ifadesi, döngü durumunu kontrol ederek döngünün bir sonraki adımına geçilmesini sağlar.Özetle, while döngüsü de for döngüsü gibi önemli bir döngü yapısıdır. Koşula bağlı olarak çalışan while döngüsü, break ve continue ifadeleri ile birlikte kullanılarak programlama işlemlerinde büyük kolaylık sağlar.

Break ve Continue İfadelerinin Kullanımı

Python programlama dili içinde break ve continue ifadeleri, döngülerin içinde kullanılarak belirli koşullar sağlandığında döngüyü durdurmak veya atlamak için kullanılır.

Break ifadesi kullanıldığında, döngünün çalışması durdurulur ve döngü dışına çıkılır. Continue ifadesi kullanıldığında ise o anki işlem atlanarak bir sonraki işlem devam ettirilir.

Örneğin, bir sayı dizisinin içinde belirli bir sayı arıyorsak ve bulduktan sonra döngüyü sonlandırmak istiyorsak, break ifadesini kullanabiliriz:

Kod Çıktı
sayilar = [1, 5, 10, 15, 20]      for sayi in sayilar:    if sayi == 10:        print("Sayı bulundu.")        break    print(sayi)
1       5       Sayı bulundu.

Yukarıdaki örnekte, sayilar dizisinde döngü içinde sayıları tek tek kontrol ediyoruz ve 10 sayısını bulduğumuzda break ifadesi ile döngüyü sonlandırıyoruz. Döngü, 1 ve 5 sayılarını bastırdıktan sonra 10 sayısını bulduğu için işlem sonlandırılır.

Öte yandan, continue ifadesi kullanarak da döngü içinde belirli işlemleri atlayabiliriz. Örneğin, bir sayı dizisindeki çift sayıları yazdırmak istediğimizde:

Kod Çıktı
sayilar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]      for sayi in sayilar:    if sayi % 2 == 1:        continue    print(sayi)
2       4       6       8       10

Bu örnekte, sayilar dizisindeki sayıları kontrol ediyoruz ve eğer sayı çift ise yazdırıyoruz. Eğer sayı tek ise ise continue ifadesi ile o adımda işlemi atlayarak bir sonraki adıma geçiyoruz.

Break ve continue ifadeleri, doğru kullanıldığında döngülerin işleyişini hızlandırmak ve kod bloklarını optimize etmek için faydalı araçlardır.


While True Döngüsü

While True döngüsü, sonsuz bir döngü oluşturmak için kullanılan bir döngü yapısıdır. Bu döngü, her zaman doğru olan bir ifade ile başlatılır ve döngü içinde bir şekilde durdurulması sağlanır. While True döngüsü, biraz risklidir çünkü sonsuz bir döngüye girebilir, ancak doğru şekilde kullanıldığında çok güçlü bir araçtır.

While True döngüsü, kullanıcının koşulun doğru olduğu sürece döngüyü çalıştırmaya devam etmesine olanak tanır. Döngü içindeki işlemler sonunda koşulun yanlış hale gelmesi gerekmektedir. Örneğin, bir oyunun ana menüsünden sonra başlatma seçeneği sunulurken While True döngüsü kullanılabilir. Kullanıcının "başlat" seçeneğini seçtiği sürece, oyun çalışmaya devam eder. Ancak, kullanıcı "çıkış" seçeneğini tıklarsa, do=True olur ve döngü sonlanır.

Bir While True döngüsü oluşturmak için, döngü bloğu içinde bir koşul belirtilmelidir. Bu koşul her zaman doğru olacaktır (True), ancak döngü bloğu içinde bu koşul yanlış hale getirilecektir. Aksi takdirde, döngü sonsuza kadar devam edecektir.

Örnek olarak, ekrana "Merhaba Dünya" yazdırmak için bir While True döngüsü kullanabilirsiniz:

    while True:    print("Merhaba Dünya")    do = input("Devam etmek istiyor musunuz? (E/H)")    if do.lower() != "e":        break    

Bu döngü, "Merhaba Dünya" yazdıracaktır ve kullanıcı her seferinde "Devam etmek istiyor musunuz? (E/H)" sorusunu yanıtlamak zorundadır. Eğer kullanıcı "E" yanıtını verirse, döngü tekrar çalışmaya devam eder. Ancak, kullanıcı "H" yanıtını verirse, döngü sonlanır.

While True döngüsü, bir döngüden çıkmak için kullanılan "break" ifadesi de kullanılabilir. Örneğin, sonsuz bir döngünün içinde kullanıcının bir sayı girmesi istenebilir. Eğer kullanıcı "q" girerse, döngü sonlanır.

    while True:    x = input("Bir sayı girin (çıkmak için q): ")    if x.lower() == 'q':        break    print("Girilen sayı: ", x)    

Bu döngü, kullanıcının "q" girmesi dışında sonsuz bir şekilde çalışır.

Özetle While True Döngüsünün Avantajları While True Döngüsünün Dezavantajları
Avantajları Belirli bir koşulu sağlamak için sonsuz bir döngü oluşturabilir. Sonsuz bir öğeyi işlemeniz gerektiğinde kötü performansa neden olabilir.
Dezavantajları Sonsuz bir döngü oluşturmanın en kolay yolu. Sonsuz bir döngüye girebilir ve yavaş veya kilitlenebilir.

While True döngüsü, belirli durumlarda kullanışlı bir araçtır. Ancak yanlış kullanıldığında, programınızın performansını olumsuz etkileyebilir ve hatta kilitlenmesine neden olabilir. Bu nedenle, döngülerinizi dikkatlice tasarlayın ve sonsuz döngülerden kaçınmaya çalışın.


İç İçe Döngüler

İç içe döngüler, bir döngü içinde başka bir döngünün çalıştırılmasıdır. Bu teknik, özellikle çok katmanlı yapılar üzerinde işlem yaparken oldukça kullanışlıdır. İç içe döngüler, for ve while döngüleri ile gerçekleştirilebilir.

For döngüsü içinde for döngüsü kullanarak, karmaşık bir yapıdaki her bir öğeyle çalışmak mümkündür. İlk döngü, her bir katman veya her bir satır için çalışırken, içteki döngü, her bir satır veya öğeyi detaylandırmak için kullanılabilir. Bu teknik, iki boyutlu listeler veya matrisler üzerinde işlem yapmak için idealdir.

Çalışma Mantığı Kod Örneği
İlk döngü, her bir satırı çağırır ve ikinci döngü içerisinde her bir öğeye ayrı ayrı erişir.
for satır in matris:  for öğe in satır:    işlem yap(öğe)

While döngüsü içinde for döngüsü kullanarak, belirli bir şart sağlandığı sürece döngüyü devam ettirebiliriz. İçteki for döngüsü, bir şart sağlandığında çalışacak ve belirli bir işlemi gerçekleştirecektir. Bu teknik, bir listeyi tarayarak belirli bir öğeyi aramak için kullanılabilir.

Çalışma Mantığı Kod Örneği
Belirli bir şart sağlanana kadar döngüye devam et.
i = 0while i < len(liste):  if liste[i] == aranan_öğe:    print("Eşleşme Bulundu!")    break  i += 1

İç içe döngüler, kodun okunabilirliğini azaltabilir ve performans sorunlarına neden olabilir. Bu nedenle, gereksiz yere iç içe döngüler kullanmaktan kaçınılmalıdır. Ancak uygun kullanıldığında, kodun işlevselliğini artırabilirler.


For Döngüsü İçinde For Döngüsü

For döngülerinin iç içe kullanımı, oldukça yaygın olarak kullanılan bir tekniktir. Bir for döngüsü diğer bir for döngüsünün içinde kullanıldığında, her bir iç döngü, dış döngüdeki her bir öğeyi geçer. Bu yapı, veri analizi ve sayısal işlemler gibi birçok alanda kullanılmaktadır.

Örneğin, bir matrisin her elemanını yazdırmak için iç içe for döngüleri kullanılabilir. İlk for döngüsü, matrisin tüm satırlarını geçer; ikinci for döngüsü, her satırdaki tüm öğeleri geçer.

Aşağıdaki örnekte, bir 3x3 matris oluşturulmuştur ve iç içe for döngüleri kullanılarak her eleman yazdırılmıştır:

matris = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for satır in matris:
  • for eleman in satır:
  • print(eleman)

Bu kod bloğu, aşağıdaki çıktıyı üretir:

123456789

Yukarıdaki örnek, iç içe for döngüleriyle matrislerin işlenmesi için kullanılabilir. Benzer şekilde, herhangi bir for döngüsü içinde başka bir for döngüsü kullanılabilir ve iç döngü, dış döngüdeki her bir öğe üzerinde işlem yapar.

İç içe for döngüleri, çift boyutlu bir veri yapısının her bir elemanının işlenmesi gibi birçok senaryoda kullanılabilir. Bu nedenle, iç içe for döngüleri, Python programlama dilinde oldukça yaygın olarak kullanılan bir tekniktir.


While Döngüsü İçinde For Döngüsü

While döngüsü, belirli bir koşulu karşılayana kadar tekrarlanır. For döngüsü ise listedeki öğeleri veya bir aralıktaki sayıları işlemek için kullanılır. Bu iki döngüyü birleştirmek, daha karmaşık kodlamalar yapmanıza olanak tanır. While döngüsü içinde, for döngüsü kullanarak, listenin tüm elemanlarına erişebilirsiniz.Örneğin, bir restoran menüsünde fiyatları ve isimleri olan bir liste var. While döngüsü kullanarak, menüdeki tüm öğelerin fiyatlarını bir toplama değişkeninde toplamak istiyorsunuz. For döngüsü ise menü listesindeki her öğeyi teker teker kontrol eder ve programın her aşamasında bir öğeye erişir.Aşağıdaki örnekte, menü listesi bir Python listesi olarak tanımlanmıştır. While döngüsü, listenin öğe sayısını hesaplar ve for döngüsü, listenin her öğesini toplama değişkenine ekler.

menu = [['Cheeseburger', 8.99], ['French Fries', 4.99], ['Soda', 1.99], ['Salad', 7.99]]total_price = 0count = 0while count < len(menu):    for item in menu:        price = item[1]        total_price += price        count += 1print('Total price:', total_price)

Yukarıdaki örnekte, while döngüsü menü boyunca bir öğe sayısı hesaplar, for döngüsü ise her ürün için fiyatı toplam değişkenine ekler.While döngüsü içinde for döngüsü kullanmak, kodların daha kolay anlaşılmasını sağlar ve kodlamayı daha etkili hale getirir. Bu döngü kullanarak, birbirine bağlı koşullar arasında geçiş yaparak farklı adımlar gerçekleştirebilir ve daha karmaşık kodlamalar yapabilirsiniz.

Diğer Döngü Yapıları

Diğer döngü yapıları arasında iteratorlar, generatorlar ve rekürsif fonksiyonlar yer almaktadır. Iteratorlar, bir koleksiyonda gezinmek için kullanılan nesnelerdir. Next() fonksiyonu kullanılarak koleksiyon içindeki her elemana erişilir. Generatorlar ise, bir fonksiyon içinde yield ifadesi kullanılarak tanımlanırlar ve her yield ifadesi gördüğünde bir sonraki değeri üretirler. Generatorlar, bellek yönetimi ve verimlilik açısından faydalıdır.

Rekürsif fonksiyonlar, kendilerini çağıran ve belirli bir koşul gerçekleşene kadar tekrar eden fonksiyonlardır. Örneğin, faktöriyel hesaplama fonksiyonu, kendisini sayının bir eksiğiyle çağıran bir rekürsif fonksiyondur. Ancak, rekürsif fonksiyonlar hafıza yönetimi açısından dezavantajlı olabilirler, dolayısıyla doğru kullanılmaları önemlidir.

Ayrıca, while döngüsü ile daha karmaşık döngü yapıları da oluşturulabilir. Örnek olarak, bir sayının asal sayı olup olmadığını kontrol eden bir fonksiyon yazılabilir. Bunun için sayı, kendisinden küçük tüm sayılara bölünerek asal sayı olup olmadığı kontrol edilir.

Sonuç olarak, farklı döngü yapılarının kullanımı ve avantajları vardır. Iteratorlar, generatorlar ve rekürsif fonksiyonlar, daha kompleks yapıların oluşturulmasına olanak sağlar. Ancak, doğru kullanım ve bellek yönetimi açısından dikkatli olmak önemlidir.


Iteratorlar

Iteratorlar, Python dilindeki döngü yapısında önemli bir yer tutar. Bir iterator, bir nesneyi veya bir koleksiyonu eleman eleman gezmek için kullanılır ve elemanların hepsine tek tek erişmek için next() fonksiyonu kullanılır.

Örneğin, bir liste üzerinde gezinmek istediğimizi varsayalım. Bu durumda, bir liste nesnesi üzerinde bir for döngüsü oluşturabiliriz, ancak büyük miktarda bellek kullanır ve zaman alır. Bunun yerine, liste nesnesini iter() fonksiyonu aracılığıyla bir iterator nesnesine dönüştürebiliriz ve next() fonksiyonu aracılığıyla her elemana kolayca erişebiliriz.

Iteratorlar, her elemandan sonra otomatik olarak bir sonraki elemana geçer. Bir elemanı çağırdıktan sonra, next() fonksiyonu sıradaki elemanı almaya hazır hale getirilir. Bir sonraki next() çağrısı, bir sonraki elemana gitmek için kullanılır ve liste tükendiğinde StopIteration hatası oluşur.

Iteratorları kullanarak verimli bir şekilde elemanlar üzerinde gezinebiliriz. Ayrıca, kendi özelleştirilmiş iteratorlarımızı da oluşturabiliriz. Bunun için __iter__() ve __next__() metodlarını kullanabiliriz. __iter__() metodu, bir nesneye iterator özelliği kazandırırken, __next__() metodu, listemizin her bir elemanını sırayla döndürür.

Şimdi, bir örnek üzerinden iteratorların kullanımını daha iyi anlayalım. Aşağıdaki kodda, bir adet listemiz var ve bunu bir iterator haline getiriyoruz. Daha sonra while döngüsü ile her elemanı sırasıyla yazdırıyoruz.

```# Liste oluşturmaliste = [1, 2, 3, 4, 5]

# Liste nesnesini iterator haline getirmeiter_liste = iter(liste)

# Iterator üzerinde gezinmewhile True: try: eleman = next(iter_liste) print(eleman) except StopIteration: break

# Çıktı: 1# 2# 3# 4# 5```

Yukarıdaki örnekte, liste nesnesi iter() fonksiyonuyla iterator haline getirilir ve while döngüsü içinde kullanılır. next() fonksiyonu, her elemana sırayla erişim sağlanır. Son elemana ulaşana kadar bu işlem devam eder.

Iteratorlar, büyük veri kümelerinde bellek tasarrufu sağlayarak işlemleri hızlandırır. Ayrıca, for döngüleri veya diğer döngü türleri kullanmadan da listeler üzerinde gezinmemizi sağlar.


Generatorlar

Generatorlar, diğer döngü yapılarına alternatif olarak kullanılabilecek bir döngü yapısıdır. Generator fonksiyonları, normal bir fonksiyona benzer şekilde tanımlanır, ancak içinde yield ifadesi kullanılır. Yield ifadesi, değer üretmek için kullanılır ve bu değer, fonksiyonun sonraki çağrılışında kullanılmak üzere tutulur.

Generatorlar, normal döngülerden farklı olarak belleği daha verimli kullanırlar. Çünkü bir dizi oluşturma yerine sadece bir sonraki değeri üretirler. Bu sayede, büyük miktarda veriyi işlemek için kullanıldıklarında daha hızlı ve daha verimli bir işlem yapmaya yardımcı olurlar.

Aşağıdaki örnek, tek sayıları üretebilen bir generator fonksiyonunun kodudur:

```def tek_sayilar(): i = 1 while True: yield i i += 2```

Bu kod, her çağrılışında bir sonraki tek sayıyı üretir. Örneğin, `next(tek_sayilar())` ifadesi kullanıldığında, 1 değeri üretilir. Ardından, aynı ifade bir kez daha kullanıldığında, 3 değeri üretilir.

Generatorlar, ayrıca diğer döngü yapılarıyla birlikte kullanılabilirler. Örneğin, aşağıdaki kod, rang() fonksiyonunun generate edilen değerleri tek sayılara dönüştüren bir generator kullanır:

```def tek_sayilar(): for i in range(10): yield i*2 + 1

for sayi in tek_sayilar(): print(sayi)```

Bu kod, 1'den 19'a kadar olan tek sayıları yazdırır.

Generatorlar, diğer döngü yapılarıyla birlikte kullanıldıklarında daha da güçlü hale gelirler. Bu nedenle, büyük miktarda veri işleme gerektiren programlar yazarken, generatorları kullanmak büyük bir avantaj sağlayabilir.


Recursion

Recursion, yani özyineleme, bir fonksiyonun kendisini çağırmasıdır. Bu teknik, bazı programlama problemlerini çözerken çok kullanışlı olabilir. Örneğin, bir ağaç yapısındaki tüm düğümlerin toplamını hesaplamak için özyinelemeli bir fonksiyon kullanabilirsiniz.

Rekürsif fonksiyonların birkaç özelliği vardır. Öncelikle, her recursive çağrı bir öncekine göre daha küçük bir sorunu işler. Bu, fonksiyonun sonsuz bir döngüye girmesini önler ve sonunda bir çözüm üretmesini sağlar. İkincisi, her recursive çağrı ayrı bir yığın çerçevesi oluşturur. Bu, özyineleme sırasında her bir çağrının kendi yerel değişkenlerini ve geçerli durumunu tutmasını sağlar.

Bir özyinelemeli fonksiyonun temel yapısı şöyledir:

```pythondef recursiveFunction(parameters): if baseCaseCondition(parameters): return baseCaseValue else: recursiveFunction(modifiedParameters)```

Burada özyinelemeli fonksiyonun base case (temel durum) şartı, sonsuz döngüye girmeyi önlemek için eklenmiştir. Fonksiyonun işleyişini anlamak için bir örnek verelim.

Örneğin, sayının faktöriyelini hesaplamak için bir özyinelemeli fonksiyon yazabiliriz:

```pythondef factorial(n): if n == 1: return 1 else: return n * factorial(n-1)```

Bu fonksiyon, verilen sayının faktöriyelini hesaplamak için kendisini çağıran özyinelemeli bir yapıdadır. Eğer n = 1 olduğunda, base case şartı sağlanır ve 1 değeri döndürülür. Aksi takdirde, n değeri kendisinden bir eksik olan faktöriyel değerine çarpılır ve kendisini n-1 ile çağırır.

Rekürsif fonksiyonlar, uygun bir şekilde kullanıldığında kodun okunabilirliğini artırır ve bazı programlama sorunlarını daha basit hale getirir. Ancak, yanlış kullanıldığı takdirde performans sorunlarına neden olabilirler ve özyinelemeli fonksiyonların her bir çağrısı yığına bir çerçeve eklediği için, yapılan çağrıların sayısı programın başarımını etkileyebilir.