背景
Pythonで関数を引数として渡す関数を書く際にlambda式を渡そうと思ったのですが、Python2では printが式 (expression)ではなく文 (statement)であるため、lambda式に入れることができませんでした。
そこで、__future__モジュールをインポートして、Python3と同様に print文から print式になるよう変更を加えます。
*式と文の違いについてはStackOverFlowの投稿 がわかりやすいです。要約すると、式(expression)はそれ自体で値を評価できますが、文(statement)は定義された手続きを終えなければ評価ができません。
コード
# Python2では定義できない (printが文であるため)
# a = lambda: print "hoge"
# Python3では定義できる (printが式であるため)
a = lambda: print("hoge")
# Python2で定義する方法
from __future__ import print_function
a = lambda: print("hoge")
ただし、問題点としてはprint "hogehoge" をすべて print("hogehoge")に変更しなければなりません。
Python2の中で使う場合は、メソッド内でインポートするなど限られた利用に留めた方が吉でしょう。
appendix
*例えばC#ではラムダ式の中に文を書けたりするので、言語間で違いがあることを留意した方が良いですね。
Action<string> act = (string x) =>
{
if(x == "hoge") Console.WriteLine(x);
else Console.WriteLine("hoge以外は許さん");
}
*あと、何気にPythonで引数なしのラムダ式の書き方が分からなかったのですが、
a = lambda: 5 # 5を返すラムダ式
で書けるようです。
*__future__モジュールについてはさりんじゃーさんのブログの内容 にまとめられております。
Python2からPython3へ徐々に移行したい場合などに参考になるかもしれません。