Forum >> Principianti >> Differenza fra iterable e iterator e uso specifico...

Pagina: 1

Salve,

Sono alle prese con i concetti di iterabile e iteratore e spero di fare un po' di chiarezza.


Da quanto ho capito:

a) Un' iterabile e' una lista, una tupla, un dizionario, una stringa, qualsiasi sequenza di uno o piu' elementi sulla quale si puo' fare un'iterazione (un for loop).
b) Quando si crea un'iterabile, spazio in memoria viene riservato per l'intera iterabile. Questo puo' essere dispendioso.

c) Nell'esecuzione di un for loop puo' usare sia un'iterabile sia un iteratore. Nel caso si usi un'iterabile, l'iterabile viene convertita dietro le scene in un iteratore per eseguire l'iterazione.


In merito all' interatore:

a) si tratta di un oggetto a cui si puo' applicare consecutivamente il metodo next() per ottenere uno ad uno gli elementi dell'iteratore stesso. L'interatore ha memoria del suo stato.

b) L'iteratore sembra occupare meno memoria di un iterabile...Perche'?

c) Un' interabile si puo' convertire in un iteratore con il metodo iter().

d) Gli iteratori sono iterabili ma non vice versa.

Detto tutto questo, per iterare un iterabile si puo' semplicemente usare l'indicizzazione e prelevare qualsivoglia elemento dall'iterabile. Per es., a= [1,2,3], a0=1. Sembra quindi possibile fare quello che si fa con l'iteratore con l'interabile usando l'indicizzazione...o mi sbaglio?


Un iterabile e' un contenitore", detto data structure. Si puo' eseguire l'iterazione sull'iterabile SOLO se si trasforma l'iterabile in iteratore. Altrimenti, l'interabile rimane un contenitore non iterabile? Sono un po' confuso sui meriti dell'iterabile rispetto ai meriti dell'iteratore...

Grazie per qualsiasi chiarimento!


--- Ultima modifica di Confuso83 in data 2022-01-27 14:43:31 ---
Ciao caro. :birrame:

Se non hai problemi a leggere l'inglese, ti recupero un bellissimo articolo di Chirad Goyal che spiega i concetti che chiedi ed anche di più, abbracciando di fatto anche altri ambiti.

So che ti piacerà, nel caso di ulteriori dubbi fai sapere.

Cya
Grazie dell'articolo, Cya. Ho decisamente capito le principali differenze fra iterabile e iteratore ma mi rimane un solo dubbio:


L'iteratore sembra essere una struttura piu' agile e conveniente dal punto di vista dell'uso della memoria rispetto alla lista. Per esempio, a= [1,2,3] crea una lista in RAM e b=iter(a) crea un iteratore. Ovviamente, una lista lunghissima, occupa un'enormita' di spazio in memoria RAM. No bueno.


Nel caso dell'iteratore b invece, viene usato il concetto di lazy evaluation: l'iteratore crea in memoria solo un valore alla volta man mano che gli viene richiesto usando la funzione next(). La creazione della lista crea tutti gli elementi della lista stessa in un solo colpo (piu' dispendioso).

Ma per creare un iteratore non devo per forza creare prima la lista da cui deriva l'iteratore stesso? Questo sembra richiedere memoria due volte (per la lista e per l'iteratore).


Oppure posso creare un iteratore da solo, salvarlo in disco fisso, e richiede i suoi valori uno alla volta quando creo e lancio lo script Python?


Grazie per qualsiasi illuminazione!


--- Ultima modifica di Confuso83 in data 2022-02-12 15:19:16 ---
Uh, guarda è un argomento molto vasto e che abbraccia vari aspetti. Su un forum è difficile affrontare con la dovuta profondità un argomento del genere, ma esiste una vastissima letteratura online sull'argomento che spiega per filo e per segno quello che chiedi, introducendo anche altri aspetti.

A margine ricorda sempre che puoi "misurare" il peso degli oggetti e dare riscontro a quanto appreso:

>>> import sys
>>> l = [i for i in range(100000)]
>>> g = (i for i in range(100000))
>>> sys.getsizeof(l, "bytes")
87616
>>> sys.getsizeof(g, "bytes")
112

Ci sono, ti dicevo, delle interessanti letture [1] e [2] che spiegano la magia e con Google ne troverai altre mille, se l'argomento ti stuzzica non hai che da approfondire.

Cya



Pagina: 1



Esegui il login per scrivere una risposta.