Треки
/
Julia
Julia
/
Салабус
/
Діапазони
Ді

Діапазони у Julia

1 вправа

Про концепцію Діапазони

Уявімо, що нам потрібні всі невідʼємні цілі числа до 1000. Було б безглуздо вводити їх усі в масив.

Для цього є тип range:

julia> 0:1000
0:1000

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

Діапазони дуже поширені: не лише для того, щоб не набирати їх вручну, а й як типи, що їх повертають функції.

Зауважмо, що діапазони не є масивами.

Масиви визначаються одразу («жадібне» обчислення) і потребують обсягу памʼяті, пропорційного довжині масиву.

На відміну від них, діапазони лише задають набір інструкцій для генерування послідовності («ліниве» обчислення, або «ітератор»).

Якщо потрібен діапазон як масив, скористаймося функцією collect() для перетворення:

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

За бажанням можна вказати тип вихідного масиву за допомогою collect(type, range).

Можна вказати крок, у цьому випадку 0.3:

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

Отже, синтаксис має такий вигляд: start:stepsize:stop. Обидві кінцеві межі включно, як видно з прикладу з цілими числами. Якщо крок не ділить stop - start націло, останній елемент не перевищуватиме stop.

Для точнішого керування скористаймося функцією Base.range(), яка має кілька додаткових параметрів.

Діапазони літер

У діапазонах можна також використовувати нечислові послідовності. Як найпростіший приклад візьмімо літери 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)

Тип Char докладніше розглянемо в іншій концепції. Поки що просто вважатимемо їх окремими символами в одинарних лапках.

Функції та оператори для діапазонів

Перевіряймо межі діапазону за допомогою first() і last().

Часто корисно зʼясувати, чи належить конкретне значення діапазону. Відповідна функція для цього - in(), але частіше використовують інфіксний оператор in або його більш математичний синонім ∈. У відповідному редакторі скорочення для ∈ - це \in, після чого натискають Tab.

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

Оператор in або ∈ тут використовується з діапазонами, але його також можна використовувати з кількома іншими типами колекцій, як-от вектори, множини та словники.

Докладніше про індексацію масивів

Цілочисельні діапазони та масиви можна використовувати в індексації масивів:

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]

Використання з end також працює, хоча через пріоритет операторів можуть знадобитися дужки:

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

Звісно, будь-який з елементів індексу може бути вже наявною цілочисельною змінною.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Діапазони