Условия и циклы
Условные операторы и циклы 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.