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 a x ? y : x
  • x || y es equivalente a x ? 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ón b solo se evalúa si a evalúa como true

En la expresión a || b , la subexpresión b solo se evalúa si a evalúa como false

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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow