Julia Language
Conditionals
Поиск…
Синтаксис
- если cond; тело; конец
- если cond; тело; еще; тело; конец
- если cond; тело; elseif cond; тело; еще; конец
- если cond; тело; elseif cond; тело; конец
- cond? iftrue: iffalse
- cond && iftrue
- cond || iffalse
- ifelse (cond, iftrue, iffalse)
замечания
Все условные операторы и функции включают в себя использование булевых условий ( true
или false
). В Julia тип булевых элементов - Bool
. В отличие от некоторых других языков, другие типы чисел (например, 1
или 0
), строки, массивы и т. Д. Не могут использоваться непосредственно в условных выражениях.
Как правило, используются предикатные функции (функции, возвращающие Bool
) или операторы сравнения в условии условного оператора или функции.
if ... else выражение
Наиболее распространенным условным в Юлии является выражение if
... else
. Например, ниже мы реализуем евклидовой алгоритм вычисления наибольшего общего делителя , используя условное выражение для обработки базового случая:
mygcd(a, b) = if a == 0
abs(b)
else
mygcd(b % a, a)
end
Форма if
... else
в Julia на самом деле является выражением и имеет значение; значение представляет собой выражение в позиции хвоста (то есть последнее выражение) на ветке, которая берется. Рассмотрим следующий пример ввода:
julia> mygcd(0, -10)
10
Здесь a
равно 0
а b
равно -10
. Условие a == 0
true
, поэтому берется первая ветвь. Возвращаемое значение - abs(b)
которое равно 10
.
julia> mygcd(2, 3)
1
Здесь a
равно 2
и b
равно 3
. Условие a == 0
ложно, поэтому берется вторая ветвь, и мы вычисляем mygcd(b % a, a)
, который является mygcd(3 % 2, 2)
. Оператор %
возвращает остаток, когда 3
делится на 2
, в этом случае 1
. Таким образом, мы вычисляем mygcd(1, 2)
, и на этот раз a
равно 1
и b
равно 2
. Еще раз, a == 0
является ложным, поэтому берется вторая ветвь, и мы вычисляем mygcd(b % a, a)
, который является mygcd(0, 1)
. На этот раз возвращается a == 0
и так возвращается abs(b)
, что дает результат 1
.
if ... else statement
name = readline()
if startswith(name, "A")
println("Your name begins with A.")
else
println("Your name does not begin with A.")
end
Любое выражение, такое как выражение if
... else
, может быть помещено в позицию оператора. Это игнорирует его значение, но все же выполняет выражение для его побочных эффектов.
если утверждение
Как и любое другое выражение, возвращаемое значение выражения if
... else
можно игнорировать (и, следовательно, отбрасывать). Это обычно полезно только тогда, когда тело выражения имеет побочные эффекты, такие как запись в файл, изменение переменных или печать на экране.
Кроме того, else
филиал в if
... else
выражение не является обязательным. Например, мы можем написать следующий код для вывода на экран только в том случае, если выполнено конкретное условие:
second = Dates.second(now())
if iseven(second)
println("The current second, $second, is even.")
end
В приведенном выше примере мы используем функции времени и даты, чтобы получить текущую секунду; например, если в настоящее время 10:55:27, переменная second
будет удерживать 27
. Если это число четное, тогда строка будет напечатана на экране. В противном случае ничего не будет сделано.
Тернарный условный оператор
pushunique!(A, x) = x in A ? A : push!(A, x)
Тернарный условный оператор является менее многословным, if
... else
выражение.
Синтаксис:
[condition] ? [execute if true] : [execute if false]
В этом примере мы добавляем x
в коллекцию A
только если x
уже не находится в A
В противном случае мы оставим A
без изменений.
Тернарный оператор Ссылки:
Операторы короткого замыкания: && и ||
Для ветвления
Короткозамкнутые условные операторы &&
и ||
могут использоваться как легкие замены для следующих конструкций:
-
x && y
эквивалентноx ? y : x
-
x || y
эквивалентноx ? x : y
Одно использование для операторов короткого замыкания - это более сжатый способ проверить состояние и выполнить определенное действие в зависимости от этого условия. Например, следующий код использует оператор &&
для выдачи ошибки, если аргумент x
отрицателен:
function mysqrt(x)
x < 0 && throw(DomainError("x is negative"))
x ^ 0.5
end
||
оператор также может использоваться для проверки ошибок, за исключением того, что он вызывает ошибку, если условие не выполняется, а не если условие выполнено:
function halve(x::Integer)
iseven(x) || throw(DomainError("cannot halve an odd number"))
x ÷ 2
end
Другим полезным приложением является предоставление значения по умолчанию для объекта, только если оно не определено ранее:
isdefined(:x) || (x = NEW_VALUE)
Здесь это проверяет, определен ли символ x (т.е. если есть значение, назначенное объекту x
). Если так, то ничего не происходит. Но, если нет, то x
будет назначен NEW_VALUE
. Обратите внимание, что этот пример будет работать только в области охвата.
В условиях
Операторы также полезны, поскольку их можно использовать для проверки двух условий, вторая из которых оценивается только в зависимости от результата первого условия. Из документации Julia:
В выражении
a && b
подвыражениеb
оценивается только в том случае, еслиa
оценивает значениеtrue
В выражении
a || b
, Подвыражениеb
вычисляется только тогда , когда принимает значениеa
false
Таким образом, хотя оба a & b
и a && b
будут выдавать true
если оба a
и b
true
, их поведение, если a
false
, отличается.
Например, предположим, что мы хотим проверить, является ли объект положительным числом, где возможно, что он может даже не быть числом. Рассмотрим различия между этими двумя попытками:
CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false
CheckPositive1("a")
CheckPositive2("a")
CheckPositive1()
приведет к ошибке, если в качестве аргумента будет предоставлен нечисловой тип. Это связано с тем, что он оценивает оба выражения независимо от результата первого, а второе выражение дает ошибку при попытке оценить его для нечислового типа.
CheckPositive2()
, однако, даст false
(а не ошибку), если к нему будет добавлен нечисловой тип, поскольку второе выражение оценивается только в том случае, если первое true
.
Более одного оператора короткого замыкания можно натянуть вместе. Например:
1 > 0 && 2 > 0 && 3 > 5
если оператор с несколькими ветвями
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
Любое число ветвей elseif
может использоваться с оператором if
, возможно с или без последней ветви else
. Последующие условия будут оцениваться только в том случае, если все предыдущие условия оказались false
.
Функция ifelse
shift(x) = ifelse(x > 10, x + 1, x - 1)
Использование:
julia> shift(10)
9
julia> shift(11)
12
julia> shift(-1)
-2
Функция ifelse
будет оценивать обе ветви, даже те, которые не выбраны. Это может быть полезно, когда ветви имеют побочные эффекты, которые необходимо оценить, или потому, что они могут быть быстрее, если обе ветви сами по себе дешевы.