Python Language
Loops
Ricerca…
introduzione
Essendo una delle funzioni di base della programmazione, i loop sono un elemento importante in quasi tutti i linguaggi di programmazione. I loop consentono agli sviluppatori di impostare alcune parti del loro codice per ripetere attraverso un numero di cicli che vengono definiti iterazioni. Questo argomento tratta l'utilizzo di più tipi di loop e applicazioni di loop in Python.
Sintassi
- while <espressione booleana>:
- per <variabile> in <iterabile>:
- per <variabile> nell'intervallo (<numero>):
- per <variabile> nell'intervallo (<numero_iniziale>, <numero_infinizione>):
- per <variabile> nell'intervallo (<numero_avvio>, <numero_endenza>, <formato_passo>):
- per i, <variabile> in enumerate (<iterable>): # con indice i
- per <variable1>, <variable2> in zip (<iterable1>, <iterable2>):
Parametri
Parametro | Dettagli |
---|---|
espressione booleana | espressione che può essere valutata in un contesto booleano, ad esempio x < 10 |
variabile | nome della variabile per l'elemento corrente dal iterable |
iterabile | tutto ciò che implementa le iterazioni |
Iterare sulle liste
Per scorrere un elenco che puoi utilizzare for
:
for x in ['one', 'two', 'three', 'four']:
print(x)
Questo stamperà gli elementi della lista:
one
two
three
four
La funzione range
genera numeri che vengono spesso utilizzati anche in un ciclo for.
for x in range(1, 6):
print(x)
Il risultato sarà un tipo di sequenza intervallo speciale in python> = 3 e una lista in python <= 2. Entrambi possono essere collegati tramite il ciclo for.
1
2
3
4
5
Se si desidera eseguire il loop di entrambi gli elementi di una lista e avere anche un indice per gli elementi, è possibile utilizzare la funzione di enumerate
di Python:
for index, item in enumerate(['one', 'two', 'three', 'four']):
print(index, '::', item)
enumerate
genererà tuple, che vengono decompresse in index
(un intero) e item
(il valore effettivo dall'elenco). Il ciclo sopra verrà stampato
(0, '::', 'one')
(1, '::', 'two')
(2, '::', 'three')
(3, '::', 'four')
Iterare su un elenco con manipolazione dei valori utilizzando map
e lambda
, ovvero applica la funzione lambda su ogni elemento nell'elenco:
x = map(lambda e : e.upper(), ['one', 'two', 'three', 'four'])
print(x)
Produzione:
['ONE', 'TWO', 'THREE', 'FOUR'] # Python 2.x
NB: in Python 3.x la map
restituisce un iteratore invece di una lista in modo che nel caso abbiate bisogno di una lista dovete lanciare il risultato print(list(x))
(vedere http://www.Scriptutorial.com/python/ esempio / 8186 / map-- in http://www.Scriptutorial.com/python/topic/809/incompatibilities-moving-from-python-2-to-python-3 ).
Per i loop
for
cicli itera su una raccolta di elementi, come list
o dict
, ed esegui un blocco di codice con ogni elemento della raccolta.
for i in [0, 1, 2, 3, 4]:
print(i)
Il ciclo sopra for
itera su un elenco di numeri.
Ogni iterazione imposta il valore di i
sull'elemento successivo dell'elenco. Quindi prima sarà 0
, poi 1
, poi 2
, ecc. L'output sarà il seguente:
0
1
2
3
4
range
è una funzione che restituisce una serie di numeri sotto una forma iterabile, quindi può essere utilizzata in cicli for
:
for i in range(5):
print(i)
dà lo stesso risultato esatto come la prima for
ciclo. Notare che 5
non è stampato poiché l'intervallo qui è i primi cinque numeri che contano da 0
.
Oggetti e iteratori iterabili
for
loop può iterare su qualsiasi oggetto iterabile che è un oggetto che definisce una funzione __getitem__
o __iter__
. La funzione __iter__
restituisce un iteratore, che è un oggetto con una funzione next
che viene utilizzata per accedere all'elemento successivo del iterabile.
Rompi e continua in loop
dichiarazione di break
Quando un'istruzione break
viene eseguita all'interno di un ciclo, il flusso di controllo "si interrompe" immediatamente dal ciclo:
i = 0
while i < 7:
print(i)
if i == 4:
print("Breaking from loop")
break
i += 1
Il ciclo condizionale non verrà valutato dopo l'esecuzione dell'istruzione break
. Nota che le frasi break
sono permesse solo all'interno di loop , sintatticamente. Un'istruzione break
all'interno di una funzione non può essere utilizzata per terminare i loop che hanno chiamato quella funzione.
Eseguendo le seguenti stampe ogni cifra fino al numero 4
quando l'istruzione break
è soddisfatta e il ciclo si ferma:
0
1
2
3
4
Breaking from loop
break
istruzioni break
possono anche essere utilizzate all'interno for
loop, l'altro costrutto di loop fornito da Python:
for i in (0, 1, 2, 3, 4):
print(i)
if i == 2:
break
L'esecuzione di questo ciclo ora stampa:
0
1
2
Si noti che 3 e 4 non vengono stampati poiché il ciclo è terminato.
Se un ciclo ha una clausola else
, non viene eseguito quando il ciclo termina con un'istruzione break
.
continue
dichiarazione
Un'istruzione continue
salterà alla successiva iterazione del ciclo ignorando il resto del blocco corrente ma continuando il ciclo. Come con la break
, continue
può apparire solo nei loop interni:
for i in (0, 1, 2, 3, 4, 5):
if i == 2 or i == 4:
continue
print(i)
0
1
3
5
Nota che 2
e 4
non sono stampati, questo perché continue
passa alla successiva iterazione invece di continuare a print(i)
quando i == 2
o i == 4
.
Cicli annidati
break
e continue
funzionano solo su un singolo livello di loop. L'esempio seguente si interromperà solo dal ciclo for
interno, non dal ciclo while
esterno:
while True:
for i in range(1,5):
if i == 2:
break # Will only break out of the inner loop!
Python non ha la capacità di uscire da più livelli di loop contemporaneamente - se questo comportamento è desiderato, refactoring uno o più loop in una funzione e la sostituzione di break
with return
potrebbero essere la strada da percorrere.
Utilizzare il return
da una funzione come una break
L' istruzione return
esce da una funzione, senza eseguire il codice che viene dopo.
Se si dispone di un ciclo all'interno di una funzione, l'utilizzo del return
dall'interno di quel ciclo equivale a break
poiché il resto del codice del ciclo non viene eseguito (si noti che qualsiasi codice dopo il ciclo non viene eseguito neanche ):
def break_loop():
for i in range(1, 5):
if (i == 2):
return(i)
print(i)
return(5)
Se hai cicli annidati, l'istruzione return
interromperà tutti i loop:
def break_all():
for j in range(1, 5):
for i in range(1,4):
if i*j == 6:
return(i)
print(i*j)
produrrà:
1 # 1*1
2 # 1*2
3 # 1*3
4 # 1*4
2 # 2*1
4 # 2*2
# return because 2*3 = 6, the remaining iterations of both loops are not executed
Loop con una clausola "else"
Le dichiarazioni for
e while
(loop) possono facoltativamente avere una clausola else
(in pratica, questo utilizzo è piuttosto raro).
La clausola else
viene eseguita solo dopo che un ciclo for
termina eseguendo il iterazione fino al completamento o dopo che un ciclo while
termina con la sua espressione condizionale che diventa false.
for i in range(3):
print(i)
else:
print('done')
i = 0
while i < 3:
print(i)
i += 1
else:
print('done')
produzione:
0
1
2
done
La clausola else
non viene eseguita se il ciclo termina in un altro modo (attraverso un'istruzione break
o sollevando un'eccezione):
for i in range(2):
print(i)
if i == 1:
break
else:
print('done')
produzione:
0
1
La maggior parte degli altri linguaggi di programmazione mancano di questa facoltativa else
clausola di loop. L'utilizzo della parola chiave else
, in particolare, è spesso considerata fonte di confusione.
Il concetto originale di tale clausola risale a Donald Knuth e il significato della parola chiave else
diventa chiaro se riscriviamo un ciclo in termini di istruzioni if
e istruzioni goto
dei giorni precedenti alla programmazione strutturata o da un linguaggio assembly di livello inferiore.
Per esempio:
while loop_condition():
...
if break_condition():
break
...
è equivalente a:
# pseudocode
<<start>>:
if loop_condition():
...
if break_condition():
goto <<end>>
...
goto <<start>>
<<end>>:
Rimangono equivalenti se alleghiamo una clausola else
.
Per esempio:
while loop_condition():
...
if break_condition():
break
...
else:
print('done')
è equivalente a:
# pseudocode
<<start>>:
if loop_condition():
...
if break_condition():
goto <<end>>
...
goto <<start>>
else:
print('done')
<<end>>:
Un ciclo for
con una clausola else
può essere compreso allo stesso modo. Concettualmente, esiste una condizione di loop che rimane True fintanto che l'oggetto o la sequenza iterabili ha ancora alcuni elementi rimanenti.
Perché dovremmo usare questo strano costrutto?
Il caso d'uso principale per il costrutto for...else
è un'implementazione concisa della ricerca, ad esempio:
a = [1, 2, 3, 4]
for i in a:
if type(i) is not int:
print(i)
break
else:
print("no exception")
Per rendere il else
in questo costrutto meno confuso, si può pensare ad esso come " se non si rompe " o " se non si trova ".
Alcune discussioni su questo argomento possono essere trovate in [Python-ideas] Riepilogo di ... altri thread , perché python usa 'else' after for e while loops? e Else Clauses su Loop Statements
Iterare sui dizionari
Considerando il seguente dizionario:
d = {"a": 1, "b": 2, "c": 3}
Per scorrere le sue chiavi, puoi usare:
for key in d:
print(key)
Produzione:
"a"
"b"
"c"
Questo è equivalente a:
for key in d.keys():
print(key)
o in Python 2:
for key in d.iterkeys():
print(key)
Per scorrere i suoi valori, utilizzare:
for value in d.values():
print(value)
Produzione:
1
2
3
Per scorrere le sue chiavi e i suoi valori, utilizzare:
for key, value in d.items():
print(key, "::", value)
Produzione:
a :: 1
b :: 2
c :: 3
Si noti che in Python 2, .keys()
, .values()
e .items()
restituiscono un oggetto list
. Se hai semplicemente bisogno di iterare attraverso il risultato, puoi usare l'equivalente .iterkeys()
, .itervalues()
e .iteritems()
.
La differenza tra .keys()
e .iterkeys()
, .values()
e .itervalues()
, .items()
e .iteritems()
è che i metodi iter*
sono generatori. Pertanto, gli elementi all'interno del dizionario vengono restituiti uno per uno mentre vengono valutati. Quando viene restituito un oggetto list
, tutti gli elementi vengono inseriti in un elenco e quindi restituiti per un'ulteriore valutazione.
Si noti inoltre che in Python 3, l'ordine degli articoli stampati nel modo sopraindicato non segue alcun ordine.
Mentre Loop
Un ciclo while
farà sì che le istruzioni del ciclo siano eseguite fino a quando la condizione del loop non è falsa . Il seguente codice eseguirà le istruzioni del ciclo per un totale di 4 volte.
i = 0
while i < 4:
#loop statements
i = i + 1
Mentre il ciclo sopra può essere facilmente tradotto in un ciclo for
più elegante, while
loop sono utili per verificare se alcune condizioni sono state soddisfatte. Il seguente ciclo continuerà ad essere eseguito fino a quando myObject
sarà pronto.
myObject = anObject()
while myObject.isNotReady():
myObject.tryToGetReady()
while
loop possono anche essere eseguiti senza una condizione utilizzando numeri (complessi o reali) o True
:
import cmath
complex_num = cmath.sqrt(-1)
while complex_num: # You can also replace complex_num with any number, True or a value of any type
print(complex_num) # Prints 1j forever
Se la condizione è sempre true, il ciclo while verrà eseguito per sempre (ciclo infinito) se non viene terminato da un'istruzione break o return o un'eccezione.
while True:
print "Infinite loop"
# Infinite loop
# Infinite loop
# Infinite loop
# ...
La dichiarazione del passaggio
pass
è un'istruzione nulla per quando un'istruzione è richiesta dalla sintassi di Python (come all'interno del corpo di un ciclo for
o while
), ma nessuna azione è richiesta o desiderata dal programmatore. Questo può essere utile come segnaposto per il codice che deve ancora essere scritto.
for x in range(10):
pass #we don't want to do anything, or are not ready to do anything here, so we'll pass
In questo esempio, non accadrà nulla. Il ciclo for
si completerà senza errori, ma non verranno eseguiti comandi o codice. pass
ci consente di eseguire il nostro codice con successo senza che tutti i comandi e le azioni siano pienamente implementati.
Allo stesso modo, il pass
può essere utilizzato in cicli while
, così come in selezioni e definizioni di funzioni, ecc.
while x == y:
pass
Iterazione di parti diverse di un elenco con diverse dimensioni del passo
Immagina di avere una lunga lista di elementi e sei interessato solo ad ogni altro elemento della lista. Forse vuoi solo esaminare il primo o l'ultimo elemento o un intervallo specifico di voci nel tuo elenco. Python ha potenti funzionalità integrate di indicizzazione. Ecco alcuni esempi su come raggiungere questi scenari.
Ecco una semplice lista che verrà utilizzata negli esempi:
lst = ['alpha', 'bravo', 'charlie', 'delta', 'echo']
Iterazione sull'intera lista
Per scorrere su ciascun elemento nell'elenco, è possibile utilizzare un ciclo for
come di seguito:
for s in lst:
print s[:1] # print the first letter
Il ciclo for
assegna s per ogni elemento di lst
. Questo stamperà:
a
b
c
d
e
Spesso hai bisogno sia dell'elemento che dell'indice di quell'elemento. La parola chiave enumerate
esegue questa attività.
for idx, s in enumerate(lst):
print("%s has an index of %d" % (s, idx))
L'indice idx
inizierà con zero e incrementerà per ogni iterazione, mentre i s
conterranno l'elemento in elaborazione. Lo snippet precedente verrà visualizzato:
alpha has an index of 0
bravo has an index of 1
charlie has an index of 2
delta has an index of 3
echo has an index of 4
Iterare su sotto-lista
Se vogliamo iterare su un intervallo (ricordando che Python usa l'indicizzazione basata su zero), usa la parola chiave range
.
for i in range(2,4):
print("lst at %d contains %s" % (i, lst[i]))
Ciò produrrebbe:
lst at 2 contains charlie
lst at 3 contains delta
L'elenco può anche essere affettato. La seguente notazione di sezione passa dall'elemento all'indice 1 alla fine con un passo di 2. I due cicli for
danno lo stesso risultato.
for s in lst[1::2]:
print(s)
for i in range(1, len(lst), 2):
print(lst[i])
I risultati del frammento di cui sopra:
bravo
delta
L'indicizzazione e l'affettamento sono un argomento a parte.
Il "mezzo giro" do-while
A differenza di altri linguaggi, Python non ha un costrutto do-until o do-while (questo permetterà al codice di essere eseguito una volta prima che la condizione venga testata). Tuttavia, è possibile combinare un while True
con break
per ottenere lo stesso scopo.
a = 10
while True:
a = a-1
print(a)
if a<7:
break
print('Done.')
Questo stamperà:
9
8
7
6
Done.
Looping e Disimballaggio
Ad esempio, se desideri scorrere un elenco di tuple:
collection = [('a', 'b', 'c'), ('x', 'y', 'z'), ('1', '2', '3')]
invece di fare qualcosa del genere:
for item in collection:
i1 = item[0]
i2 = item[1]
i3 = item[2]
# logic
o qualcosa del genere:
for item in collection:
i1, i2, i3 = item
# logic
Puoi semplicemente fare questo:
for i1, i2, i3 in collection:
# logic
Questo funzionerà anche per la maggior parte dei tipi di iterabili, non solo per le tuple.