Python  ラムダの使い方

Python学習【365日チャレンジ!】57日目のマスターU(@Udemy11)です。

世の中、緊急事態宣言が発令されて、一体全体どうなっちゃうんでしょうか?

Udemyなら、在宅で学習できちゃうので、この機会にみっちり学習してみるのもいいと思うので、ぜひこの機会に気になっていることを勉強してみてください。

さて、少し前からPythonistaのテーマで、Line Numberを表示させるようにしました。

Pythonistaのインターフェイスは日本語化されていないので、理解するためにはいろいろと触ってみないことにはわからないことが多いのですが、今回テーマの細かい設定などを変更したので、ある程度何がどうなっているのかわかるようになりました。

やっぱり、人は経験でしかスキルをアップさせることはできないんですよね。

なので、しっかりと繰り返しコードを書いてPythonの知識を積み上げていこうと思います。

それでは今日もPython学習を始めていきましょう!

昨日の復習

昨日は、デコレーターを学習しました。
理解する時間がかかったぶん、かなり長い記事になってしまいましたが、流れを確認しながら記事を書いたので、かなり理解度が深まりました。

デコレーターは実行する関数を包みこむというイメージでしたね。

def print_info(func):
    def wrapper(*args, **kwargs):
        print('Start')
        result = func(*args, **kwargs)
        print('End')
        return result
    return wrapper
 
def more_info(deco):
    def wrapper(*args, **kwargs):
        print('function:', deco)
        print('args:', args)
        print('kwargs:', kwargs)
        result = deco(*args, **kwargs)
        print('result:', result)
        return result
    return wrapper
 
@print_info
@more_info
def add_num(a, b):
    return a + b
 
l = add_num(20, 40)
print(l)

出力結果

Start
function: <function add_num at 0x108da12f0>
args: (20, 40)
kwargs: {}
※この時点で関数が実行されるが出力していない
result: 60
End
60

オレンジ色と緑色のコードが実行関数の前後に行っている処理で、赤字がデコレーターです。

デコレーターをネストしているので、print_infoら始まって、more_info、実行関数、more_infoprint_infoという形で実行関数がサンドイッチされています。

出力結果もデコレータがサンドイッチされた状態になっていますが、関数の実行は真ん中で行うけれども、最後に実行結果を出力していました。

詳しくは昨日の記事で復習してみてください。

それでは、今日の学習に入っていきましょう!

lambda(ラムダ)の動作

いきなりラムダなんて言われてもなんのことやら全くもってよくわかりません。
本気でヨガの関係の用語かと思っちゃうほどです。

そんなよくわからないラムダを一言でいうと、

インスタント関数

簡単にできて便利な名前も必要ない関数です。

次のような関数の役割をラムダがやってくれます。

def mul_num(a, b):
    return a * b
 
r = mul_num(3, 5)
print(r)
 
l = lambda a, b: a * b
n =l(3, 5)
print(n)

出力結果

15
15

aとbの掛け算をするオレンジの関数mul_numlambdaを使って赤字のように書くことができます。

ラムダは、

lambda 引数: 処理

という記載方法で、関数と同じ働きをさせることができます。
ラムダは、無名関数とも言われているので、名前をつけることなく関数の処理ができるということですね。

もう少し具体的な使い方を試してみましょう。

lambdaの具体的な使い方

次にリストを使った具体的な使い方を学習します。

リストに曜日を入れて、最初の文字を大文字にする処理をしてみます。

l = ['Sun', 'mon', 'tue', 'Wed', 'thu', 'Fri', 'sat']
def day_func(words, func):
    for word in words:
        print(func(word))
 
def cap_func(word):
    return word.capitalize()
   
day_func(l, cap_func)

出力結果

Sun
Mon
Tue
Wed
Thu
Fri
Sat

リストの中には、最初の文字が大文字になっているものとなっていないものをまぜて入れています。

このリストの値の最初の文字をすべて大文字に変えるわけですが、その処理だけならl.capitalize()だけでできそうな気がしますが、リストにはcapitalize()メソッドがありません。

なので、forループで回して切り分けた文字列をキャピタライズして出力しています。

流れとしては、

  1. day_funcの引数にリストlcap_funcを代入して実行
  2. forループで引数wordsに代入されたリストlを変数wordに切り分ける
  3. 切り分けられたwordfunc(word)つまりcap_func(word)でキャピタライズする。
  4. キャピタライズされたwordを出力
  5. forループを繰り返す

という感じになります。

この3番めの処理であるオレンジ色の関数をlambdaを使って簡単に記述できるということです。

具体的には、オレンジ部分の関数とday_func(l, cap_func)をまとめて緑色のように短くすることができます。

l = ['Sun', 'mon', 'tue', 'Wed', 'thu', 'Fri', 'sat']
def day_func(words, func):
    for word in words:
        print(func(word))
 
day_func(l, lambda word: word.capitalize())

なにが便利?

コードだけ見ると結局実行コードが長くなってしまって、2行が1行になっただけなので、何が便利なのかわからないですよね。

クロージャー、デコレーターを学習したときにも感じましたが、講座では理解しやすいように、ごく単純なコードで解説しているので、「使わなくてもできるんじゃないの?」なんて思っちゃいます。

とはいえ、実際のプログラムでは、もっと複雑な動作をさせるために使い所があるから特別な機能としてPythonに実装されているわけです。

例えば、今回のコードで、lambdaを使う例としては、キャピタライズだけでなく、すべての文字を小文字にしたり、大文字にしたりするときに、新たな関数を書かなくても、word.capitalize()の部分をword.lower()word.upper()に変更するだけで処理が可能になります。

今後、Python学習を進めていくうちに、今学習している内容が役立つ場面が出てくると思うので、なんども違うパターンのコードを書いて、それぞれのポイントを押さえておきましょう。

それでは、明日もGood Python!