Pythonのlambda式をなるべく簡単に理解する

Pythonを勉強するにあたり、lambda式と出会いました。
業務で使用することは少ないかもしれないですが、簡略化して書きたいときに使用できると良いかと思い、調べました。
しかし、自分自身なかなか理解できず、この記事にまとめようと思った次第です。
初心者の方の参考になると幸いです。
また、知見のある方で使用方法が誤っている場合はご指摘いただけると幸いです。

使用環境

* windows10
* python:3.7.9
* jupyter Notebook

#目次
* lambda式とは
* lambda式の定義
* lambda式の初歩
* lambda式でlistを用いる
* lambda式でfor文処理を実装
* lambda式でif文処理を実装

## lambda式とは
[ここでは](https://www1.gifu-u.ac.jp/~fujilab/lambda_html/1.html)lambda式とは、
`名前がついていない関数(無名関数)を表現する記法のひとつ`と説明があります。

## lambda式の定義
defを用いた場合の関数定義は以下です。

```python
def func(引数):
       return 返り値
```

それに対してlambda式を用いたものが以下です。

```python
lambda 引数 : 返り値
```

また、引数無しでも以下のように使用できます。

```python
lambda: 処理
```

## lambda式の初歩
defを用いた場合の関数呼び出しと、lambda式を用いたものをサンプルで用意しました。

```python
# defを用いた場合
def add(a, b):
    return a + b

print(add(1,2)) #出力 -> 3
```

```python
# lambda式を用いた場合（引数あり）　その1
f = lambda a, b : a + b

print(f(1, 2)) #出力 -> 3
```

また、以下のようにlambda式は使用できます。

```python
# lambda式を用いた場合（引数あり）　その2
f = (lambda a, b : a + b)(1, 2)

print(f) #出力 -> 3
```

引数がない場合のlambda式の使用方法は以下です。

```python
# lambda式を用いた場合（引数無し）

f = lambda: 1 + 2

f() #出力 -> 3
# print(f())を用いても出力できます
```

ここまでは問題なく理解できたと思います。

## lambda式でlistを用いる
lambda式でlistを用いた処理を実行しました。
def関数を用いた場合と比較するとlambda式の方が簡略化されているように見えます。
以下はdef関数を用いた場合の理です。

```python
# 偶数のリスト
even_list = [2,4,6,8,10]

# 引数で与えられた値を2で割る
def div(even_num):
    return even_num // 2

# mapの使用方法は参考文献2を参照してください
div_list = list(map(div, even_list))
div_list # 出力 -> [1, 2, 3, 4, 5]
```
次に同じ処理をlambda式を用いて実行します。

```python
# 偶数のリスト
even_list = [2,4,6,8,10]

div_list = list(map(lambda div: div // 2, even_list))
div_list # 出力 -> [1, 2, 3, 4, 5]
```

## lambda式でfor文処理を実装
for文で処理を行う際とlambda式を用いた際のコードの違いを見ていきます。
まずfor文を用いた処理です。

```python
# 奇数のリスト
odd_list = [1,3,5,7,9]

# 処理結果を格納する配列を初期化
ans = []

# 引数で渡されたリストの中身を2倍して変数ansに代入
for odd in odd_list:
    ans.append(odd * 2)
ans # 出力 -> [2, 6, 10, 14, 18]
```

次に同じ処理をlambda式を用いて行います。

```python
# 奇数のリスト
odd_list = [1,3,5,7,9]

# 引数で渡されたリストの中身を2倍して変数ansに代入
ans = list(map(lambda odd : odd * 2, odd_list))
ans # 出力 -> [2, 6, 10, 14, 18]
```

for文を用いた場合とlambda式を用いた場合だとlambda式の方が簡略化されていることが分かります。

ちなみに上と同じ処理をdef関数を使用して以下のように実装できます。

```python
# 奇数のリスト
odd_list = [1,3,5,7,9]

# 引数で渡された値を2倍にして返す
def change_odd_list(odd):
    return odd * 2

ans = list(map(change_odd_list, odd_list))
ans # 出力 -> [2, 6, 10, 14, 18]
```

## lambda式でif文処理を実装
if文を用いた処理とlambda式での処理を比較したいと思います。
以下、1から10までのリストのうち、偶数である要素を新たに定義した変数に代入する処理です。
まずはfor文とif文を用いた場合のコードを以下に載せます。

```python
#リストを定義します
before_list = [1,2,3,4,5,6,7,8,9,10]

#偶数の数値だけを格納する変数を定義します
change_list = []

for i in before_list:
    if i % 2 == 0:
        change_list.append(i)
change_list # 出力 -> [2, 4, 6, 8, 10]
```
次に同じ処理をlambda式を用いて実装します。

```python
#リストを定義します
before_list = [1,2,3,4,5,6,7,8,9,10]

#filterの使用方法は3を参照してください
change_list = list(filter(lambda i: i % 2 == 0, before_list))
change_list # 出力 -> [2, 4, 6, 8, 10]
```

またdef関数を用いた場合の処理も記載します。

```python
#リストを定義します
before_list = [1,2,3,4,5,6,7,8,9,10]

# 偶数を返す関数
def double_list(a):
    if a % 2 == 0:
        return a

change_list = list(filter(double_list,before_list))
change_list # 出力 -> [2, 4, 6, 8, 10]
```

### 参考文献

①

https://www1.gifu-u.ac.jp/~fujilab/lambda_html/index.html#

②

https://qiita.com/conf8o/items/0cb02bc504b51af09099

③

https://techacademy.jp/magazine/33271