Ci

Cicli in Julia

2 esercizi

Informazioni su Cicli

Esistono fondamentalmente due tipi di cicli:

  1. Ripetere finché una condizione è soddisfatta.
  2. Iterare sugli elementi di una collezione.

Entrambi sono possibili in Julia, anche se il secondo potrebbe essere più comune.

Il ciclo while

Per problemi aperti, in cui non si sa in anticipo quante volte si ripeterà il ciclo, Julia mette a disposizione il ciclo while.

La forma di base è piuttosto semplice:

while condition
    do_something()
end

In questo caso, il programma continuerà a ripetere il ciclo finché condition non è più true.

Ci sono due modi per uscire dal ciclo in anticipo:

  • Un break fa terminare il ciclo, e l'esecuzione riprende dalla riga successiva all'end del ciclo.
  • Un return x interrompe l'esecuzione della funzione corrente, restituendo il valore x a chi l'ha chiamata.

Con queste opzioni a disposizione, a volte può essere comodo creare un ciclo «infinito» con while true ... end, per poi affidarsi a una condizione di arresto all'interno del corpo del ciclo che faccia scattare un break o un return.

Iterare su una collezione

L'esempio più semplice è iterare su un intervallo.

Se vogliamo fare qualcosa 10 volte:

for n in 1:10
    do_something(n)
end

Se l'iterazione corrente non soddisfa una certa condizione, è possibile passare subito a quella successiva con un continue:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

In una forma più breve, il blocco if potrebbe essere sostituito da is_useless(n) && continue.

Si possono iterare molti altri tipi di collezione: gli elementi di un array, i caratteri di una stringa, le chiavi di un dizionario...

Il requisito è che la collezione sia iterable. Questo sarà spiegato più in dettaglio in un concetto successivo, ma in sostanza la collezione deve avere un modo per fornire l'elemento successivo quando le viene chiesto, più un modo per indicare che si è arrivati alla fine e non ci sono altri elementi.

Gli esempi visti finora iterano sull'intervallo 1:10, in cui il valore è anche l'indice del ciclo.

Più in generale, potrebbe servire l'indice e non solo il valore. Per questo si usa la funzione eachindex(), ad esempio for i in eachindex(my_array) ... end.

Comprensioni

Scrivere cicli espliciti tende a essere meno comune in Julia che in molti linguaggi tradizionali, perché ci sono varie opzioni più concise.

Una situazione particolarmente comune è quando dobbiamo costruire un nuovo vettore a partire dagli elementi di un'altra collezione (vettore, stringa, insieme... le possibilità sono molte).

Chi apprezza le comprensioni di liste in Python sarà felice di sapere che Julia può usare una sintassi simile.

L'essenza è impostare un ciclo molto compatto all'interno di un vettore.

La sintassi più semplice ha la forma result = [f(x) for x in some_collection].

Con un ciclo tradizionale, si potrebbe scrivere:

result = []
for x in some_collection
    push!(result, f(x))
end

Facoltativamente, si può aggiungere una condizione alla fine, per selezionare solo gli elementi corrispondenti della collezione:

# multiples of 3
julia> [n^2 for n in 1:10 if n%3 == 0]
3-element Vector{Int64}:
  9
 36
 81

# letters beyond 'h' in the alphabet
julia> [uppercase(c) for c in "Julia" if c > 'h']
3-element Vector{Char}:
 'U': ASCII/Unicode U+0055 (category Lu: Letter, uppercase)
 'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
 'I': ASCII/Unicode U+0049 (category Lu: Letter, uppercase)

La sintassi è simile a quella di Python, ma non identica. C'è qualche divergenza per più variabili e/o array multidimensionali, quindi questo argomento sarà trattato più in dettaglio in un concetto successivo.

Altre opzioni

Essendo un linguaggio moderno e in gran parte funzionale, Julia (naturalmente) offre vari modi per operare sulle collezioni, non solo un ciclo esplicito o un ciclo compatto in una comprensione.

Nei concetti successivi vedremo alternative come il broadcasting e le funzioni di ordine superiore.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Cicli