【python】簡単な関数なら書けるのにlambda式は書けない

Python

pythonを学習するとlambda式の存在に気付くと思います。いざ書いてみようとするとどうやって書いたらいいのかわからなくなってしまうのですが、なんとなくこう書けばいいのかな、という備忘録記事です。

対象

  • lambda式、聞いたことはあるけど結局わかんないから簡単な関数もdef ~~~で定義しちゃうんだよな~って人

あくまで簡単な関数をとりあえずlambda式でも書いてみたいって人向けです。こういう時にlambda式使ったらめっちゃ便利だよ!とかはまだよくわかってない&ほかの記事に書いてある気がするので、そっちを見よう。

簡単な関数を定義します

lambda式を使うときは、簡単な処理をわざわざ関数に定義するまでじゃないけど使いたいな~って時だと思います。

なので「簡単=引数は1つ、かつ関数の内部は1行で書ける」とまずはします。

def double(num):
    return num * 2

print(double(10))

実行結果

20

これぞ簡単な関数です。まずはこういった簡単な関数からlambda式に変えることを考えます。

lambda式は関数から必要な情報だけを持ってきた形をしています。よくわからないと思いますが、よくある表現だと

lambda 引数:処理内容

こんな感じでしょうか、つまり関数から引数と処理内容だけ残してあとは全部消してもOKってことです。

関数に戻っていらない情報を消していきます。

# 元の関数です

def double(num):
    return num * 2


# def、関数名はいらないです

(num):
    return num * 2


# 引数を囲む()もいらないです

num:
    return num * 2

# returnもいらないです

num:
    num * 2


# 改行ももちろんいらないです

num: num * 2

関数から引数、処理内容を削っていくとなんかlambda式っぽくなりました。後は先頭にlambda式であることを示すlamdaを書いて

lambda num: num * 2

完成です。

パターンを変えてlambda式を作成する

ここまで書いてきて自分に勇気が出てきました。

これ、もしかして引数なくてもできるんじゃないか?(ただし処理内容は1行)

def greeting():
    print('hello')

greeting()

実行結果

hello

最初に定義した引数1つの定義を破り引数0の関数を作りました。

しつこいですが全く同じ方法でlambda式を作っていきます。

# 元の関数です

def greeting():
    print('hello')


# def,関数名はいりません

():
    print('hello')


# ()もいりません

:
    print('hello')


# 改行はいりません

: print('hello')


# lambda式であることを示すlambdaを書きます

lambda : print('hello') 

できました。引数2つでも同じ要領でできると思います。

そんな簡単な関数じゃ物足りない

こんなの関数にするまでもlambda式にするまでもない、俺はもうちょっと複雑そうでいて簡単な関数をlambda式にしたいんだ!そう思うかもしれません。その向上心素晴らしいです。私もそう思っていました。

じゃあこんな関数をlambda式にしてみるのはどうでしょうか。

def calculate_mean(num_list):
    num_items = len(num_list)
    sum_list = sum(num_list)
    return sum_list / num_items

list1 = [1, 2, 3, 4, 5]
print(calculate_mean(list1))

実行結果

3.0

このリストの要素の平均を出す関数をlambda式で表すことを考えます。

やることは単純で関数の中身が1行だったらさっきまでと同じ方法でできたので、関数の中身が1行にならないか考えます。

def calculate_mean(num_list):
# ここを1行にしたい
    num_items = len(num_list)
    sum_list = sum(num_list)
    return sum_list / num_items


def calculate_mean(num_list):
# できた
    return sum(num_list) / len(num_list)

ここまでくればもう後は同じなので大丈夫でしょう。

lambda num_list: sum(num_list) / len(num_list)

できましたね。if文も1行にすることができるので(elifがあるときはわからないですが)lambda式にif文を組み込むことができます。リスト内包表記なんかと組み合わせることもできると思います。

もっと複雑なものをlambda式で書きたいんだ!って人もいるかと思いますが、自分はそこまでできないのでいったんここまでで終わりです。てか複雑なものは関数で書いてしまったほうが良い気がします。

コメント

タイトルとURLをコピーしました