LoginSignup
0
0

More than 3 years have passed since last update.

lambdaの活用(関数を別の関数の引数として渡すとき)

Posted at

個数の異なる引数を持つ関数をそれぞれ同一関数の引数として渡す場合、lambdaを用いて利用できます。

以下のソースがあるとします。


# 引数なし関数
def print_type1():
    print('print_type1を処理中・・・')
    return '[print_type1]'

def print_com(func):
    print('=== print_comを処理中・・・ ===')
    rtn = func()  # 利用する際、渡す関数には引数なし
    print('{}を処理しました。'.format(rtn))
    print()

print_com(print_type1)  # 問題なく動作します

後から引数のある関数をprint_comに代入したいときがあると思います。
例:

# 引数あり関数
def print_type2(day):
    print('print_type2を処理中・・・')
    print('day: {}'.format(str(day)))
    return "print_type2"

以下の代入方法では失敗します。

print_com(print_type2)  # →[missing 1 required positional argument: 'day']というエラーがでます"
print_com(print_type2(15))  # →['str' object is not callable]というエラーがでます

そこで、lambdaで引数なし関数に変更してから、渡せば動作します。

day = 15
print_com(lambda: print_type2(day))

または、functoolsのpartialを利用すればいいです。

from functools import partial
day = 15
print_com(partial(print_type2, day=day))

自力で解決する場合は、関数の中に関数を定義することで実現できます。

# 内部関数
def print_type3(day):
    def print_type3_inner():
        print('print_type3を処理中・・・')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner

day = 15
print_com(print_type3(day))

lambda01.py
from functools import partial

# 引数なし関数
def print_type1():
    print('print_type1を処理中・・・')
    return '[print_type1]'


def print_com(func):
    print('=== print_comを処理中・・・ ===')
    rtn = func()  # 利用する際、渡す関数には引数なし
    print('{}を処理しました。'.format(rtn))
    print()


# 引数あり関数
def print_type2(day):
    print('print_type2を処理中・・・')
    print('day: {}'.format(str(day)))
    return "print_type2"


# 内部関数
def print_type3(day):
    def print_type3_inner():
        print('print_type3を処理中・・・')
        print('day: {}'.format(str(day)))
        return "print_type3"

    return print_type3_inner


print_com(print_type1)  # 問題なく動作します

# ↓このような代入方法では失敗します
# print_com(print_type2)  # →[missing 1 required positional argument: 'day']というエラーがでます

# print_com(print_type2(15))  # →['str' object is not callable]というエラーがでます

# lambdaで引数なし関数に変更してから、渡せば動作します。
day = 15
print_com(lambda: print_type2(day))

# または
day += 1
print_com(partial(print_type2, day=day))

day += 1
print_com(print_type3(day))

実行結果
=== print_comを処理中・・・ ===
print_type1を処理中・・・
[print_type1]を処理しました。

=== print_comを処理中・・・ ===
print_type2を処理中・・・
day: 15
print_type2を処理しました。

=== print_comを処理中・・・ ===
print_type2を処理中・・・
day: 16
print_type2を処理しました。

=== print_comを処理中・・・ ===
print_type3を処理中・・・
day: 17
print_type3を処理しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0