Поиск…


Синтаксис

  • для 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 теме .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow