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

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

新規登録して質問してみよう
ただいま回答率
85.35%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

664閲覧

Python: 複雑なif文を消したい

pwq

総合スコア23

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/02 02:01

編集2021/12/02 05:29

下記のような複雑に入り組んだif文をコード上から消して、設定をクラスとしてまとめたい

python

1def test(): 2 if "条件1": 3 if "条件2": 4 """処理1""" 5 """処理2""" 6 elif "条件3": 7 """処理3""" 8 else: 9 """処理4"""

#試したこと
enumとdictでif文に相当するところをクラスにまとめた。
見た目上、ifは消えたがそれに相当するkansu()を読む際、下から処理を追っていく必要があり読みづらい。
直観的に処理追えるようにしたい(もしくは別の方法で解決したい)

python

1from enum import Enum 2 3class Matome(Enum): 4 one = "処理1()" 5 two = "処理2()" 6 three = "処理3()" 7 four = "処理4()" 8 9 @classmethod 10 def kansu(cls, res1: bool, res2: bool, res3: bool): 11 third = { 12 True: A.three, 13 False: A.four 14 } 15 second = { 16 True: A.one, 17 False: A.two 18 } 19 first = { 20 True: second.get(res2), 21 False: third.get(res3) 22 } 23 return first.get(res1) 24 25def test(): 26 Matome.kansu( 27 res1=bool("条件1"), 28 res2=bool("条件2"), 29 res3=bool("条件3") 30 ) 31

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

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

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

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

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

quickquip

2021/12/02 05:37 編集

> 複雑に入り組んだif文 めちゃくちゃ素直で普通な形だと思うんですが、実際のコードは10個以上になっているとか、質問では2階層しかないのがもっと深いとかでしょうか? 手段をより複雑かつ難しくしているように見えるので、何が問題で何を求めているのか判りづらかったです。
pwq

2021/12/02 05:48

実際にはif文が5~10個、ネストが3つくらいのものを想定していました。仰る通り、自分で複雑化してしまっていたので、if文そのものを全部消すなどではなく、早期リターンなどで対処しようと思います
guest

回答1

0

ベストアンサー

python3.7以降で辞書の順番が保持されるようになった仕様を悪用すれば、現行のコードは kansu1 のようにまとめて書くことはできます。しかしこの場合、たとえば res1 == res2 == res3 == True の時、
0. 最初に True: Matome.four が成立する
0. 次に res3: Matome.three が成立して結果が上書きされる
0. さらに見ていくと res1: Matome.two も成立する
0. 最終的には (res1 and res2): Matome.one も成立するので、結果は Matome.one になる
のように順番に追いかけていく必要があります。(key: valueの定義順を変えるとうまく動きません)

今回のケースでは、条件がbool型で3つしかないので、全部で8パタンしかないことを利用して kansu2 のように処理内容をタプルの形で用意しておいて、テーブル検索する方法が簡単だと思います。

ただ個人的には、kansu1, kansu2どちらの方法もオススメはしません。
(メンテナンス性が悪すぎるし、不具合があっても気付きにくいため)
普通のif/elseで書いて、必要があれば 処理1 とか 処理2 の部分を関数として切り出すだけで十分だと思います。

python

1from enum import Enum 2 3class Matome(Enum): 4 one = "処理1()" 5 two = "処理2()" 6 three = "処理3()" 7 four = "処理4()" 8 9 @classmethod 10 def kansu1(cls, res1: bool, res2: bool, res3: bool): 11 return {True: Matome.four, 12 res3: Matome.three, 13 res1: Matome.two, 14 (res1 and res2): Matome.one}[True] 15 16 @classmethod 17 def kansu2(cls, res1: bool, res2: bool, res3: bool): 18 x = (res1 << 2) + (res2 << 1) + res3 19 return (Matome.four, Matome.three, Matome.four, Matome.three, 20 Matome.two, Matome.two, Matome.one, Matome.one)[x] 21 22 23def tst(c1, c2, c3): 24 return Matome.kansu2(c1, c2, c3) 25 26print(tst(True, True, True)) 27print(tst(True, False, True)) 28print(tst(False, True, True)) 29print(tst(False, False, False))

投稿2021/12/02 05:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pwq

2021/12/02 05:45

ありがとうございます。無理にif文を消そうとして余計に可読性を低下させていました。おとなしく普通のif文で書こうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問