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 todos 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 teclear, sino también como tipos devueltos por funciones.

Ten en cuenta 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

Opcionalmente, 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 stop - start, el último elemento evitará superar stop.

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

Rangos de letras

Las secuencias no numéricas también se pueden usar en rangos. El ejemplo más sencillo 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 tratará con más detalle en otro concepto. Por ahora, trátalos simplemente 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 concreto 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 tabulador.

 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]

Usarlo con end también funciona, aunque la precedencia de operadores hace que los paréntesis puedan ser necesarios:

 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 ya existente.

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

Aprende Rangos