# for Loops

## Syntax

• for i in iter; ...; end
• while cond; ...; end
• break
• continue
• @parallel (op) for i in iter; ...; end
• @parallel for i in iter; ...; end
• @goto label
• @label label

## Remarks

Whenever it makes code shorter and easier to read, consider using higher-order functions, such as `map` or `filter`, instead of loops.

## Find smallest prime factor

In some situations, one might want to return from a function before finishing an entire loop. The `return` statement can be used for this.

``````function primefactor(n)
for i in 2:n
if n % i == 0
return i
end
end
@assert false  # unreachable
end
``````

Usage:

``````julia> primefactor(100)
2

julia> primefactor(97)
97
``````

Loops can also be terminated early with the `break` statement, which terminates just the enclosing loop instead of the entire function.

## Fizz Buzz

A common use case for a `for` loop is to iterate over a predefined range or collection, and do the same task for all its elements. For instance, here we combine a `for` loop with a conditional `if`-`elseif`-`else` statement:

``````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
``````

This is the classic Fizz Buzz interview question. The (truncated) output is:

``````1
2
Fizz
4
Buzz
Fizz
7
8
``````

## Multidimensional iteration

In Julia, a for loop can contain a comma (`,`) to specify iterating over multiple dimensions. This acts similarly to nesting a loop within another, but can be more compact. For instance, the below function generates elements of the Cartesian product of two iterables:

``````function cartesian(xs, ys)
for x in xs, y in ys
produce(x, y)
end
end
``````

Usage:

``````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)
``````

However, indexing over arrays of any dimension should be done with `eachindex`, not with a multidimensional loop (if possible):

``````s = zero(eltype(A))
for ind in eachindex(A)
s += A[ind]
end
``````

## Reduction and parallel loops

Julia provides macros to simplify distributing computation across multiple machines or workers. For instance, the following computes the sum of some number of squares, possibly in parallel.

``````function sumofsquares(A)
@parallel (+) for i in A
i ^ 2
end
end
``````

Usage:

``````julia> sumofsquares(1:10)
385
``````

For more on this topic, see the example on `@parallel` within the Parallel Processesing topic.

2016-07-28
2016-08-20
Julia Language Pedia
Icon