Julia Language
для циклов
Поиск…
Синтаксис
- для i в iter; ...; конец
- в то время как cond; ...; конец
- перерыв
- Продолжить
- @parallel (op) для i в iter; ...; конец
- @parallel для i в iter; ...; конец
- @goto label
- метка @label
замечания
Всякий раз, когда он делает код короче и легче читать, рассмотрите возможность использования более высоких функций, таких как map
или filter
, вместо циклов.
Fizz Buzz
Обычный прецедент для цикла for
состоит в том, чтобы перебирать предопределенный диапазон или коллекцию и выполнять одну и ту же задачу для всех своих элементов. Например, здесь мы объединяем цикл for
с условным выражением if
elseif
else
:
for i in 1:100
if i % 15 == 0
println("FizzBuzz")
elseif i % 3 == 0
println("Fizz")
elseif i % 5 == 0
println("Buzz")
else
println(i)
end
end
Это классический вопрос интервью Fizz Buzz . Выход (усеченный):
1
2
Fizz
4
Buzz
Fizz
7
8
Найти наименьший первичный коэффициент
В некоторых ситуациях можно вернуться из функции до завершения всего цикла. Для этого можно использовать оператор return
.
function primefactor(n)
for i in 2:n
if n % i == 0
return i
end
end
@assert false # unreachable
end
Использование:
julia> primefactor(100)
2
julia> primefactor(97)
97
Циклы также могут быть завершены на ранней стадии с помощью инструкции break
, которая завершает только замкнутый цикл вместо целой функции.
Многомерная итерация
В Julia цикл for может содержать запятую ( ,
) для указания итерации по нескольким измерениям. Это действует аналогично вложению петли в другую, но может быть более компактным. Например, приведенная ниже функция порождает элементы декартова произведения двух итераций:
function cartesian(xs, ys)
for x in xs, y in ys
produce(x, y)
end
end
Использование:
julia> collect(@task cartesian(1:2, 1:4))
8-element Array{Tuple{Int64,Int64},1}:
(1,1)
(1,2)
(1,3)
(1,4)
(2,1)
(2,2)
(2,3)
(2,4)
Однако индексирование по массивам любого измерения должно выполняться с eachindex
, а не с многомерным циклом (если возможно):
s = zero(eltype(A))
for ind in eachindex(A)
s += A[ind]
end
Редукционные и параллельные петли
Julia предоставляет макросы для упрощения распределения вычислений на нескольких машинах или рабочих. Например, следующее вычисляет сумму некоторого числа квадратов, возможно, параллельно.
function sumofsquares(A)
@parallel (+) for i in A
i ^ 2
end
end
Использование:
julia> sumofsquares(1:10)
385
Более подробная информация по этой теме, см пример на @parallel
в рамках параллельной Processesing теме .