質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

934閲覧

辞書にlambdaを代入することは不適切でしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2018/05/29 07:02

pythonで処理の分岐をおこなうときに、ディクショナリを使ってみたいと思っています。

たとえば以下のような処理があるとします。

python

1 var=数値 2 3 if var==1: 4 //処理1 5 elif var==2: 6 //処理2 7 elif var==3: 8 //処理3 9 elif var==4: 10 //処理4

これを

python

1 dic={ 2 1:処理1の関数, 3 2:処理2の関数, 4 3:処理3の関数, 5 4:処理4の関数 6 } 7 var=数値 8 dic[var]()

という風にしたいです。

この際、処理が十分短い場合には、

python

1 dic[1]=lambda 処理1

という書き方をしたい気がします。

ただ、PEPでは、lambdaの変数への代入は推奨されていないと聞きます。

そこで質問なのですが、
①上記のようにlambdaを使うことは、やはり控えるべきでしょうか。
②その場合、どのように書くのが適切でしょうか(defで定義した上で代入するのでしょうか)
③lambdaを代入すべきでない実質的な理由はなんでしょうか。

以上よろしくお願いいたします。

LouiS0616👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

PEP8の当該箇所から引用しておきます。

ラムダ式を直接識別子に結びつける代入文を書くのではなくて、常に def 文を使いましょう。

良い:

def f(x): return 2*x
悪い:

f = lambda x: 2*x
はじめの書き方は、結果として生成される関数オブジェクトの名前が、ラムダではなくて f であると明示的に述べています。これは traceback や文字列表現を使うときに役立ちます。代入文を使うと、ラムダ式が提供できる唯一の利点(つまり、大きな式に埋め込めること)を消してしまいます。

はじめに — pep8-ja 1.0 ドキュメント


PEP8のルールが今回のようなケースに当てはまるかは微妙でしょう(代入せず直接辞書の中にlambdaを書いてしまえば良い)。辞書を作るのは確かに理にかなっています。

ただし、if-elif-elseで書いていくのと比べると、elseに対応するものがないので、気を配る必要があります(キー有無判定を入れる、setdefaultを使う、defaultdictを使う、存在しないキーは絶対に来ないロジックだと割り切る等・・・)。
そうするとごちゃごちゃしてくるので、けっきょくif-elif-elseを連ねるのと大差ないコードの見通しになりそうです。

dict.get(key, default_function)で良いです。puroko3様ご指摘ありがとうございます。これだとそれなりにすっきりするので、if-elif-elseを書き連ねるのと比べてアドバンテージがありそうです。

投稿2018/05/29 07:16

編集2018/05/29 10:38
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puroko3

2018/05/29 10:10

getを使えばelseにも対応できると思うのですがどうでしょうか?
puroko3

2018/05/29 10:28

x = {"a":lambda :"if", "b":lambda :"elif"} for key in ["a", "b", "c"]: ....print(x.get(key, lambda :"else")()) 例えばこんな感じです。
hayataka2049

2018/05/29 10:36

そういえばgetにもdefaultが設定できました。普段ほとんどgetを使わないので把握していませんでした。ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/05/29 10:55

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問