Python'da Özyineleme
Programlamada, özyineleme - bir fonksiyonun kendisini çağırması durumudur.
Örnek . Sayaçla Basit Özyineleme
Özyineleme kullanarak 1'den 10'a
kadar olan sayıları yazdıralım:
i = 1
def func():
global i
print(i)
i += 1
if i <= 10:
func() # burada fonksiyon kendisini çağırır
func()
Bu kodun nasıl çalıştığını tartışalım.
i global değişkenimiz ve func
fonksiyonumuz var. Fonksiyonun içinde, konsola
i değişkeninin içeriği yazdırılıyor ve
ardından ona bir ekleniyor.
Eğer i değişkenimiz 10'dan küçük
veya eşitse, fonksiyon tekrar çağrılır. i
değişkeni global olduğu için, fonksiyonun her
yeni çağrılışında, bir önceki çağrıda ayarlanmış
i değişken değerine sahip olacaktır.
i, 10'dan büyük olana kadar
fonksiyonun kendisini çağırmaya devam edeceği
anlamına gelir.
if olmadan fonksiyonu çalıştıramayacağımızı
unutmayın - eğer yaparsak, sonsuz fonksiyon
çağrısı oluşur.
Örnek . İç İçe Geçmiş Listelerdeki Öğeleri Yazdırmak için Özyineleme
Özyinelemeler en çok, farklı iç içe geçme derecelerine sahip listeleri yinelemek için kullanılır. Aşağıdaki listemiz olduğunu varsayalım:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Onu yineleyecek bir fonksiyon oluşturalım.
İlk olarak, listeden çıkarılan basit bir sayı
olan, ilkel bir öğenin konsola yazdırılması
için bir koşul belirlememiz gerekiyor. Ve eğer
öğe, örneğin iç içe geçmiş bir liste gibi karmaşık
bir nesneyse, bu durumda fonksiyonun kendisini
çağırmasına, yani bir özyineleme meydana gelmesine
izin verin. Öğenin türünü kontrol etmek için
isinstance fonksiyonunu kullanalım.
Sadece örneğimiz için, isinstance'nin
ilk parametresine el, ikincisine ise
list türünü yazalım:
def func(lst):
for el in lst:
if isinstance(el, list):
func(el)
else:
print(el)
Fonksiyon çağrıldığında, iç içe geçmiş listedeki tüm sayıların bir dizisi yazdırılacaktır:
func(lst) # 1, 2, ... 8, 9 yazdırır
Örnek . İç İçe Geçmiş Liste Öğeleriyle İşlemler için Özyineleme
Özyinelemeler, iç içe geçmiş liste öğeleriyle çeşitli işlemler için de kullanılabilir. Aşağıdaki listemiz olduğunu varsayalım:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Tüm öğelerinin toplamını alalım.
Bunun için, fonksiyon içinde sayıların toplamının
birikeceği res değişkenini tanımlayalım.
Koşulda, eğer öğe karmaşık bir nesneyse,
func fonksiyonunun parametresine gireceğini
ve toplama ekleneceğini yazalım. Bu, öğenin
ilkel hale gelene kadar özyinelemede olacağı
anlamına gelir. Ve bu durumda, sadece res
içinde yazılan toplama eklenecektir:
def func(lst):
res = 0
for el in lst:
if isinstance(el, list):
res += func(el)
else:
res += el
return res
Fonksiyonu çağıralım ve sonucunu konsola yazdıralım:
print(func(lst)) # 45 yazdırır
Örnek . Listede Biriktirmek için Özyineleme
Özyineleme ile iç içe geçmiş listeler tek boyutlu bir listeye dönüştürülebilir. Aşağıdaki listemiz olduğunu varsayalım:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Fonksiyonda, kaynak listesinin öğelerinin
birikeceği boş bir res listesi yazalım.
Ardından bir döngü başlatalım ve bir koşul
belirleyelim - eğer öğe bir listeyse,
extend metoduna girer. Bu metod, bir
listenin öğelerini ikinci listenin sonuna
ekler, yani iç içe geçmiş listenin öğeleri
res listesinin sonuna girecektir:
def func(lst):
res = []
for el in lst:
if isinstance(el, list):
res.extend(func(el))
else:
res.append(el)
return res
print(func(lst))
Yürütülen kodun sonucu:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Pratik Görevler
İsteğe bağlı iç içe geçme seviyesine sahip bir sözlüğün tüm sayısal öğelerini yazdırın:
{
'a': {
'b': 1,
'c': 2,
'd': {
'e': 3,
'f': 4
}
},
'j': {
'h': 5,
'k': 6,
},
'l': 7
}
Önceki görevdeki sözlüğün öğelerinin toplamını bulun.
Önceki görevdeki sözlüğün ilkel öğelerinin listesini alın.