【Python連載】ラムダ式の利用
Pythonは、オブジェクト指向と呼ばれるプログラミング言語の一つです。
今回は、関数について、ラムダ式と呼ばれるものを紹介します。
ラムダ式とは
Pythonでは関数を使用する際にはdef~から始まる形式で関数を定義しますが、
『ラムダ式』と呼ばれる形式で書かれる『無名関数』というものがあります。
詳しい説明の前に、まずは下記のプログラムを見てみましょう。
def tax_included_price(price,tax): return price * (tax + 100) /100 print(tax_included_price(100, 10)) #price(価格)が100円、tax(消費税)が10%の値段を表示
110.0
普通にdef文を使用して、消費税込み価格を求めるような関数です。
priceに商品価格を、taxに消費税を入れるようなイメージですね。
100円の商品が消費税が10%だと、税込み価格は110円となります。
では、上記をラムダ式を使用して書いてみます。
tax_included_price = lambda price,tax : price * (tax + 100) /100 print(tax_included_price(100, 10))
110.0
1行目の部分でlambda~と記述している部分があると思います。
これがラムダ式の記述になります。
def文で関数を定義した際と同じ実行結果を得ていますが、
ラムダ式を使うと、このような簡単な処理は1行にまとめてしまうことが出来ます。
今回は、このラムダ式の書式と基本的な使い方を覚えましょう。
ラムダ式の書式
書式は次の通りになります。
lambda 引数1,引数2,... : 実行する処理
先ほどの例で当てはめると、次の通りとなります。
ラムダ式の基本的な使い方
ラムダ式は、慣れないうちは構造が感覚的にわかりにくいです。
例を見て、構造を理解できるようになっていきましょう。
lambda_sample1 = lambda x,y : x + y #引数はx,y 実行する処理は、x + y print(lambda_sample1(1, 2))
3
実行できる処理は、加減乗除といった計算に限った話ではありません。
メソッドも使うことが可能です。
print()をラムダ式の処理文に含めてしまいます。
lambda_sample1 = lambda x,y : print(x + y) #引数はx,y 実行する処理は、print(x + y) lambda_sample1(1, 2)
3
引数は、2つだけでなく3つ以上を使用することができます。
引数には初期値を与えてあげることも可能です。
lambda_sample1 = lambda x,y,z=3 : print(x + y + z) #引数はx,y,z(zの初期値3) 実行する処理は、print(x + y + z) lambda_sample1(1, 2) #zは指定せずに初期値で計算
6
ラムダ式は1行で完結させる必要がありますが、プログラム可読性のため、やむを得ず複数行に跨いだ記述にされている場合もあります。
複数行に跨ぐ場合には、次のように改行を\(バックスラッシュ)でエスケープします。
lambda_sample1 = lambda x,y,z=3 : print(x + \ y + z) #\で改行をエスケープし、続きを次行に記載
複数行に跨る形となっていますが、これは1行という扱いになります。
ラムダ式は、本来であれば1行で済むような単一の処理文を実行するものですので、注意しましょう。
以上が、ラムダ式の基本的な使い方でした。
次回の記事では、ラムダ式をもう少し詳しく見ていきたいと思います。
まとめ
Pythonでは『ラムダ式』と呼ばれる形式で書かれる『無名関数』というものを使用できます
ラムダ式では、簡単な処理を基本的に1行で記載します。
確認問題
次のプログラムを実行すると、エラーが発生します。
lambda_sample = lambda x=1,y=2,z=3 : sum = x + y + z , print(sum) lambda_sample()
エラーの原因について、次の選択肢のうちから正しい記述を選択してください。
(1)ラムダ式では、引数は2つまでしか指定出来ない
(2)実行する処理は、加減乗除等の計算しか行うことは出来ない
(3)実行する処理が、単一の処理となっていない
(4)ラムダ式では、引数に初期値を設定することはできない
答えは次回の記事の最後に!
前回の確認問題の解答例
前回は、次のような問題でした。
次のプログラムを実行した時の出力について、正しいものを選択してください。
def greet(func): str = func() print(str) def morning(): return "おはよう" def evening(): return "こんばんは" message = greet message(morning)
(1)11行目で変数に関数を代入しているため、エラーが発生する
(2)おはよう と表示される
(3)こんばんは と表示される
(4)1行目で関数の引数として関数を指定しているため、エラーが発生する
関数はオブジェクトであるため、関数を変数に代入したり、関数の引数として関数を使用することが可能です。
12行目ではmessage(つまり、関数greet)の引数として関数morningを指定しているため、関数morningが実行されます。そうすると2行目の変数strには”おはよう”が格納されるため、3行目のprint()により”おはよう”が表示されます。
よって、正解は(2)となります。