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 && y
ist äquivalent zux ? y : x
-
x || y
ist ä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 && b
wird der Unterausdruckb
nur ausgewertet, wenna
Werttrue
ergibtIn dem Ausdruck
a || b
wird der Unterausdruckb
nur ausgewertet, wenna
zufalse
ausgewertet 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.