はじめに
「Pythonプログラミング入門」という、東京大学 数理・情報教育研究センターさんが作成された教材でPythonを学習しています。
Pythonの学習を進めつつ、同じ内容をElixirで置き換えてみたらどうなるだろう? という視点でも眺めています。
私はどうしようもなくElixirが好きなのです。
今日は、「数のリスト ln と数 n を受け取って、ln の要素のうち、n より大きい個数を返す関数」をやってみます。
Python
お手本は
に書いてあります。
def number_of_big_numbers(ln, n):
return sum(map(lambda x: 1, filter(lambda x: x>n, ln)))
実行してみます。
>>> number_of_big_numbers([10, 0, 7, 1, 5, 2, 9], 5)
3
Elixir
Elixirで書いてみます。
iex> number_of_big_numbers = fn ln, n ->
ln |> Enum.filter(& &1 > n) |> Enum.map(fn _ -> 1 end) |> Enum.sum()
end
iex> number_of_big_numbers.([10, 0, 7, 1, 5, 2, 9], 5)
3
上記は、Pythonのお手本に寄せてみました。
お手本といっても、「高階関数」という章立てにおいて、なんとしてでも「高階関数」を駆使するという条件下でのお手本です。
その条件を取っ払ったほうが素直なコードになります。
処理の本体は、
ln |> Enum.filter(& &1 > n) |> Enum.count()
でもよいです。
別解
iex> number_of_big_numbers2 = fn ln, n ->
for(x <- ln, x > n, do: 1) |> Enum.sum()
end
さらに別解
iex> number_of_big_numbers3 = fn ln, n ->
Enum.count(ln, & &1 > n)
end
iex> number_of_big_numbers3.([10, 0, 7, 1, 5, 2, 9], 5)
3
Enum.count/2で一撃でした。
おわりに
「数のリスト ln と数 n を受け取って、ln の要素のうち、n より大きい個数を返す関数」を楽しみました。