Julia Language
Conditionals
Suche…
Syntax
- wenn cond; Karosserie; Ende
- wenn cond; Karosserie; sonst; Karosserie; Ende
- wenn cond; Karosserie; elseif cond; Karosserie; sonst; Ende
- wenn cond; Karosserie; elseif cond; Karosserie; Ende
- cond iftrue: iffalse
- cond && iftrue
- cond || iffalse
- ifelse (cond, iftrue, iffalse)
Bemerkungen
Alle bedingten Operatoren und Funktionen erfordern die Verwendung boolescher Bedingungen ( true oder false ). In Julia ist der Typ von Booleans Bool . Im Gegensatz zu anderen Sprachen können andere Arten von Zahlen (wie 1 oder 0 ), Zeichenfolgen, Arrays usw. nicht direkt in Bedingungen verwendet werden.
Normalerweise verwendet man entweder Prädikatfunktionen (Funktionen, die ein Bool ) oder Vergleichsoperatoren im Zustand eines bedingten Operators oder einer Funktion.
wenn ... sonst Ausdruck
Die häufigste Bedingung in Julia ist der if ... else Ausdruck. Im Folgenden implementieren wir zum Beispiel den Euklidischen Algorithmus zur Berechnung des größten gemeinsamen Divisors unter Verwendung einer Bedingung, um den Basisfall zu behandeln:
mygcd(a, b) = if a == 0
abs(b)
else
mygcd(b % a, a)
end
Das if ... else Formular in Julia ist tatsächlich ein Ausdruck und hat einen Wert. Der Wert ist der Ausdruck in Endposition (d. h. der letzte Ausdruck) in der Verzweigung. Betrachten Sie die folgende Beispieleingabe:
julia> mygcd(0, -10)
10
Hier ist a 0 und b ist -10 . Die Bedingung a == 0 ist true , also wird der erste Zweig genommen. Der zurückgegebene Wert ist abs(b) , also 10 .
julia> mygcd(2, 3)
1
Hier ist a 2 und b 3 . Die Bedingung a == 0 ist falsch, also wird der zweite Zweig genommen und wir berechnen mygcd(b % a, a) , was mygcd(3 % 2, 2) . Der Operator % gibt den Rest zurück, wenn 3 durch 2 dividiert wird, in diesem Fall 1 . Somit berechnen wir mygcd(1, 2) , und diesmal a ist 1 , und b ist 2 . Wieder ist a == 0 falsch, also wird der zweite Zweig genommen, und wir berechnen mygcd(b % a, a) , was mygcd(0, 1) . Diesmal wird endlich a == 0 und so wird abs(b) zurückgegeben, was das Ergebnis 1 ergibt.
wenn ... sonst eine Aussage
name = readline()
if startswith(name, "A")
println("Your name begins with A.")
else
println("Your name does not begin with A.")
end
Jeder Ausdruck, beispielsweise der if ... else Ausdruck, kann an die Anweisungsposition gesetzt werden. Dies ignoriert seinen Wert, führt jedoch immer noch den Ausdruck für die Nebeneffekte aus.
wenn Aussage
Der Rückgabewert eines if ... else Ausdrucks kann wie jeder andere Ausdruck ignoriert (und somit verworfen werden). Dies ist im Allgemeinen nur nützlich, wenn der Hauptteil des Ausdrucks Nebenwirkungen hat, z. B. das Schreiben in eine Datei, das Variieren von Variablen oder das Drucken auf dem Bildschirm.
Außerdem ist der else Zweig eines if ... else Ausdrucks optional. Zum Beispiel können wir den folgenden Code nur für die Ausgabe auf dem Bildschirm schreiben, wenn eine bestimmte Bedingung erfüllt ist:
second = Dates.second(now())
if iseven(second)
println("The current second, $second, is even.")
end
Im obigen Beispiel verwenden wir Zeit- und Datumsfunktionen , um die aktuelle Sekunde abzurufen. Wenn es zum Beispiel 10:55:27 ist, wird die second Variable 27 halten. Wenn diese Anzahl gerade ist, wird eine Zeile auf den Bildschirm gedruckt. Sonst wird nichts unternommen.
Ternärer bedingter Operator
pushunique!(A, x) = x in A ? A : push!(A, x)
Der ternäre Bedingungsoperator ist ein weniger wortreicher if ... else Ausdruck.
Die Syntax lautet speziell:
[condition] ? [execute if true] : [execute if false]
In diesem Beispiel fügen wir x auf die Sammlung A nur dann , wenn x nicht bereits in ist A . Ansonsten lassen wir A einfach unverändert.
Ternärer Betreiber Referenzen:
Kurzschlussoperatoren: && und ||
Zum Verzweigen
Die kurzschließenden bedingten Operatoren && und || kann als leichter Ersatz für die folgenden Konstrukte verwendet werden:
-
x && yist äquivalent zux ? y : x -
x || yist äquivalent zux ? x : y
Eine Anwendung für Kurzschlussoperatoren ist die präzisere Möglichkeit, eine Bedingung zu testen und abhängig von dieser Bedingung eine bestimmte Aktion auszuführen. Im folgenden Code wird beispielsweise mit dem Operator && ein Fehler && , wenn das Argument x negativ ist:
function mysqrt(x)
x < 0 && throw(DomainError("x is negative"))
x ^ 0.5
end
Die || Der Operator kann auch zur Fehlerüberprüfung verwendet werden, außer dass er den Fehler auslöst, es sei denn, eine Bedingung gilt, und nicht, wenn die Bedingung gilt:
function halve(x::Integer)
iseven(x) || throw(DomainError("cannot halve an odd number"))
x ÷ 2
end
Eine weitere nützliche Anwendung ist, einem Objekt einen Standardwert zu übergeben, sofern es nicht zuvor definiert wurde:
isdefined(:x) || (x = NEW_VALUE)
Hier wird geprüft, ob das Symbol x definiert ist (dh ob dem Objekt x ein Wert zugeordnet ist). Wenn ja, passiert nichts. Wenn nicht, wird x NEW_VALUE zugewiesen. Beachten Sie, dass dieses Beispiel nur im Toplevel-Bereich funktioniert.
Unter Bedingungen
Die Operatoren sind auch nützlich, da mit ihnen zwei Bedingungen getestet werden können, von denen die zweite nur in Abhängigkeit vom Ergebnis der ersten Bedingung ausgewertet wird. Aus der Julia- Dokumentation :
Im Ausdruck
a && bwird der Unterausdruckbnur ausgewertet, wennaWerttrueergibtIn dem Ausdruck
a || bwird der Unterausdruckbnur ausgewertet, wennazufalseausgewertet wird
Während sowohl a & b als auch a && b true wenn sowohl a als auch b true , ist ihr Verhalten anders, wenn a false ist.
Nehmen wir zum Beispiel an, wir möchten prüfen, ob ein Objekt eine positive Zahl ist, wobei es sich möglicherweise um eine Zahl handelt. Berücksichtigen Sie die Unterschiede zwischen diesen beiden versuchten Implementierungen:
CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false
CheckPositive1("a")
CheckPositive2("a")
CheckPositive1() gibt einen Fehler aus, wenn ein nicht numerischer Typ als Argument angegeben wird. Dies liegt daran, dass beide Ausdrücke unabhängig vom Ergebnis des ersten ausgewertet werden und der zweite Ausdruck einen Fehler ausgibt, wenn versucht wird, ihn für einen nicht numerischen Typ auszuwerten.
CheckPositive2() liefert jedoch false (anstatt eines Fehlers), wenn ein nicht numerischer Typ angegeben wird, da der zweite Ausdruck nur ausgewertet wird, wenn der erste true .
Es können mehrere Kurzschlussoperatoren aneinandergereiht werden. Z.B:
1 > 0 && 2 > 0 && 3 > 5
if-Anweisung mit mehreren Zweigen
d = Dates.dayofweek(now())
if d == 7
println("It is Sunday!")
elseif d == 6
println("It is Saturday!")
elseif d == 5
println("Almost the weekend!")
else
println("Not the weekend yet...")
end
Mit einer if Anweisung kann eine beliebige Anzahl von elseif Zweigen verwendet werden, möglicherweise mit oder ohne elseif else Zweig. Nachfolgende Bedingungen werden nur ausgewertet, wenn alle vorherigen Bedingungen als false befunden wurden.
Die ifelse-Funktion
shift(x) = ifelse(x > 10, x + 1, x - 1)
Verwendungszweck:
julia> shift(10)
9
julia> shift(11)
12
julia> shift(-1)
-2
Die ifelse Funktion wertet beide Zweige aus, auch den nicht ausgewählten. Dies kann nützlich sein, wenn die Zweige Nebenwirkungen haben, die bewertet werden müssen, oder weil es schneller sein kann, wenn beide Zweige selbst billig sind.