lambda(ラムダ式)
lambda を使うと、名前のない一行の小さな関数を作れます。
普通の関数はこう書きます(testという名前の関数を定義)。
1 2 |
def test(a, b): return a + b |
lambda を使うと一行でこう書けます。
1 |
lambda a, b: a + b |
「lambda 引数: 返り値」という書き方になります。
使う時は、変数に代入したり、
1 2 |
test = lambda a, b: a + b print(test(1, 2))#結果 3 |
丸括弧で括ったりします。
1 |
print((lambda a, b: a + b)(1, 2))#結果 3 |
map
map関数は、用意した関数で要素を一つ一つ実行し、その結果を返します。
map型のオブジェクト = map(関数, リストのような要素の集まり)
戻り値はmap型のイテレータのオブジェクトになります。
そのままでも使えますが、通常それをリスト型にキャストして使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 用意した関数 def add(n): return n + n # リスト a = [1, 2, 3, 4, 5] # map関数を使う b = map(add, a) # bのデータ型はmap型 print(type(b)) # <class 'map'> # bをリストに変換 b = list(b) # 表示 print(b) # [2, 4, 6, 8, 10] |
lambda を使って書くとシンプルになります。
1 2 3 4 5 6 7 |
# リスト a = [1, 2, 3, 4, 5] # 最初からlistで括ってmap関数を使う b = list(map(lambda n: n + n, a)) # 表示 print(b) # [2, 4, 6, 8, 10] |
filter
filter関数は、用意した関数を使って、要素を絞り込んでくれます。
filter型のオブジェクト = filter(関数, リストのような要素の集まり)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 用意した関数 def even(n): if n % 2 == 0: return n # リスト a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # filter関数を使う b = filter(even, a) # bのデータ型はfilter型 print(type(b)) # <class 'filter'> # bをリストに変換 b = list(b) # 表示 print(b) # [2, 4, 6, 8, 10] |
lambda を使って書くとシンプルになります。
1 2 3 4 5 6 |
# リスト a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # filter関数を使う b = list(filter(lambda n: n % 2 == 0, a)) # 表示 print(b) # [2, 4, 6, 8, 10] |
リスト内包表記
シンプルな記述で、とあるリストから、とあるリストを生成できます。
先程のmapとfilterの例もリスト内包表記で書けます。
1 2 3 4 5 6 |
# リスト a = [1, 2, 3, 4, 5] # リスト内包表記で作成 b = [n + n for n in a] print(b) # [2, 4, 6, 8, 10] |
1 2 3 4 5 |
# リスト a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # リスト内包表記で作成 b = [n for n in a if n % 2 == 0] print(b) # [2, 4, 6, 8, 10] |
ifを含む場合は後ろに付けます。
リスト内包表記で抽出の例
filterとlambdaでも同じことが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
class Inu: def __init__(self, kind, size, origin): self.__kind = kind self.__size = size self.__origin = origin def get_kind(self): return self.__kind def get_size(self): return self.__size def get_origin(self): return self.__origin obj1 = Inu("セントバーナード", "大型犬", "スイス") obj2 = Inu("秋田犬", "大型犬", "日本") obj3 = Inu("シベリアンハスキー", "大型犬", "アメリカ") obj4 = Inu("北海道犬", "中型犬", "日本") obj5 = Inu("柴犬", "小型犬", "日本") dogs = [obj1, obj2, obj3, obj4, obj5] # filterとlambdaで抽出 # dogs2 = list(filter(lambda x: x.get_origin() == "アメリカ", dogs)) # リスト内包記法で抽出 dogs2 = [x for x in dogs if x.get_origin() == "日本"] for obj in dogs2: print(obj.get_kind(), obj.get_size(), obj.get_origin()) |
結果
秋田犬 大型犬 日本
北海道犬 中型犬 日本
柴犬 小型犬 日本
dogsというリストからリスト内包表記で抽出して、dogs2というリストを作り、それを表示しています。