ProgramlamaBackend geliştirici

Python'da yineleme nesnesi nedir ve kullanıcı tanımlı bir yineleyici nesne nasıl doğru bir şekilde uygulanır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Sorunun tarihi: Yineleme kavramı, Python'da koleksiyonlarla (liste, sözlük, küme vb.) çalışmayı standartlaştırmak için ortaya çıktı. Bir döngü içinde (for döngüsü gibi) geçiş yapılabilen her nesne yineleyici olarak kabul edilir. Bu, belirli sihirli yöntemler aracılığıyla gerçekleştirilir.

Sorun: Python, dizilerle ilgili döngülerin ve işlevlerin doğru çalışması için belirli protokoller gerektirir. Kullanıcı, sınıfında bu protokolleri yanlış bir şekilde uygularsa, standart mekanizmalar (for, list(), sum() vb.) çalışmayacak veya beklenmedik şekilde davranacaktır.

Çözüm: Yineleyici, __iter__ yöntemini uygulayan herhangi bir nesnedir. Yineleyici, __next__ ve self'i döndüren __iter__ yöntemine sahip olan nesnedir. Genellikle __iter__ tarafından döndürülen nesne bir yineleyici olsa da bu zorunlu değildir. Örnek:

class MyRange: def __init__(self, start, end): self.start = start self.end = end def __iter__(self): self.current = self.start return self def __next__(self): if self.current < self.end: val = self.current self.current += 1 return val raise StopIteration for x in MyRange(1, 4): print(x) # 1, 2, 3

Anahtar özellikler:

  • Yineleme, __iter__ yönteminin varlığı ile belirlenir.
  • Yineleyici, hem __next__ hem de self'i döndüren __iter__ yöntemini uygulamalıdır.
  • __iter__ içinde yeni bir nesne döndürmek, koleksiyon üzerinde birden fazla bağımsız geçiş gerektiğinde etkilidir.

Kandırmaca soruları.

Her yineleyici nesne için __next__ yöntemi zorunlu mu?

Hayır. Yineleyici nesne için yalnızca yineleyici döndüren __iter__ gereklidir. __next__ yalnızca yineleyici tarafından uygulanır. Örneğin, list nesnesinin __next__ yöntemi yoktur, ancak yineleyicidir: __iter__ yöntemi, bir yineleyici nesnesinin örneğini döndürür.

lst = [1, 2, 3] print(hasattr(lst, '__next__')) # False

Bir nesne kendi başına yineleyici olabilir mi?

Evet, eğer hem __iter__ hem de __next__ yöntemlerini uygularsa.

Bir koleksiyon için bağımsız durumlara sahip birden fazla yineleyici yaratmak mümkün mü?

Evet, eğer __iter__ her seferinde yeni bir yineleyici nesnesi döndürüyorsa.

class MyList: def __init__(self, data): self.data = data def __iter__(self): return iter(self.data)

Yaygın hatalar ve anti-deseni

  • Sadece __next__ yöntemini uygulamak ancak __iter__ uygulamamak (veya tam tersi).
  • Durumun sınıf seviyesinde saklanması, örnek düzeyinde değil, tekrar eden geçişlerde hatalara yol açar.

Gerçek hayattan örnek

Olumsuz durum: Yineleyici sınıfı, durumu (örneğin, mevcut dizin) sınıf seviyesinde saklıyor, bu da paralel geçişlerin birbirini bozmasına neden oluyor. Artıları:

  • Daha az bellek (sadece bir dizin). Eksileri:
  • İki döngü ile aynı anda yineleme sırasında hatalar.

Olumlu durum: Her yineleyici, __iter__ içinde oluşturulan örnekte kendi durumunu saklar. Artıları:

  • Birden fazla yineleyicinin doğru çalışması. Eksileri:
  • Çok fazla değil, bellek tüketimi biraz daha artar.