Sie haben Iteratoren mit Generatoren verwechselt.
Ihr erstes Beispiel ist ein Listeniteratorausdruck, während das zweite ein Generatorausdruck ist. Der Hauptunterschied besteht darin, dass der Generator jedes Mitglied der angegebenen Sammlung eher träge (nach Bedarf) als eifrig (sofort, ob benötigt oder nicht) erstellt. Sie können Ihre eigenen Generatoren definieren, indem Sie Yield anstelle von Return verwenden.
Was die Verwendung betrifft, möchten Sie einen Iterator, wenn Sie die Liste (oder das Wörterbuch oder was auch immer) für etwas an und für sich benötigen. Sie würden einen Generator verwenden, wenn die Sammlung zum Endprodukt gehört. Beispielsweise können Sie einen Generator verwenden, um eine Liste von Zahlen abzurufen, die einige Kriterien von anderen Kriterien erfüllen. Die ursprüngliche Liste interessiert Sie nicht, nur die Mitglieder, die den Kriterien entsprechen. Sie verwenden also einen Generator, um nur diese Zahlen zu erhalten.
Ein konkreteres Beispiel wäre das Finden der Winkel von Dreiecken, deren Seiten eine bestimmte Länge haben. Wir wollen nicht alle armen, deformierten, gescheiterten Dreiecke, sondern nur die starken, gesunden, erfolgreichen Dreiecke. Also würden wir einen Generator verwenden.
Dieser Beitrag zum Stapelüberlauf wird ausführlicher beschrieben.