Von zwei Optionen unten, was ansprechender (lesbarer Code, mehr Pythonie, Effizienz, etc ..) für das Durchlaufen iterable und wenn ich mehr Logik in der Zukunft hinzufügen möchte (zum Beispiel hinzufügen 1 zu jedem zurückgegebenen Wert)?Return-Generator VS iterieren mit while bis None
Eine der Optionen gibt den Generator zurück, die andere gibt das nächste Element und None
zurück, wenn alle Iterationen durchgeführt wurden.
Gibt es eine bevorzugte Methode? Wenn ja, warum? Gibt es Einschränkungen, die eine Methode hat, die andere nicht?
class Option1():
def __init__(self):
self.current = 0
def get_next_batch(self, my_list):
if self.current == len(my_list):
self.current = 0
return None
self.current += 1
return [my_list[self.current-1]]
class Option2():
def __init__(self):
self.current = 0
def get_next_batch(self, my_list):
while self.current < len(my_list):
yield [my_list[self.current]]
self.current += 1
self.current = 0
raise StopIteration()
Verbrauch:
o1 = Option1()
o2 = Option2()
arr = [1,2,3,4,5]
a = o1.get_next_batch(arr)
while a is not None:
print a
a = o1.get_next_batch(arr)
for item in o2.get_next_batch(arr):
print item
Ausgang in beiden Fällen:
[1]
[2]
[3]
[4]
[5]
Danke für Bemerkungen über Generator. Ich brauche Strom, denn wenn Logik komplizierter ist, erstelle ich Listen unterschiedlicher Größe. Gibt es ein Szenario, in dem eine Logik mit 'Option1' und nicht mit' Option2' implementiert werden kann? Zum Beispiel, wenn das nächste Item zurückkommt, hängt es von Items ab, die ich schon zurückgegeben habe oder so ähnlich? – Farseer
Nein, beide können genau die gleichen Dinge erreichen. Es ist konzeptionell einfacher (meiner Meinung nach) Iteratoren mit Generatoren zu modellieren. – Dunes
Ein wenig hinzugefügt, wie Option1 in einer for-Schleife arbeiten kann. – Dunes