Условия и циклы

Условные операторы и циклы Julia с фирменным завершением блоков ключевым словом end.

В Julia блоки кода не выделяются отступами (как в Python) и не фигурными скобками (как в C). Каждый блок завершается ключевым словом end.

Условия

x = 7
if x < 0
    println("отрицательное")
elseif x == 0
    println("ноль")
else
    println("положительное")
end

Вывод:

положительное

Обратите внимание: elseif пишется слитно (в Python — elif, в большинстве C-языков — else if). Условие должно быть именно Bool: в отличие от Python, число или строка в условии вызовут ошибку, а не приведутся к «истинности».

Тернарный оператор

age = 20
status = age >= 18 ? "взрослый" : "ребёнок"
println(status)

Вывод:

взрослый

Цикл for и диапазоны

Цикл for перебирает любой итерируемый объект. Диапазон 1:5 включает обе границы:

for i in 1:5
    print(i, " ")
end
println()

for fruit in ["яблоко", "груша"]
    println(fruit)
end

Вывод:

1 2 3 4 5 
яблоко
груша

Диапазон с шагом: 1:2:10 даёт 1, 3, 5, 7, 9. Обратный: 10:-1:1.

Цикл while

n = 1
while n <= 100
    n = n * 2
end
println(n)

Вывод:

128

Внутри циклов работают break (выйти) и continue (перейти к следующей итерации) — так же, как в Python.

Перебор с индексом

Аналог enumerate в Python:

colors = ["красный", "зелёный", "синий"]
for (i, c) in enumerate(colors)
    println("$i: $c")
end

Вывод:

1: красный
2: зелёный
3: синий

Как работает под капотом

Диапазон 1:1000000 не создаёт массив из миллиона чисел — это «ленивый» объект UnitRange, который хранит только начало, конец и шаг, а значения порождает по ходу цикла. Поэтому циклы по большим диапазонам не тратят память. Если вам нужен именно массив из диапазона, его материализуют функцией collect(1:5).

Частые ошибки

Главная ловушка для пришедших из Python — забыть end в конце блока: код просто не скомпилируется. Вторая — рассчитывать на «истинность» не-булевых значений: if x для числа x вызовет ошибку «non-boolean used in boolean context». Пишите явное условие, например if x != 0.

Итоги

  • Все блоки завершаются ключевым словом end.
  • Условие if требует именно Bool; elseif пишется слитно.
  • Диапазон a:b включает обе границы; a:шаг:b задаёт шаг.
  • Диапазоны ленивы и не тратят память; для массива нужен collect.
  • Перебор с номером — через enumerate.
Проверьте себя
1. Чем в Julia завершается блок if или for?
AОтступом, как в Python
BЗакрывающей фигурной скобкой
CКлючевым словом end
DТочкой с запятой
2. Что произойдёт, если написать if x, где x — число, а не Bool?
AЛюбое ненулевое число будет истиной, как в Python
BВозникнет ошибка: условие должно быть булевым
CЧисло приведётся к строке
DЦикл выполнится бесконечно
3. Сколько памяти занимает объект диапазона 1:1000000?
AПамять под миллион чисел
BСовсем немного: хранятся только начало, шаг и конец
CЗависит от шага
DДиапазоны в Julia запрещены