Julia Language
Condicionales
Buscar..
Sintaxis
- si cond cuerpo; fin
- si cond cuerpo; más; cuerpo; fin
- si cond cuerpo; elseif cond; cuerpo; más; fin
- si cond cuerpo; elseif cond; cuerpo; fin
- cond? iftrue: iffalse
- cond && si es cierto
- cond || iffalse
- ifelse (cond, iftrue, iffalse)
Observaciones
Todos los operadores y funciones condicionales implican el uso de condiciones booleanas ( true
o false
). En Julia, el tipo de booleanos es Bool
. A diferencia de otros idiomas, otros tipos de números (como 1
o 0
), cadenas, matrices, etc. , no pueden usarse directamente en condicionales.
Típicamente, uno usa funciones de predicado (funciones que devuelven un Bool
) o operadores de comparación en la condición de un operador o función condicional.
si ... otra expresión
El condicional más común en Julia es la expresión if
... else
. Por ejemplo, a continuación implementamos el algoritmo euclidiano para calcular el mayor divisor común , utilizando un condicional para manejar el caso base:
mygcd(a, b) = if a == 0
abs(b)
else
mygcd(b % a, a)
end
La forma if
... else
en Julia es en realidad una expresión, y tiene un valor; el valor es la expresión en la posición de cola (es decir, la última expresión) en la rama que se toma. Considere la siguiente entrada de muestra:
julia> mygcd(0, -10)
10
Aquí, a
es 0
y b
es -10
. La condición a == 0
es true
, por lo que se toma la primera rama. El valor devuelto es abs(b)
que es 10
.
julia> mygcd(2, 3)
1
Aquí, a
es 2
y b
es 3
. La condición a == 0
es falsa, por lo que se toma la segunda rama y calculamos mygcd(b % a, a)
, que es mygcd(3 % 2, 2)
. El operador %
devuelve el resto cuando 3
se divide por 2
, en este caso 1
. Por lo tanto, calculamos mygcd(1, 2)
, y esta vez a
es 1
y b
es 2
. Una vez más, a == 0
es falso, por lo que se toma la segunda rama y calculamos mygcd(b % a, a)
, que es mygcd(0, 1)
. Esta vez, se devuelve a a == 0
y se devuelve abs(b)
, que da el resultado 1
.
si ... otra declaración
name = readline()
if startswith(name, "A")
println("Your name begins with A.")
else
println("Your name does not begin with A.")
end
Cualquier expresión, como la expresión if
... else
, puede colocarse en una posición de declaración. Esto ignora su valor pero sigue ejecutando la expresión para sus efectos secundarios.
si declaración
Al igual que cualquier otra expresión, el valor de retorno de una expresión if
... else
puede ignorarse (y, por lo tanto, descartarse). En general, esto solo es útil cuando el cuerpo de la expresión tiene efectos secundarios, como escribir en un archivo, mutar variables o imprimir en la pantalla.
Además, la rama else
de una expresión if
... else
es opcional. Por ejemplo, podemos escribir el siguiente código para enviar a la pantalla solo si se cumple una condición particular:
second = Dates.second(now())
if iseven(second)
println("The current second, $second, is even.")
end
En el ejemplo anterior, usamos las funciones de fecha y hora para obtener el segundo actual; por ejemplo, si actualmente es 10:55:27, la variable second
mantendrá 27
. Si este número es par, entonces se imprimirá una línea en la pantalla. De lo contrario, no se hará nada.
Operador condicional ternario
pushunique!(A, x) = x in A ? A : push!(A, x)
El operador condicional ternario es una expresión menos wordy if
... else
.
La sintaxis específicamente es:
[condition] ? [execute if true] : [execute if false]
En este ejemplo, agregamos x
a la colección A
solo si x
no está ya en A
De lo contrario, simplemente dejamos A
sin cambios.
Referencias del operador ternario:
Operadores de cortocircuito: && y ||
Para ramificación
Los operadores condicionales de cortocircuito &&
y ||
Puede usarse como reemplazos ligeros para las siguientes construcciones:
-
x && y
es equivalente ax ? y : x
-
x || y
es equivalente ax ? x : y
Un uso para operadores de cortocircuito es como una forma más concisa de probar una condición y realizar una determinada acción dependiendo de esa condición. Por ejemplo, el siguiente código utiliza el operador &&
para lanzar un error si el argumento x
es negativo:
function mysqrt(x)
x < 0 && throw(DomainError("x is negative"))
x ^ 0.5
end
El ||
El operador también se puede usar para la comprobación de errores, excepto que activa el error a menos que se cumpla una condición, en lugar de si la condición se cumple
function halve(x::Integer)
iseven(x) || throw(DomainError("cannot halve an odd number"))
x ÷ 2
end
Otra aplicación útil de esto es proporcionar un valor predeterminado a un objeto, solo si no está definido previamente:
isdefined(:x) || (x = NEW_VALUE)
Aquí, esto comprueba si el símbolo x está definido (es decir, si hay un valor asignado al objeto x
). Si es así, entonces no pasa nada. Pero, si no, entonces a x
se le asignará NEW_VALUE
. Tenga en cuenta que este ejemplo solo funcionará en un alcance de nivel superior.
En condiciones
Los operadores también son útiles porque se pueden usar para probar dos condiciones, la segunda de las cuales solo se evalúa según el resultado de la primera condición. De la documentación de Julia:
En la expresión
a && b
, la subexpresiónb
solo se evalúa sia
evalúa comotrue
En la expresión
a || b
, la subexpresiónb
solo se evalúa sia
evalúa comofalse
Por lo tanto, mientras tanto a & b
como a && b
resultarán true
si a
y b
son true
, su comportamiento si a
es false
es diferente.
Por ejemplo, supongamos que deseamos verificar si un objeto es un número positivo, donde es posible que ni siquiera sea un número. Considere las diferencias entre estos dos intentos de implementación:
CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false
CheckPositive1("a")
CheckPositive2("a")
CheckPositive1()
producirá un error si se le proporciona un tipo no numérico como argumento. Esto se debe a que evalúa ambas expresiones, independientemente del resultado de la primera, y la segunda expresión producirá un error cuando uno intenta evaluarla para un tipo no numérico.
CheckPositive2()
embargo, CheckPositive2()
producirá false
(en lugar de un error) si se le proporciona un tipo no numérico, ya que la segunda expresión solo se evalúa si la primera es true
.
Más de un operador de cortocircuito se puede unir. P.ej:
1 > 0 && 2 > 0 && 3 > 5
Si la declaración con múltiples sucursales
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
Se puede utilizar cualquier número de ramas elseif
con una sentencia if
, posiblemente con o sin una rama else
final. Las condiciones subsiguientes solo se evaluarán si todas las condiciones anteriores han resultado ser false
.
La función ifelse
shift(x) = ifelse(x > 10, x + 1, x - 1)
Uso:
julia> shift(10)
9
julia> shift(11)
12
julia> shift(-1)
-2
La función ifelse
evaluará ambas ramas, incluso la que no está seleccionada. Esto puede ser útil cuando las ramas tienen efectos secundarios que deben evaluarse, o porque puede ser más rápido si ambas ramas son baratas.