Tracks
/
Julia
Julia
/
Lehrplan
/
Schleifen
Sc

Schleifen in Julia

2 Übungen

Über Schleifen

Es gibt im Wesentlichen zwei Arten von Schleifen:

  1. So lange wiederholen, bis eine Bedingung erfüllt ist.
  2. Über die Elemente einer Sammlung wiederholen.

Beides ist in Julia möglich, wobei die zweite Variante häufiger vorkommt.

Die while-Schleife

Für Probleme ohne festes Ende, bei denen im Voraus nicht klar ist, wie oft die Schleife durchlaufen wird, hat Julia die while-Schleife.

Die Grundform ist recht einfach:

while condition
    do_something()
end

In diesem Fall läuft das Programm so lange durch die Schleife, bis condition nicht mehr true ist.

Es gibt zwei Möglichkeiten, die Schleife vorzeitig zu verlassen:

  • Ein break beendet die Schleife, und die Ausführung wird in der nächsten Zeile nach dem end der Schleife fortgesetzt.
  • Ein return x beendet die Ausführung der aktuellen Funktion und gibt den Rückgabewert x an den Aufrufer zurück.

Mit diesen Möglichkeiten kann es manchmal praktisch sein, eine „Endlosschleife“ mit while true ... end zu erzeugen und sich dann darauf zu verlassen, dass sich im Schleifenblock eine Abbruchbedingung findet, die ein break oder return auslöst.

Über eine Sammlung iterieren

Das einfachste Beispiel ist eine Schleife über einen Bereich.

Wenn wir etwas zehnmal machen wollen:

for n in 1:10
    do_something(n)
end

Wenn die aktuelle Iteration eine Bedingung nicht erfüllt, kannst du mit einem continue sofort zur nächsten Iteration springen:

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

In einer kürzeren Form lässt sich der if-Block durch is_useless(n) && continue ersetzen.

Über viele andere Sammlungstypen kann man ebenfalls iterieren: Elemente in einem Array, Zeichen in einem String, Schlüssel in einem Wörterbuch …

Die Voraussetzung ist, dass die Sammlung iterable ist. Das wird in einem späteren Konzept genauer erklärt, aber im Kern muss die Sammlung eine Möglichkeit bieten, das nächste Element zu liefern, wenn sie danach gefragt wird, und außerdem anzeigen können, dass das Ende erreicht ist und es keine weiteren Elemente gibt.

Die bisherigen Beispiele durchlaufen den Bereich 1:10, wobei der Wert gleichzeitig der Schleifenindex ist.

Allgemeiner kann manchmal der Index gebraucht werden und nicht nur der Wert. Dafür verwendet man die Funktion eachindex(), zum Beispiel for i in eachindex(my_array) ... end.

Comprehensions

Explizite Schleifen zu schreiben, ist in Julia weniger üblich als in vielen traditionellen Sprachen, weil es verschiedene kürzere Möglichkeiten gibt.

Besonders häufig kommt es vor, dass wir einen neuen Vektor aus den Elementen einer anderen Sammlung aufbauen müssen (Vektor, String, Set … es gibt viele Möglichkeiten).

Wer Listen-Comprehensions in Python mag, wird sich freuen, dass Julia eine ähnliche Syntax verwenden kann.

Im Kern geht es darum, eine sehr kompakte Schleife innerhalb eines Vektors aufzubauen.

Die einfachste Syntax hat die Form result = [f(x) for x in some_collection].

Mit einer traditionellen Schleife könnte man das so schreiben:

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

Optional kann am Ende eine Bedingung ergänzt werden, um nur die passenden Elemente der Sammlung auszuwählen:

# 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)

Die Syntax ist Python ähnlich, aber nicht identisch. Bei mehreren Variablen und/oder mehrdimensionalen Arrays gibt es einige Unterschiede, daher wird dieses Thema in einem späteren Konzept genauer behandelt.

Weitere Möglichkeiten

Als moderne, überwiegend funktionale Sprache bietet Julia (natürlich) viele Möglichkeiten, mit Sammlungen zu arbeiten, nicht nur eine explizite Schleife oder eine kompakte Schleife in einer Comprehension.

Spätere Konzepte betrachten Alternativen wie Broadcasting und Funktionen höherer Ordnung.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Schleifen