Julia Language
Warunkowe
Szukaj…
Składnia
- jeśli cond; ciało; koniec
- jeśli cond; ciało; jeszcze; ciało; koniec
- jeśli cond; ciało; else if cond; ciało; jeszcze; koniec
- jeśli cond; ciało; else if cond; ciało; koniec
- Cond? iftrue: iffalse
- cond && iftrue
- war || iffalse
- ifelse (cond, iftrue, iffalse)
Uwagi
Wszystkie operatory warunkowe i funkcje wymagają użycia warunków logicznych ( true
lub false
). W Julii typem booleanów jest Bool
. W przeciwieństwie do niektórych innych języków, innych rodzajów liczb (takich jak 1
lub 0
), ciągów, tablic itp. Nie można używać bezpośrednio w warunkowych.
Zazwyczaj używa się funkcji predykatu (funkcje zwracające wartość Bool
) lub operatorów porównania w warunkach operatora warunkowego lub funkcji.
jeśli ... jeszcze wyrażenie
Najczęstszym warunkiem w Julii jest wyrażenie if
... else
. Na przykład poniżej implementujemy algorytm euklidesowy do obliczania największego wspólnego dzielnika , wykorzystując warunek do obsługi przypadku podstawowego:
mygcd(a, b) = if a == 0
abs(b)
else
mygcd(b % a, a)
end
Forma if
... else
w Julii jest w rzeczywistości wyrażeniem i ma wartość; wartość jest wyrażeniem w pozycji ogona (to jest ostatnim wyrażeniem) na branej gałęzi. Rozważ następujące przykładowe dane wejściowe:
julia> mygcd(0, -10)
10
Tutaj a
wynosi 0
a b
oznacza -10
. Warunek a == 0
jest true
, więc brana jest pierwsza gałąź. Zwrócona wartość to abs(b)
która wynosi 10
.
julia> mygcd(2, 3)
1
Tutaj a
oznacza 2
a b
oznacza 3
. Warunek a == 0
jest fałszem, więc brana jest druga gałąź i obliczamy mygcd(b % a, a)
, czyli mygcd(3 % 2, 2)
. Operator %
zwraca resztę, gdy 3
jest dzielone przez 2
, w tym przypadku 1
. W ten sposób obliczamy mygcd(1, 2)
, a tym razem a
wynosi 1
a b
wynosi 2
. Ponownie a == 0
jest fałszem, więc brana jest druga gałąź i obliczamy mygcd(b % a, a)
, czyli mygcd(0, 1)
. Tym razem a == 0
a więc zwracany jest abs(b)
, co daje wynik 1
.
jeśli ... oświadczenie else
name = readline()
if startswith(name, "A")
println("Your name begins with A.")
else
println("Your name does not begin with A.")
end
Każde wyrażenie, takie jak wyrażenie if
... else
, można ustawić w pozycji instrukcji. To ignoruje jego wartość, ale nadal wykonuje wyrażenie dla skutków ubocznych.
instrukcja if
Jak każde inne wyrażenie, wartość zwracaną wyrażenia if
... else
można zignorować (a tym samym odrzucić). Jest to na ogół przydatne tylko wtedy, gdy treść wyrażenia ma skutki uboczne, takie jak zapis do pliku, mutowanie zmiennych lub drukowanie na ekranie.
Ponadto, else
oddział if
... else
wyrazu jest opcjonalne. Na przykład możemy napisać następujący kod, aby wyświetlić go na ekranie tylko wtedy, gdy spełniony jest określony warunek:
second = Dates.second(now())
if iseven(second)
println("The current second, $second, is even.")
end
W powyższym przykładzie używamy funkcji godziny i daty, aby uzyskać bieżącą sekundę; na przykład, jeśli aktualnie jest 10:55:27, zmienna second
będzie zawierać 27
. Jeśli ta liczba jest parzysta, linia zostanie wydrukowana na ekranie. W przeciwnym razie nic nie zostanie zrobione.
Trójskładnikowy operator warunkowy
pushunique!(A, x) = x in A ? A : push!(A, x)
Trójskładnikowy operator warunkowy jest mniej skomplikowanym wyrażeniem, if
... else
.
Składnia jest w szczególności:
[condition] ? [execute if true] : [execute if false]
W tym przykładzie dodajemy x
do kolekcji A
tylko wtedy, gdy x
nie jest już w A
W przeciwnym razie pozostawiamy A
bez zmian.
Referencje operatora trójskładnikowego:
Operatorzy zwarciowi: && i ||
Do rozgałęzienia
Zwarciowe operatory warunkowe &&
i ||
może być stosowany jako lekki zamiennik dla następujących konstrukcji:
-
x && y
jest równoważnex ? y : x
-
x || y
jest równoważnex ? x : y
Jednym z zastosowań dla operatorów zwarciowych jest bardziej zwięzły sposób przetestowania stanu i wykonania określonej czynności w zależności od tego stanu. Na przykład poniższy kod używa operatora &&
do zgłaszania błędu, jeśli argument x
jest ujemny:
function mysqrt(x)
x < 0 && throw(DomainError("x is negative"))
x ^ 0.5
end
||
operator może być również używany do sprawdzania błędów, z wyjątkiem tego, że wyzwala błąd, chyba że warunek się utrzymuje, zamiast tego, jeśli warunek się utrzymuje:
function halve(x::Integer)
iseven(x) || throw(DomainError("cannot halve an odd number"))
x ÷ 2
end
Innym przydatnym zastosowaniem tego jest dostarczenie wartości domyślnej do obiektu, tylko jeśli nie jest on wcześniej zdefiniowany:
isdefined(:x) || (x = NEW_VALUE)
Tutaj sprawdza się, czy zdefiniowano symbol x (tj. Czy do obiektu x
przypisana jest wartość). Jeśli tak, to nic się nie dzieje. Ale jeśli nie, to x
zostanie przypisane NEW_VALUE
. Pamiętaj, że ten przykład będzie działał tylko w zakresie najwyższego poziomu.
W warunkach
Operatory są również przydatne, ponieważ można ich użyć do przetestowania dwóch warunków, z których drugi jest oceniany tylko w zależności od wyniku pierwszego warunku. Z dokumentacji Julii:
W wyrażeniu
a && b
podwyrażenieb
jest oceniane tylko wtedy,a
wartośća
jesttrue
W wyrażeniu
a || b
, podwyrażenieb
jest oceniane tylko wtedy, gdya
jesta
false
Tak więc, podczas gdy zarówno a & b
i a && b
dają true
jeśli oba a
i b
są true
, ich zachowanie, jeśli a
jest false
jest inne.
Załóżmy na przykład, że chcemy sprawdzić, czy obiekt jest liczbą dodatnią, w przypadku gdy możliwe, że nie jest to nawet liczba. Rozważ różnice między tymi dwiema próbami implementacji:
CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false
CheckPositive1("a")
CheckPositive2("a")
CheckPositive1()
zwróci błąd, jeśli CheckPositive1()
zostanie CheckPositive1()
jako argument. Wynika to z tego, że ocenia oba wyrażenia, niezależnie od wyniku pierwszego, a drugie wyrażenie spowoduje błąd, gdy ktoś spróbuje go ocenić dla typu nienumerycznego.
CheckPositive2()
da jednak wartość false
(zamiast błędu), jeśli zostanie do niej CheckPositive2()
typ nienumeryczny, ponieważ drugie wyrażenie jest oceniane tylko wtedy, gdy pierwsze jest true
.
Można połączyć razem więcej niż jednego operatora zwarciowego. Na przykład:
1 > 0 && 2 > 0 && 3 > 5
instrukcja if z wieloma gałęziami
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
Dowolna liczba gałęzi elseif
może być używana z instrukcją if
, ewentualnie z końcową gałęzią else
lub bez niej. Kolejne warunki zostaną ocenione tylko wtedy, gdy wszystkie wcześniejsze warunki zostaną uznane za false
.
Funkcja ifelse
shift(x) = ifelse(x > 10, x + 1, x - 1)
Stosowanie:
julia> shift(10)
9
julia> shift(11)
12
julia> shift(-1)
-2
Funkcja ifelse
oceni obie gałęzie, nawet tę, która nie została wybrana. Może to być przydatne, gdy oddziały mają skutki uboczne, które należy ocenić, lub ponieważ może być szybsze, jeśli obie gałęzie są tanie.