ottenere l'indice di un ciclo for (funzione 'enumerate')

Stefaniscion (1370 points)
4 15 32
asked Oct 16, 2017 in Programmare in Python by Stefaniscion (1,370 points)
closed Oct 16, 2017 by andrea.sterbini

Buongiornotte a tutti!
Mi stavo dilettando piacevolmente nel eseguire gli homework, quando, al termine del primo di questi, mi sono posto una domanda:

in c++ quando scrivo un ciclo for, essenzialmente utilizzo un indice "i" (si chiama indice... vero?) con cui poi "esploro" un elemento iterabile tramite la dicitura "lista[i]".

in python ho notato questa mancanza (mia o del python?), in quanto ottengo direttamente il valore della variabile, senza sapere de facto la posizione di questa al interno della lista! (dato che "for x in y:" da come x il contenuto di y in posizione "boh", e non direttamente la sua posizione!)
Mi chiedevo se ci fosse un modo più pulito di ottenere l'indice di un ciclo for, che sia diverso da

i=0
for x in y:
[...]
i=i+1


in quanto lo trovo davvero scomodo e sporco

Spero di essere stato chiaro, vi ringrazio in anticipo :D
-Stefaniscion

2,005 views
closed with note: answered

3 Answers

Best answer
Auron (15880 points)
32 126 194
answered Oct 16, 2017 by Auron (15,880 points)
selected Oct 18, 2017 by Stefaniscion

Ciao e buongiornotte anche a te!
Come te, all'inizio, avendo programmato in Visual Basic, mi sono trovato un attimo spiazzato dal funzionamento degli indici nei cicli in Python...
Per le mie limitate conoscenze, visto che ho approcciato al linguaggio con questo corso e non prima, oltre alla strada che hai suggerito tu che si serve della variabile contatore i=i+1, potrei suggerirti l'utilizzo della funzione enumerate().

Per spiegarti l'utilizzo di questa funzione ti faccio un brevissimo esempio... Fai caso che tu abbia lista=[14, 21, 33, 48, 52]... Impostando il ciclo in questo modo ***For i, j in enumerate(lista):*** otterrai un ciclo che assegna a ***j*** il valore della lista iterato in quel giro di ciclo, mentre ad ***i*** la posizione di quel valore nella suddetta lista... Per essere pratici avrai che:

     lista=[14, 21, 33, 48, 52]

     For i, j in enumerate(lista):

               print (i, j)

Ti restituirà:

0   14
1   21
2   33
3   48
4   52

Capirai da te che così per ogni valore sarai in grado di identificare immediatamente la posizione che occupa all'interno della lista e, volendo spostare il discorso sul ciclo For, l'indice che il ciclo assume mentre sta leggendo il valore corrispondente... Quando il ciclo starà leggendo il valore "48", per esempio, saprai che è al 4° giro di ciclo, essendo "48" in posizione numero "3" con partenza dell'indice da 0. :D

Se la risposta ti ha aiutato e se sono stato abbastanza chiaro ricordati di contrassegnarla come "miglior risposta" :D

Buongiornotte!

split (8700 points)
15 59 79
commented Oct 16, 2017 by split (8,700 points)
attenti a postare codice che il professore è sempre in agguato anche alle 3! buongiotte anche a voi, o come direbbe luca giurato, buongiollo
Auron (15880 points)
32 126 194
commented Oct 16, 2017 by Auron (15,880 points)
Ma non ho scritto un programma per qualcuno, ho solo descritto il funzionamento di una funzione in python... Si trova ovunque in Internet...
Non si può fare neanche questo? Cioè è un codice molto generico...
Non avevo capito che non fosse possibile neanche spiegare come lavora una funzione rimanendo generici e non applicandola ad un/a programma/situazione ben definita...
Se il professore sarà innervosito dalla mia risposta la modificherò immediatamente :)
andrea.sterbini (172780 points)
514 935 1789
commented Oct 16, 2017 by andrea.sterbini (172,780 points)
oppure potete usare la funzione range per generare i valori dell'indice e accedere ai valori della lista per indice ...
Auron (15880 points)
32 126 194
commented Oct 16, 2017 by Auron (15,880 points)
Approfitto per chiederle se possiamo utilizzare la scrittura di codice per spiegare il funzionamento generico di una funzione, o se invece non si può neanche in questo caso... Almeno evito di creare problemi in futuro :)
andrea.sterbini (172780 points)
514 935 1789
commented Oct 16, 2017 by andrea.sterbini (172,780 points)
Solo frammenti che non riguardano le soluzioni. Altrimenti pseudo codice
Auron (15880 points)
32 126 194
commented Oct 16, 2017 by Auron (15,880 points)
Quindi questo non era in "zona proibita", se non ho capito male :)
Grazie!
split (8700 points)
15 59 79
commented Oct 16, 2017 by split (8,700 points)
ma no auron stavo scherzando! :D
split (8700 points)
15 59 79
answered Oct 16, 2017 by split (8,700 points)
la cosa più simile a c e c++ per il ciclo for è usarlo con un indice i che "giri" in range(len(qualcosa))

dove 'qualcosa' è una lista,dei caratteri...qualcosa insomma!

usa questo metodo se vuoi un ciclo alla "C", ma forse è più comodo quello che diceva Auron
Auron (15880 points)
32 126 194
commented Oct 16, 2017 by Auron (15,880 points)
Ti voto comunque in quanto il costrutto esiste e può essere comodo in occasione per cui magari l'enumerate non è ottimale :D
split (8700 points)
15 59 79
commented Oct 16, 2017 by split (8,700 points)
mah si, forse è un costrutto per nostalgici...ci trovo del romanticismo nell'usarlo :D
francesco.dev (33560 points)
14 51 129
answered Oct 16, 2017 by francesco.dev (33,560 points)
Ciao Stefaniscion!
Se vuoi sapere la posizione in cui ti trovi mentre il ciclo viene eseguito, a questo punto ti conviene usare il buon vecchio while!
Perché in python il for viene visto solo come scorrimento di un oggetto per vederne gli elementi presenti e non per leggere le posizioni dei vari elementi.

Spero di esserti stato utile!
- Francesco Pio Scognamiglio