Trilhas
/
Julia
Julia
/
Programa
/
Intervalos
In

Intervalos em Julia

1 exercício

Sobre Intervalos

Suponha que você queira todos os números inteiros não negativos até 1000. Seria ridículo se você tivesse que digitá-los em um array.

Para isso, temos o tipo range:

julia> 0:1000
0:1000

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

Ranges são muito comuns: não só para economizar digitação, mas também como tipos de retorno de funções.

Repare que ranges não são arrays.

Arrays são definidos logo de início (avaliação "greedy"), e precisam de armazenamento proporcional ao comprimento do array.

Em contrapartida, ranges são apenas um conjunto de instruções para gerar uma sequência (avaliação "lazy", ou um "iterador").

Se você precisar de um range como array, use a função collect() para fazer a conversão:

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

Opcionalmente, use collect(type, range) para especificar o tipo do array de saída.

O tamanho do passo pode ser especificado, neste caso 0.3:

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

Então a sintaxe é start:stepsize:stop. Ambos os limites são inclusivos, como visto no exemplo com números inteiros. Se o tamanho do passo não dividir exatamente stop - start, o último elemento vai parar antes de ultrapassar stop.

Para um controle mais preciso, use a função Base.range(), que tem várias outras opções.

Ranges de letras

Sequências não numéricas também podem ser usadas em ranges. O exemplo mais simples é o das 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)

O tipo Char será abordado em mais detalhes em outro conceito. Por enquanto, trate-os apenas como caracteres únicos entre aspas simples.

Funções e operadores para ranges

Verifique os limites de um range com first() e last().

Muitas vezes é útil descobrir se um valor específico faz parte de um range. A função por trás disso é in(), mas é mais comum usar o operador infixo in ou seu sinônimo mais matemático ∈. Em um editor adequado, o atalho para ∈ é digitar \in e depois Tab.

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

O operador in ou ∈ é usado aqui com ranges, mas também pode ser usado com vários outros tipos de coleção, como vetores, conjuntos e dicionários.

Mais sobre indexação de arrays

Ranges de inteiros e arrays podem ser usados na indexação 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]

O uso com end também funciona, mas, por causa da precedência de operadores, os parênteses podem ser necessários:

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

Naturalmente, qualquer um dos elementos do índice pode ser uma variável inteira já existente.

Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Intervalos