Python、はじめました

非プログラマーかつ私文卒リーマンの Pythonデビュー全記録

【SoloLearn】関数プログラミング-map関数 & filter関数

f:id:pokita:20180527162737p:plain

SoloLearn-Functional Programming-map & filter

 

今回はiterableとか絡むのでけっこうむずかしい。初見では理解できなかったところが多々あり、いま見直して納得できたところです。

まずは第一項。

 

The built-in functions map and filter are very useful higher-order function that operate on list (or similar objects called iterables).They takes a function and an iterable as arguments,and return a new iterable with the function applied with each argument.

map関数もfilter関数も第1引数にfunction,第2引数にiterableを取るというところが共通している。

 

iterableってなに?という方はこちらの記事を参照。

 

第2引数は複数の(または単数の)要素を含むiterableでさえあればいいので、stringでもOK。よって下のコードでも実行できる。

 

def add_a(arg):

  return arg + "a"

 

iterable = "spam"

result = map(a_add,iterable)

print(result)

>>>map object at 0x051B53B0

print(list(result))

>>>["sa","pa","aa","ma"]

 

map関数はmapオブジェクトを返す。mapオブジェクトは__repr__が実装されていないクラスなので、出力を行ってもクラス名とアドレスしか出力されない。

しかし、__iter__は実装されているため、list関数によってlist化することで、その要素を確認することができる。(※Python2.xではmap関数の戻り値はlistオブジェクトだったため、初めてのPythonの表記は非常に混乱を生むものになっている。)

 

上のコードでは、"smap"をitem(要素)である各文字リテラルを含んだiterableとして処理している。

 

次に第二項。

 

The function filter filters an iterable by removing items that don't match a predicate( a function that returns a Boolean ).

 

filter関数もmap関数同様に、第1引数にfunction、第2引数にiterableを取る。ここまでは同じ。違いは、filter関数はiterableを加工して別の形として戻すわけではなく、functionによってpredicateされた(述べられた)条件と一致しないものを弾くというところだ。

 

def odd_only(arg):

  return arg%2 == 0

 

L = [1,2,3,4,5,6]

result = filter(odd_only,L)

print(list(result))

>>>[2,4,6]

 

Lのitem達は一つずつodd_onlyに代入されitem%2 == 0がTrueを戻すitemだけがresultに格納されていく。という流れ。