# 10 Julia Recipes You Can't Miss

**URL:** <https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298>\
**Category:** Teaching & Outreach\
**Created:** [August 28, 2023, 3:37pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298 "2023-08-28T15:37:49Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [August 28, 2023, 3:37pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/1 "2023-08-28T15:37:49Z")

</div>

I have published a blog titled : [10 Julia Recipes You Can’t Miss](https://forem.julialang.org/vinodv/10-julia-recipes-you-cant-miss-46i6).

Please suggest alternate or efficient methods to recipes or additionally what and all other recipes that can be included in the list.

---

<div class="post-metadata">

**Author:** ![PeterSimon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petersimon/32/25193_2.png) [@PeterSimon](https://discourse.julialang.org/u/PeterSimon)\
**Post date:** [August 28, 2023, 3:47pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/2 "2023-08-28T15:47:41Z")

</div>

Suggested recipe: Unpack a subset of a named tuple:

```julia
julia> t = (a=1, b="hello", c = 3.14)
(a = 1, b = "hello", c = 3.14)

julia> (; a, c) = t; @show a; @show c;
a = 1
c = 3.14

julia> b
ERROR: UndefVarError: `b` not defined

```

---

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [August 28, 2023, 3:55pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/3 "2023-08-28T15:55:24Z")

</div>

> [@PeterSimon](#):
>
> `(; a, c) = t; @show a; @show c;`

Updated.

---

<div class="post-metadata">

**Author:** ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)\
**Post date:** [August 28, 2023, 5:09pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/4 "2023-08-28T17:09:36Z")

</div>

> [@PeterSimon](#):
>
> Unpack a subset of a named tuple

Of _any type_ with named fields

---

<div class="post-metadata">

**Author:** ![GHTaarn](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ghtaarn/32/216007_2.png) [@GHTaarn](https://discourse.julialang.org/u/GHTaarn)\
**Post date:** [August 28, 2023, 5:43pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/5 "2023-08-28T17:43:23Z")

</div>

I’m not sure what you are trying to achieve in c, but I would prefer doing

```julia
filtered = filter(>(50), temp)

```

or

```julia
filtered = filter(temp) do x
    x > 50
end

```

if the filter function was more complex.

I would only use the array comprehension if I was mapping as well, e.g.

```julia
filtered = [x + x^2 for x in temp if x > 50]

```

(My reason for this preference is readability, I have not tested execution speed)

---

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [August 29, 2023, 1:28am UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/6 "2023-08-29T01:28:16Z")

</div>

> [@GHTaarn](#):
>
> ```julia
> filtered = filter(temp) do x
> x > 50
> end
> 
> ```

Updated.  
The first one  
`filtered = filter(>(50), temp)`  
is a brilliant short hand

---

<div class="post-metadata">

**Author:** ![GHTaarn](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ghtaarn/32/216007_2.png) [@GHTaarn](https://discourse.julialang.org/u/GHTaarn)\
**Post date:** [August 29, 2023, 6:05am UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/7 "2023-08-29T06:05:58Z")

</div>

I can’t resist posting my favourite:

```julia
points = [(; x=rand(), y=rand()) for i in 1:10]
distances = [sqrt(p.x^2 + p.y^2) for p in points if p.x > p.y]

```

I don’t know about recent Java versions, but some years ago this would have required at least 10 lines of Java code.

---

<div class="post-metadata">

**Author:** ![heliosdrm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/heliosdrm/32/3851_2.png) [@heliosdrm](https://discourse.julialang.org/u/heliosdrm)\
**Post date:** [August 29, 2023, 9:06am UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/8 "2023-08-29T09:06:56Z")

</div>

Bonus for (b): besides “search-and-replace” text, you can also “search-and-apply-arbitrary-function”, e.g.:

```julia
replace(stri, "scream"=>uppercase)

```

Another thing that I like is nd-array comprehensions easily made by combining iterators:

```julia
julia> producttable = [row*col for row=1:10, col=1:3]
10×3 Matrix{Int64}:
  1 2 3
  2 4 6
  3 6 9
  4 8 12
  5 10 15
  6 12 18
  7 14 21
  8 16 24
  9 18 27
 10 20 30

```

---

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [August 29, 2023, 1:22pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/9 "2023-08-29T13:22:59Z")

</div>

> [@heliosdrm](#):
>
> `replace(stri, "scream"=>uppercase)`

Updated.

---

<div class="post-metadata">

**Author:** ![VinodV](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vinodv/32/32733_2.png) [@VinodV](https://discourse.julialang.org/u/VinodV)\
**Post date:** [August 29, 2023, 1:24pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/10 "2023-08-29T13:24:35Z")

</div>

This trick is absolutely brilliant. Is the semicolon before `x = rand()` necessary. I could run the code without it.

---

<div class="post-metadata">

**Author:** ![GHTaarn](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ghtaarn/32/216007_2.png) [@GHTaarn](https://discourse.julialang.org/u/GHTaarn)\
**Post date:** [August 29, 2023, 1:30pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/11 "2023-08-29T13:30:13Z")

</div>

Thank you. I think you are right, it seems like the `;` is not necessary, it works without it for me as well even on old versions of Julia.

---

<div class="post-metadata">

**Author:** ![nilshg](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nilshg/32/2283_2.png) [@nilshg](https://discourse.julialang.org/u/nilshg)\
**Post date:** [August 29, 2023, 1:55pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/12 "2023-08-29T13:55:05Z")

</div>

`(x = something, y = something_else)` for constructing `NamedTuple`s has been around since 1.0. The novelties since then were `(; x, y)` for constructing a `NamedTuple` from variables in scope (instead of having to write `(x=x, y=y)`) in 1.5, and then applying that to destructuring, i.e. `(; x, y) = something` where `something` is an object that has fieldnames `x` and `y` in Julia 1.7.

---

<div class="post-metadata">

**Author:** ![JeffreySarnoff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jeffreysarnoff/32/1980_2.png) [@JeffreySarnoff](https://discourse.julialang.org/u/JeffreySarnoff)\
**Post date:** [August 29, 2023, 1:57pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/13 "2023-08-29T13:57:22Z")

</div>

```julia
julia> abc = (a=1, b="hello", c = 3.14)
(a = 1, b = "hello", c = 3.14)
julia> ac = NamedTuple{(:a, :c)}(abc)
(a = 1, c = 3.14)

```

```julia
"""
    keepkeys(nt::NamedTuple, syms::Tuple{Vararg{Symbol}})

Construct a subset of `nt` using only the keys in `syms`.
""" keepkeys

julia> keepkeys(nt::NamedTuple, ks=NTuple{N,Symbol} where {N}) =
                 NamedTuple{ks}(nt)

julia> b = keepkeys(abc, (:b,))
(b = "hello",)

julia> bc = keepkeys(abc, (:b, :c))
(b = "hello", c = 3.14)

julia> keepkeys(abc, (:z,))
ERROR: type NamedTuple has no field z

```

```julia
"""
    omitkeys(nt::NamedTuple, syms::Tuple{Vararg{Symbol}})

Construct a subset of `nt` omitting the keys in `syms`.
""" omitkeys

julia> omitkeys(nt::NamedTuple, ks=NTuple{N,Symbol} where {N}) =
                  keepkeys(nt, Tuple(setdiff(keys(nt), ks)))

julia> bc = omitkeys(abc, (:a,))
(b = "hello", c = 3.14)

julia> b = omitkeys(abc, (:a, :c))
(b = "hello",)

julia> abc2 = omitkeys(abc, (:z,))
(a = 1, b = "hello", c = 3.14)

```

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [August 29, 2023, 5:27pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/14 "2023-08-29T17:27:40Z")

</div>

> [@GHTaarn](#):
>
> `sqrt(p.x^2 + p.y^2)`

`hypot(p.x, p.y)` is nicer

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [August 29, 2023, 5:50pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/15 "2023-08-29T17:50:08Z")

</div>

Only if you are familiar with that function; otherwise the formula is unambiguous and hence preferable.

---

<div class="post-metadata">

**Author:** ![alfaromartino](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alfaromartino/32/52986_2.png) [@alfaromartino](https://discourse.julialang.org/u/alfaromartino)\
**Post date:** [August 29, 2023, 5:56pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/16 "2023-08-29T17:56:27Z")

</div>

When I have to use a for-loop to get an output, I find really useful to initialize the vector as a keyword argument.  
Example:

```julia
function foo(x)
    output = similar(x)
    
    for i in eachindex(x)
        output[i] = x[i] + 1
    end

    return output
end

```

instead, I use

```julia
function foo(x; output = similar(x))    
    for i in eachindex(x)
        output[i] = x[i] + 1
    end

    return output
end

```

This is possible because you can use previous arguments to define default values of a keyword argument.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [August 29, 2023, 7:31pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/17 "2023-08-29T19:31:00Z")

</div>

I like that because the output appears in the function statement: a very handy heads-up for the user.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [August 29, 2023, 7:46pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/18 "2023-08-29T19:46:20Z")

</div>

-100. It is worth it to fire up the Julia REPL just to use this nice function and avoid the pain of writing the square root of the sum of the squares.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [August 29, 2023, 7:48pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/19 "2023-08-29T19:48:32Z")

</div>

+100=0. Sorry, I need a bit of context…

---

<div class="post-metadata">

**Author:** ![JeffreySarnoff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jeffreysarnoff/32/1980_2.png) [@JeffreySarnoff](https://discourse.julialang.org/u/JeffreySarnoff)\
**Post date:** [August 29, 2023, 9:51pm UTC](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/20 "2023-08-29T21:51:45Z")

</div>

quick note: An undefined name inside `omitkeys` is now repaired.  
q.v. [two recipes for subselecting entries in a NamedTuple](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298/13).

[Next page](https://discourse.julialang.org/t/10-julia-recipes-you-cant-miss/103298.md?page=2)
