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 zu x ? y : x
  • x || y ist äquivalent zu x ? 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 Unterausdruck b nur ausgewertet, wenn a Wert true ergibt

In dem Ausdruck a || b wird der Unterausdruck b nur ausgewertet, wenn a zu false 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow