Skip to content

ciclo for in Python (con range, enumerate, zip, ecc.)

Python

Questo articolo descrive come usare il ciclo for in Python.

  • Nozioni di base sul ciclo per in Python
    • per istruzione in Python
    • Termina il ciclo per:break
    • Continua al ciclo successivo:continue
    • Eseguire dopo la normale terminazione:else
  • Funzioni utili nelle istruzioni per
    • Estrarre solo alcuni elementi: fetta
    • Contatore (indice):range()
    • Elementi e contatore:enumerate()
    • Elenca più:zip()
    • Elenca multipli e contatore:enumerate(), zip()
    • Ordine inverso:reversed()
    • Cicli annidati:itertools.product()
  • Altri argomenti
    • dict in per la dichiarazione
    • Elena le comprensioni

Vedere l’articolo seguente per un ciclo con l’istruzione mentre che si ripete finché l’espressione condizionale è True.

per istruzione in Python

Un’istruzione for (for-loop) in molti linguaggi di programmazione come C viene scritta utilizzando una variabile contatore e una condizione di continuazione.

for(int i = 0; i < 10; i++)
    ...

A differenza di C, l’istruzione for in Python è scritta come segue. Puoi impostare qualsiasi nome su variabile.

for variable in iterable object:
    ...

In corrispondenza di un’istruzione foreach in altri linguaggi, gli elementi di iterabili come gli elenchi vengono assegnati in sequenza alle variabili ed elaborati. Il processo viene affidato a tutti gli elementi.

l = ['Alice', 'Bob', 'Charlie']

for name in l:
    print(name)
# Alice
# Bob
# Charlie

Termina il ciclo per:break

Puoi terminare il ciclo per per interruzione.

l = ['Alice', 'Bob', 'Charlie']

for name in l:
    if name == 'Bob':
        print('!!BREAK!!')
        break
    print(name)
# Alice
# !!BREAK!!

Vedere il seguente articolo per i dettagli sull’istruzione se.

Continua al ciclo successivo:continue

Puoi saltare il ciclo e passare al successivo continuando.

pausa termina l’intero ciclo per, ma continua salta il codice solo dopo l’istruzione continua nel ciclo.

l = ['Alice', 'Bob', 'Charlie']

for name in l:
    if name == 'Bob':
        print('!!SKIP!!')
        continue
    print(name)
# Alice
# !!SKIP!!
# Charlie

Eseguire dopo la normale terminazione:else

Usa else per eseguire qualcosa che il ciclo for è stato completato dopo successo.

l = ['Alice', 'Bob', 'Charlie']

for name in l:
    print(name)
else:
    print('!!FINISH!!')
# Alice
# Bob
# Charlie
# !!FINISH!!

Se il ciclo per viene terminato per interruzione, la suite nella clausola else non viene eseguita.

for name in l:
    if name == 'Bob':
        print('!!BREAK!!')
        break
    print(name)
else:
    print('!!FINISH!!')
# Alice
# !!BREAK!!

In caso di continue, viene eseguita la suite nella clausola else.

for name in l:
    if name == 'Bob':
        print('!!SKIP!!')
        continue
    print(name)
else:
    print('!!FINISH!!')
# Alice
# !!SKIP!!
# Charlie
# !!FINISH!!

Usando altrimenti e continua, puoi interrompere i loop nidificati (loop multipli). Vedere il seguente articolo per i dettagli.

Se vuoi estrarre solo alcuni elementi, specifica l’intervallo con una sezione come [start:stop]. Per start e stop, specifica l’indice che inizia con 0. Si noti che l’elemento nella posizione di stop non è incluso.

l = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

for c in l[2:5]:
    print(c)
# C
# D
# E

Puoi omettere start e stop o ottenere l’elemento per ogni passaggio con [start:stop:step]. Un esempio di estrazione solo di elementi con indicizzazione dispari e elementi con indicizzazione pari è il seguente.

for c in l[::2]:
    print(c)
# A
# C
# E
# G

for c in l[1::2]:
    print(c)
# B
# D
# F

Vedere l’articolo seguente per ulteriori informazioni sulla sezione.

Contatore (indice):range()

Puoi ottenere il contatore (indice) nel ciclo per per intervallo().

for i in range(3):
    print(i)
# 0
# 1
# 2

range() arriva un oggetto di tipo range.

print(range(3))
print(type(range(3)))
# range(0, 3)
# <class 'range'>

Per una spiegazione, convertilo in un elenco con list(). Non è necessario convertirlo in un elenco quando lo si utilizza in un’istruzione per venire nell’esempio sopra.

range(stop) restituisce numeri di 0 <= i <stop.

print(list(range(3)))
# [0, 1, 2]

print(list(range(6)))
# [0, 1, 2, 3, 4, 5]

Se vuoi specificare un intervallo, specifica due argomenti come intervallo(inizio, arresto).

print(list(range(10, 13)))
# [10, 11, 12]

Se vuoi specificare step, specifica tre argomenti come range(start, stop, step).

print(list(range(0, 10, 3)))
# [0, 3, 6, 9]

print(list(range(10, 0, -3)))
# [10, 7, 4, 1]

Un esempio dell’istruzione per è il seguente.

for i in range(10, 0, -3):
    print(i)
# 10
# 7
# 4
# 1

Vedere il seguente articolo per i dettagli di range().

Elementi e contatore:enumerate()

Puoi ottenere l’elemento e il contatore (indice) contemporaneamente da enumerare().

l = ['Alice', 'Bob', 'Charlie']

for name in l:
    print(name)
# Alice
# Bob
# Charlie

for i, name in enumerate(l):
    print(i, name)
# 0 Alice
# 1 Bob
# 2 Charlie

È possibile specificare un valore iniziale come secondo argomento di enumerate().

for i, name in enumerate(l, 1):
    print(i, name)
# 1 Alice
# 2 Bob
# 3 Charlie

for i, name in enumerate(l, 42):
    print(i, name)
# 42 Alice
# 43 Bob
# 44 Charlie

enumerate() non ha argomenti per specificare step come range(), ma può essere fatto come segue.

step = 3
for i, name in enumerate(l):
    print(i * step, name)
# 0 Alice
# 3 Bob
# 6 Charlie

Elenca più:zip()

Più oggetti iterabili possono essere gestiti da zip().

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18

È anche possibile combinare tre o più oggetti iterabili.

points = [100, 85, 90]

for name, age, point in zip(names, ages, points):
    print(name, age, point)
# Alice 24 100
# Bob 50 85
# Charlie 18 90

Vedere l’articolo seguente per i dettagli, ad esempio quando il numero di elementi è diverso.

Come nell’esempio sopra, zip() gli elementi di più oggetti iterabili in ordine. Se vuoi tutte le combinazioni di elementi di più oggetti iterabili, usa it ottenere più avanti.

Elenca multipli e contatore:enumerate(), zip()

Puoi usare enumerate() e zip() insieme. Si noti che i nomi delle variabili intere per zip() devono essere racchiusi tra parentesi ().

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for i, (name, age) in enumerate(zip(names, ages)):
    print(i, name, age)
# 0 Alice 24
# 1 Bob 50
# 2 Charlie 18

Ordine inverso:reversed()

Puoi ottenere gli elementi di un oggetto iterabile in ordine inverso tramite reversed().

l = ['Alice', 'Bob', 'Charlie']

for name in reversed(l):
    print(name)
# Charlie
# Bob
# Alice

L’oggetto intervallo può anche essere invertito. È possibile specificare un valore negativo per step senza utilizzare reversed().

for i in reversed(range(3)):
    print(i)
# 2
# 1
# 0

for i in range(2, -1, -1):
    print(i)
# 2
# 1
# 0

L’oggetto enumerare non può essere annullato. Devi convertirlo in un elenco con list().

# for i, name in reversed(enumerate(l)):
#     print(i, name)
# TypeError: 'enumerate' object is not reversible

for i, name in reversed(list(enumerate(l))):
    print(i, name)
# 2 Charlie
# 1 Bob
# 0 Alice

Se non vuoi invertire l’indice, usa reversed() all’interno di enumerate().

for i, name in enumerate(reversed(l)):
    print(i, name)
# 0 Charlie
# 1 Bob
# 2 Alice

L’oggetto zip non può essere annullato. Devi convertirlo in un elenco con list().

l2 = [24, 50, 18]

# for name, age in reversed(zip(l, l2)):
#     print(name, age)
# TypeError: 'zip' object is not reversible

for name, age in reversed(list(zip(l, l2))):
    print(name, age)
# Charlie 18
# Bob 50
# Alice 24

Puoi scrivere loop nidificati in Python come segue. In Python, i blocchi sono rappresentati da rientri, quindi aggiungi semplicemente più rientri.

l1 = [1, 2, 3]
l2 = [10, 20, 30]

for i in l1:
    for j in l2:
        print(i, j)
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# 2 30
# 3 10
# 3 20
# 3 30

Puoi ottenere lo stesso risultato da itertools.product().

import itertools

l1 = [1, 2, 3]
l2 = [10, 20, 30]

for i, j in itertools.product(l1, l2):
    print(i, j)
# 1 10
# 1 20
# 1 30
# 2 10
# 2 20
# 2 30
# 3 10
# 3 20
# 3 30

È anche possibile passare tre o più iterabili come argomenti a itertools.product(). Vedere il seguente articolo per i dettagli.

Se vuoi uscire dal loop all’interno dei loop multipli con break, è facile usare itertools.product().

dict in per la dichiarazione

L’oggetto nell’istruzione per riporta le chiavi.

d = {'key1': 1, 'key2': 2, 'key3': 3}

for k in d:
    print(k)
# key1
# key2
# key3

Se vuoi ottenere valori o coppie chiave-valore, usa values() e items().

for v in d.values():
    print(v)
# 1
# 2
# 3
for k, v in d.items():
    print(k, v)
# key1 1
# key2 2
# key3 3

Vedere il seguente articolo per i dettagli.

Elena le comprensioni

Per generare un nuovo elenco elaborando gli elementi di oggetti iterabili, è più semplice scrivere utilizzando la comprensione degli elenchi rispetto all’istruzione for.

La comprensione dell’elenco è scritta come segue.

[expression for variable_name in iterable]

Esempi di comprensioni di elenchi e di istruzioni sono i seguenti. Le comprensioni degli elenchi sono più concise.

squares = [i**2 for i in range(5)]
print(squares)
# [0, 1, 4, 9, 16]
squares = []
for i in range(5):
    squares.append(i**2)

print(squares)
# [0, 1, 4, 9, 16]

Vedere il seguente articolo per i dettagli sulla comprensione degli elenchi.