TL;DR
PythonでもPyFunctionalってライブラリを入れれば楽に配列操作できるよってお話
注意書き
この記事は基本的にPython3の話です。
インストール方法
pip3 install pyfunctional
使用例
Pythonは配列操作がRubyやJSと違って大変です。
例えば、0から9までの数字で偶数のものを2乗した配列が欲しいとします。
(お題は適当に考えたから深く気にしないで)
例:Ruby
Rubyだと以下のように書けます。
すごく楽でいいです
numbers = (0..9).select { |n|
n % 2 == 0
}.map { |n|
n * n
}
print numbers
# [0, 4, 16, 36, 64]
例:JavaScript
JavaScriptだとこうなります。
JavaScriptにも連番作る関数ください。
var numbers = [...Array(10).keys()]
.filter(n => n % 2 == 0)
.map(n => n * n)
console.log(numbers)
// [0, 4, 16, 36, 64]
例:Python
pythonだと以下のようになります。
辛い……
numbers = []
for n in range(10):
if (n % 2 == 0):
numbers.append(n * n)
print(numbers)
# [0, 4, 16, 36, 64]
例:Python(lambda)
lambdaを使うと以下のようになります。
括弧の対応も改行どこでしていいのかもわからない……
numbers = list(map(lambda n: n * n, filter(lambda n: n % 2 == 0, range(10))))
print(numbers)
# [0, 4, 16, 36, 64]
例:Python + PyFunctional
満を持して、PyFunctionalを使うとRubyやJSのようにメソッドチェーンで書けます。
from functional import seq
# 改行のために括弧で挟む。
numbers = (seq(range(10))
.filter(lambda n: n % 2 == 0)
.map(lambda n: n * n)
)
# 括弧じゃないほうがいいなら、行末にバックスラッシュをつける。
numbers = seq(range(10))\
.filter(lambda n: n % 2 == 0)\
.map(lambda n: n * n)
print(numbers)
# [0, 4, 16, 36, 64]
使い方を簡単に言うと、seq
に配列を渡して、それに必要なメソッドをチェーンしていく感じです。
感覚はRubyと同じですよね。
使えるメソッドに関してはGithubにある公式リポジトリで確認してください。
PyFunctional - Github
まとめ
PyFunctionalで快適な配列ライフを!