Hai iteratori confusi con i generatori.
Il tuo primo esempio è un elenco di espressioni iteratore mentre il secondo è un'espressione generatore. La differenza principale è che il generatore crea pigramente ogni membro della raccolta data (se necessario) piuttosto che ardentemente (immediatamente, se necessario o meno). Puoi definire i tuoi generatori utilizzando il rendimento anziché il rendimento.
Per quanto riguarda l'utilizzo, si desidera un iteratore quando è necessario l'elenco (o dizionario o altro) per qualcosa in sé e per sé. Dovresti usare un generatore quando la raccolta è accessoria al prodotto finale. Ad esempio, è possibile utilizzare un generatore per ottenere un elenco di numeri che soddisfano alcuni criteri da altri criteri. Non ti interessa la lista originale, solo i membri che soddisfano i criteri. Quindi, usi un generatore per ottenere solo quei numeri.
Un esempio più concreto sarebbe trovare gli angoli dei triangoli i cui lati hanno una determinata lunghezza. Non vogliamo tutti i triangoli falliti poveri e deformati, solo i triangoli di successo robusti e sani. Quindi useremmo un generatore.
Questo overflow dello stack post va più nel dettaglio.