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

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

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

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

Q&A

解決済

7回答

3585閲覧

あえてelif, elseを使わない条件判定はありですか?

nouken

総合スコア369

Python

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

0グッド

3クリップ

投稿2020/08/21 00:25

編集2020/08/21 00:46

[追記]
以下の入力のバリデーションを追記しました。

if not isinstance(x, int): raise Exception("Input must be int")

以下は単純な例ですが、

例えばこのような関数を

python

1def test(x): 2 if not isinstance(x, int): 3 raise Exception("Input must be int") 4 5 if x < 0: 6 print("x is negative") 7 elif x <= 100: 8 print("x is positive and not too large") 9 else: 10 print("x is too large")

以下のように書くのはありですか?(または、一般的に受け入れられていますか?)

python

1def test(x): 2 if not isinstance(x, int): 3 raise Exception("Input must be int") 4 5 if x < 0: 6 print("x is negative") 7 if 0 <= x <= 100: 8 print("x is positive and not too large") 9 if 100 < x: 10 print("x is too large")

このように書くことのメリット(と私が考えること)は、

  • 条件が対等に見えることによる可読性の向上

考えられるデメリットとしては、

  • 条件の抜け漏れ・オーバーラップなどが起こりやすくなる
  • 実行時間が気持ち長くなる(可能性がある?)

これらの問題が大きく影響しない場合には取り入れられる書き方でしょうか?

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

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

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

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

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

guest

回答7

0

ベストアンサー

ありかなしかであれば、言語的にはありですが個人的にはナシだと思います。

if 〜 elif 〜 else 〜 は、処理がその3つのうちのいずれか一箇所のみを通ることがわかりやすいですが、if 〜 if 〜 if 〜 と書くと3つのifを複数通るパターンがあるのではないか?という疑念が湧くからです。

今回のパターンであれば、複数ヶ所を通過することはありませんが、条件まで確認しないとそのことがわかりません。数カ月後の自分は他人ですので、ヒネった書き方をすると後でなんだこれ?となりますのでおすすめできません。(経験上)

投稿2020/08/21 00:41

YakumoSaki

総合スコア2027

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

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

0

私は受け入れません。理由は以下です。

  • 同じ判定を何度もしているのは気持ち悪い
  • 網羅性・重複チェックを読む人がしなければならず可読性が落ちる

投稿2020/08/21 00:40

編集2020/08/21 00:41
Zuishin

総合スコア28660

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

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

maisumakun

2020/08/21 00:42

言語によっては、返り値が必要な関数で全部をifで書いてしまうと「値を返さない可能性があります」とコンパイルを通らないこともありますね。
Zuishin

2020/08/21 04:26

そうですね。今回は返り値が必要ないんでしょうが、逆に返り値が必要ないことがバグを気づきにくくしていましたね。
guest

0

以下のように書くのはありですか?

この場合、動作が異なりますx = nanのような変な値を投げ込まれた場合、NaNは大小比較できない(結果がすべてfalseとなる)ので、elseを使わずに書いたパターンではどれにも当てはまらず、何も返さないことになります。

投稿2020/08/21 00:30

maisumakun

総合スコア145184

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

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

maisumakun

2020/08/21 00:37

なお、今回の例のように各項目が1行しかないような場合、「条件判定をして、満たしていれば必要な処理をしてreturn」とすることでelseを書く必要をなくす、という流儀も存在します。
maisumakun

2020/08/21 00:40 編集

(回答後に質問のコードが修正されています)
nouken

2020/08/21 00:45

すみません、自分の中では本題ではなかったので修正しましたが、結局このようなことが起こる可能性が高いということ自体が問題かもしれません。
sazi

2020/08/21 01:01 編集

> 「条件判定をして、満たしていれば必要な処理をしてreturn」とすることでelseを書く必要をなくす、という流儀も存在します。 処理時間短縮の為でしたよね。流儀に名前ってありましたっけ?
Zuishin

2020/08/21 04:22

> 流儀に名前ってありましたっけ? この質問の回答にもいくつかありますが、「早期リターン」じゃないですか? 私もこの質問を見て真っ先にそれを思い浮かべたんですが、 > 条件が対等に見えることによる とあったので、それをメリットと思うなら、その「メリット」が無くなるため、外しました。
sazi

2020/08/21 04:25

@Zuishinさん 「早期リターン」聞き覚えがありました。 ありがとうございます。
guest

0

質問のコードとは違いますが、"return early pattern"や"早期リターン"という名前が付いて議論されている概念が参考になると思うので、検索してみて読むとよいと思います

python

1def test(x): 2 if not isinstance(x, int): 3 raise Exception("Input must be int") 4 5 if x < 0: 6 print("x is negative") 7 return 8 if x <= 100: 9 print("x is positive and not too large") 10 return 11 print("x is too large")

投稿2020/08/21 02:09

quickquip

総合スコア11038

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

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

0

すみませんが何とも言えません。
詳しくは会社のルールやチームのルールに従って下さい。

ちなみに私の場合は下記のような早期リターンを使った書き方を好んで使います。

Python

1def test(x): 2 if x < 0: 3 print("x is negative") 4 return 5 6 if x > 100: 7 print("x is too large") 8 return 9 10 print("x is positive and not too large")

投稿2020/08/21 00:39

stdio

総合スコア3307

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

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

0

「あえて」ならよろしいのではないでしょうか。

上記のコードは動作が異なりますので、「可読性向上のために置き換えた」とコードレビュー等で説明されたらNGをだします。
こういう問題が起こる可能性があるならelif/elseを排除する意味は無いと思います。
一般的にはどうかはレビュワーなどによると思いますが、個人的には受け入れられません。

ifしか無いコードを見たことがありますが、else書くより面倒なことをしている印象があるので、やめた方がいいんじゃないですかね。

投稿2020/08/21 00:35

FiroProchainezo

総合スコア2401

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

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

0

条件が対等に見えることによる可読性の向上

を重視したのか、追加削除の考慮なのか、

Python

1if False: 2 pass 3elif ~~~: 4 ~~~ 5elif ~~~: 6 ~~~ 7elif ~~~: 8 ~~~

のようなコードを見た気がします。Pythonだったかどうか覚えてませんが。

Rubyだと、case+when一択ですね。

投稿2020/08/21 05:55

otn

総合スコア84551

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問