Ra

Rangos en Julia

1 ejercicio

Acerca de Rangos

Supón que quieres todos los números enteros no negativos hasta 1000. Sería ridículo tener que escribirlos en un array.

Para esto tenemos el tipo range:

julia> 0:1000
0:1000

julia> typeof(0:1000)
UnitRange{Int64}

Los rangos son muy comunes: no solo para ahorrarte tener que escribirlos, sino también como tipos de retorno de funciones.

Fíjate que los rangos no son arrays.

Los arrays se definen desde el principio (evaluación «codiciosa»), y necesitan almacenamiento proporcional a la longitud del array.

En cambio, los rangos son solo un conjunto de instrucciones para generar una secuencia (evaluación «perezosa», o un «iterador»).

Si necesitas un rango como array, usa la función collect() para convertirlo:

julia> collect(0:5)
6-element Vector{Int64}:
 0
 1
 2
 3
 4
 5

De forma opcional, usa collect(type, range) para especificar el tipo del array de salida.

Se puede especificar el tamaño del paso, en este caso 0.3:

julia>  collect(1.0:0.3:2.0)
4-element Vector{Float64}:
 1.0
 1.3
 1.6
 1.9

Así que la sintaxis es start:stepsize:stop. Ambos límites son inclusivos, como se ve en el ejemplo con enteros. Si el tamaño del paso no divide exactamente a stop - start, el último elemento evitará superar stop.

Para un control más fino, usa la función Base.range(), que tiene varias opciones más.

Rangos de letras

En los rangos también se pueden usar secuencias no numéricas. El ejemplo más simple son las letras ASCII:

julia> 'a':'d'
'a':1:'d'

julia> typeof('a':'d')
StepRange{Char, Int64}

julia> collect('a':'d')
4-element Vector{Char}:
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)

El tipo Char se verá con más detalle en otro concepto. Por ahora, solo trátalos como caracteres individuales entre comillas simples.

Funciones y operadores para rangos

Comprueba los límites de un rango con first() y last().

A menudo es útil averiguar si un valor determinado forma parte de un rango. La función subyacente para esto es in(), pero es más común usar el operador infijo in o su sinónimo más matemático ∈. En un editor adecuado, el atajo para ∈ es \in y luego tab.

 r = 1:10  # => 1:10
 first(r)  # => 1
 last(r)   # => 10
 7 in r    # => true
 11 ∈ r    # => false

El operador in o ∈ se usa aquí con rangos, pero también se puede usar con otros tipos de colecciones, como vectores, conjuntos y diccionarios.

Más sobre la indexación de arrays

Los rangos de enteros y los arrays se pueden usar en la indexación de arrays:

nums = collect(10.0:50.0)
nums[3:2:7]  # gives [12.0, 14.0, 16.0]
nums[ [3, 5, 7] ] # also gives [12.0, 14.0, 16.0]

También funciona usarlo con end, aunque la precedencia de operadores puede hacer necesarios los paréntesis:

 nums[(end - 3):end]
4-element Vector{Float64}:
 47.0
 48.0
 49.0
 50.0

Por supuesto, cualquiera de los elementos del índice puede ser una variable entera que ya exista.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva

Aprende Rangos