# Iterator over variable number of arguments

**URL:** <https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558>\
**Category:** General Usage\
**Created:** [May 6, 2017, 4:23pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558 "2017-05-06T16:23:57Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![mforets](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mforets/32/298_2.png) [@mforets](https://discourse.julialang.org/u/mforets)\
**Post date:** [May 6, 2017, 4:23pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/1 "2017-05-06T16:23:57Z")

</div>

Suppose you want to define an iterator over the vertices of the n-dimensional unit hypercube.

In two dimensions, this is:

```julia
julia> using Iterators
julia> collect(Iterators.product([-1, 1], [-1, 1]))
4-element Array{Tuple{Int64,Int64},1}:
 (-1,-1)
 (1,-1) 
 (-1,1) 
 (1,1)

```

and similarly for 3d:

```julia
julia> collect(Iterators.product([-1, 1], [-1, 1], [-1, 1]))
8-element Array{Tuple{Int64,Int64,Int64},1}:
 (-1,-1,-1)
 (1,-1,-1) 
 (-1,1,-1) 
 (1,1,-1)  
 (-1,-1,1) 
 (1,-1,1)  
 (-1,1,1)  
 (1,1,1)

```

How to do when the dimension is not known a priori?

* * *

background: in Python this is achieved with `list(itertools.product([-1, 1], repeat=n))`, or even using tuple unpacking into arguments list as in `list(itertools.product(*([-1, 1] for i in range(n))))`.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [May 6, 2017, 5:02pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/2 "2017-05-06T17:02:29Z")

</div>

I think Base.Cartesian might have an answer?

[https://docs.julialang.org/en/stable/devdocs/cartesian/](https://docs.julialang.org/en/stable/devdocs/cartesian/)

All of the example show loops but you can use it to make a generator.

---

<div class="post-metadata">

**Author:** ![ggggggggg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ggggggggg/32/265_2.png) [@ggggggggg](https://discourse.julialang.org/u/ggggggggg)\
**Post date:** [May 7, 2017, 1:39am UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/3 "2017-05-07T01:39:41Z")

</div>

Does this do what you want?

```julia
julia> n=3
3

julia> collect(Iterators.product([[1,-1] for i=1:n]...))
8-element Array{Tuple{Int64,Int64,Int64},1}:
 (1,1,1)   
 (-1,1,1)  
 (1,-1,1)  
 (-1,-1,1) 
 (1,1,-1)  
 (-1,1,-1) 
 (1,-1,-1) 
 (-1,-1,-1)

```

---

<div class="post-metadata">

**Author:** ![mforets](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mforets/32/298_2.png) [@mforets](https://discourse.julialang.org/u/mforets)\
**Post date:** [May 7, 2017, 12:47pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/4 "2017-05-07T12:47:31Z")

</div>

yes ! this `...` or [splat operator](https://docs.julialang.org/en/stable/manual/faq/?highlight=splat#splits-one-argument-into-many-different-arguments-in-function-calls) does the job.

thanks you both.

---

<div class="post-metadata">

**Author:** ![Evizero](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/evizero/32/10118_2.png) [@Evizero](https://discourse.julialang.org/u/Evizero)\
**Post date:** [May 7, 2017, 1:28pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/5 "2017-05-07T13:28:08Z")

</div>

Just for the sake of mentioning it. There is a `CornerIterator` in `ImageTransformations` that is used internally for the use-case of iterating over the corners of a n-dim hyper-cube (or hyper-rectangle I guess).

```julia
julia> using ImageTransformations

julia> collect(ImageTransformations.CornerIterator(CartesianIndex(-1,-1), CartesianIndex(1,1)))
2×2 Array{CartesianIndex{2},2}:
 CartesianIndex{2}((-1,-1)) CartesianIndex{2}((-1,1))
 CartesianIndex{2}((1,-1)) CartesianIndex{2}((1,1)) 

julia> collect(ImageTransformations.CornerIterator(CartesianIndex(-1,-1,-1), CartesianIndex(1,1,1)))
2×2×2 Array{CartesianIndex{3},3}:
[:, :, 1] =
 CartesianIndex{3}((-1,-1,-1)) CartesianIndex{3}((-1,1,-1))
 CartesianIndex{3}((1,-1,-1)) CartesianIndex{3}((1,1,-1)) 

[:, :, 2] =
 CartesianIndex{3}((-1,-1,1)) CartesianIndex{3}((-1,1,1))
 CartesianIndex{3}((1,-1,1)) CartesianIndex{3}((1,1,1)) 

```

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [May 7, 2017, 3:52pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/6 "2017-05-07T15:52:07Z")

</div>

Can it also iterate over “edges” in a hyper cube?

---

<div class="post-metadata">

**Author:** ![Evizero](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/evizero/32/10118_2.png) [@Evizero](https://discourse.julialang.org/u/Evizero)\
**Post date:** [May 7, 2017, 4:49pm UTC](https://discourse.julialang.org/t/iterator-over-variable-number-of-arguments/3558/7 "2017-05-07T16:49:45Z")

</div>

If you are asking me if I know of a similar iterator somewhere that goes along each edge, then I am afraid I don’t.
