Pythonでmap関数を定義する!基本的な記述方法を紹介
Pythonにはmap関数が実装されています。実はほかのプログラミング言語でもこの機能は登場し、プログラムを記述する上で視認性を向上させるなどの効果もあります。読みやすいプログラミングを目指すためにもマスターしたい関数のひとつです。
ここではmap関数について基本的な記述方法や注意点を解説していきます。
Pythonでmap関数を使えるようになると便利
map関数とはシーケンスの構成要素すべてに対して、ある関数の処理を行わせるという高階関数のことです。そしてPythonにおけるシーケンスとはオブジェクトを順番に処理するためのデータ構造を意味し、複数ある値をひとかたまりとして格納した型になります。
例えば、「number1=〇〇
」「number2=〇〇
」「number3=〇〇
」と続く変数が多くある場合、シーケンス型の一種であるリストを使って「number_list=[〇〇,〇〇,〇〇,・・・
」と書き換えることができ、その方がシンプルで記述もはやく済みます。
map関数では、こうしたリストなどのオブジェクトに含まれる各要素に対して何かしらの変換を加えて別のオブジェクトを生成させることができるようになります。他の関数や手法で同様の処理を行わせることもできますが、map関数を使えば煩雑な処理をできるだけ少ない記述量で実現させられるというメリットがあります。
また、多くの変数に対して同じような変換処理をさせるプログラムを書く必要がなくなるため、手直しが必要になった場合でも対応が簡単になります。もちろん、正しい使い方をしなければ期待する結果は得られませんが、扱い方を適切に理解することでPython上達に向けて一歩進むことができるようになるでしょう。
map関数の使い方
まずはmap関数を使った例を見てみましょう。
sample1_list = list(range(5))
def multi(x):
y = x*2
return y
sample2_list = map(multi, sample1_list)
print(list(sample2_list))
#[0, 2, 4, 6, 8]
range ( ) 関数で引数に5を指定していますので、ここには0から5つ分の数値が入り、つまり0、1、2、3、4が入ることになります。これがリストとしてsample1_listに代入され、次のmap関数で処理されていくことになります。sample2_listではmap関数によってリスト内の値が2倍になるように処理され、最後にその結果を出力しています。map関数を使っていく上で引数やlambdaについても知っておくと学習が捗りますので次項で説明していきます。
map関数の引数
map関数の引数の順番は必ず覚えておかなければなりません。第一引数に関数、第二引数にシーケンスを指定するのがこの関数の使用上のルールです。つまり加工元となる値群を第二引数に指定し、それをどのように加工するのかというところが第一引数によって指定させることとなります。逆に記述してしまうと上手く機能しなくなるので注意しましょう。
lambda式とは
map関数の第一引数は関数の形で指定する必要はなく、lambda式でも良いとされています。lambda(ラムダ)とはある処理に名前を付けずに定義したもののことで、def文によって関数定義をすることもありません。そこで先に挙げたプログラム例をlambda式で書き換えてみるとこのようになります。
sample1_list = list(range(5))
sample2_list = map(lambda y: y*2, sample1_list)
print(list(sample2_list))
#[0, 2, 4, 6, 8]
もちろん出力結果は同じですが、行数も減り、見た目もシンプルになりました。
関数を定義することは何度も同じ記述を避けることや視認性の向上および管理をしやすくすることなどに意味がありますが、ある特定の処理を一度しか行わない場合や、ごく限られた範囲でしか使わない、そしてシンプルな処理であればわざわざ関数定義をせずにlambda式で表現した方が良い場合もあるのです。
そしてmap関数においても第一引数が関数である必要はなく、lambda式で記述しても正常に動作するようになっています。map関数の利点自体、シンプルなプログラムが記述できる点などにあるため、関数とlambda式の使い分けも併せて覚えることがより効果的な学習となることでしょう。
map関数を使ったプログラム例
map関数を使って単純な数値の掛け算をするだけでなく、条件分岐なども施して出力するようにプログラムを作成してみましょう。例えばある数値が2よりも小さいのか、2よりも大きいのか、もしくは2なのか、といったことを判別してその結果を知らせてくれるようなプログラムも作成できます。このようにして少しずつ複雑な処理を行わせることができるようになればmap関数も使いこなせるようになるでしょう。
def sample(num):
if num < 2:
return "2未満です。"
elif num == 2:
return "2です。"
elif num > 2:
return "2を超えています。"
for answer in map(sample, range(5)):
print(answer)
#2未満です。
#2未満です。
#2です。
#2を超えています。
#2を超えています。
この場合、map関数に与えられた数値が関数「sample」によって処理されていくようにできています。関数内部ではif文を使い2未満なら「2未満です。」と表示し、そのほか変数の値に応じて「2です。」「2を超えています。」と表示されます。
第二引数に関数をそのまま渡すこともできる
上のプログラム例ではmap関数に与える第一引数の関数が少し複雑になっただけでなく、第二引数が関数の形になっている点でも特徴的です。
このように、map関数の第二引数には関数をそのまま渡すことも可能とされています。
そのため必要に応じ、変数に格納することなくそのまま第二引数についても関数を用いると効率的にプログラムが組めるようになります。
まとめ
map関数ではリストのようになった複数の値に対して関数等の処理を施すことができる便利な関数です。初めは難しく感じるかもしれませんが、ここで紹介したプログラム例のように基本的で単純な内容のものから慣れていくと良いでしょう。
使いこなせるようになればプログラミングのスピードも上がり、そして読みやすく記述することもできるようになるでしょう。