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

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

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

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

Q&A

解決済

3回答

999閲覧

Python if文条件式について

jaxxaxa

総合スコア10

Python

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

0グッド

0クリップ

投稿2020/11/12 02:07

編集2020/11/12 02:24

Pythonを使用してプログラムを作っているのですが、if文の条件式で不明点がありまして、質問させていただきました。

内容としては「比較演算子を使用したとき、右辺の式にorを使用すると正常に処理してくれないのか?」というものになります。

条件の内容がおかしいからif文が機能していないのか?と考え
if文を使用した簡単なプログラムを別で作成し検証してみたのですが、やはりorのあたりでおかしなことになっているのではと考えました。

ただ、調べてみてもif文に==もしくは!=を使用し、比較対象にorを使用すると挙動がおかしくなるみたいな記事は見当たらなかったので困っている状況です。

テストで作成したプログラムを掲載いたしますので、ご教授いただけますようお願いいたします。
(バージョンは最新のPython 3.8.5を使用しています。)

Python3

1import argparse 2 3parser = argparse.ArgumentParser(description='プログラムの説明') 4 5parser.add_argument('number') 6 7args = parser.parse_args() # 引数を解析 8 9def main(): 10 print("分岐前") 11 print("==========") 12 if args.number == '1': 13 print("test1") 14 elif args.number == '2': 15 print("test2") 16 else: 17 print("test3") 18 if args.number != '1': 19 print("2,3~") 20 21 if args.number != '1' or '2' or '3': 22 print("4~") 23 24 print("分岐終了") 25 26if __name__ == "__main__": 27 main() 28

以下、プログラム実行時のコンソールをキャプチャしたものです。
<期待値>
・引数「number」の入力値が
→1の場合:「分岐前 test1 分岐終了」
→2の場合:「分岐前 test2 2,3~ 分岐終了」
→3の場合:「分岐前 test3 2,3~ 分岐終了」
→4の場合:「分岐前 test3 2,3~ 4~ 分岐終了」
(入力値の妥当性チェック処理は実装していないので、1以上の整数値で入力すること。)
イメージ説明

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

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

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

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

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

sfdust

2020/11/12 02:26 編集

それぞれの入力値において、「期待するべき結果」(自分の考えではこのような出力がされるはずなのに、実際にはこのような出力となってしまっている、ということがわかる内容)も記載してください。
jaxxaxa

2020/11/12 02:25

それぞれの入力値における期待値を追記いたしました。
guest

回答3

0

orの扱い、めんどくさいですよね。以下、ご確認ください。

python3

1a = 1 2# or の左が偽の場合、右の値を返す 3print(a == 2 or 1) # -> 1 4# a == 2がFalseを返すので、False or 1となって1を返している 5 6# or の左が真(0でない)の場合、左の値を返す 7print(a == (2 or 1)) # -> False 8# ( 2 or 1 )が 2と返されて、a==2がFalseになる 9 10# よってオススメはorではなくinを使う 11print(a in [1,2,3]) # -> True

ご質問のコードだと

python3

1if args.number not in ['1','2','3']:

投稿2020/11/12 02:28

編集2020/11/12 02:35
jeanbiego

総合スコア3966

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

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

jaxxaxa

2020/11/12 04:24

ご回答ありがとうございます! Qiitaで探したところ以下の記事を発見しました。 https://qiita.com/cowkami/items/55df07104e07131e2a78 ものすごい冗長なコードになるので実際に使用するのはin演算子ですが、 args.number == '1' or args.number == '2' or...みたいに記述しても期待値通りの処理が実現できるのでしょうか?
jeanbiego

2020/11/12 04:46

(args.number == '1') or (args.number == '2') or... とやればいけそうな気がしますね。
guest

0

ベストアンサー

if args.number != '1' or '2' or '3': print("4~")

if (args.number != '1') or '2' or '3': print("4~")

すなわち

if (args.number != '1'): print("4~") elif '2': print("4~") elif '3': print("4~")

と同義です。

そして
'2', '3'はいずれも''ではないので、Trueとして評価されます。

限りなく元のコードを生かし、かつ示された要件のみ満たす(「01」等は入力されないものと仮定)ように実装するならば

if args.number not in ['1', '2', '3']: print("4~")

のようになります。

投稿2020/11/12 02:39

編集2020/11/12 02:41
sfdust

総合スコア1137

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

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

jaxxaxa

2020/11/12 04:11

ArgumentParserはデフォルトだと文字列型。 文字列の検索で「"'1','2','3'"を含まない」と条件を付けてif文実装すればよいという解釈になりますでしょうか? https://note.nkmk.me/python-str-search/ ↑こちらの資料も併せて確認させていただいたのですが、、
sfdust

2020/11/12 04:22

その御理解でよろしいかと思います。
jaxxaxa

2020/11/12 04:31

ありがとうございます、非常にわかりやすい解説をしていただき認識することができました。
guest

0

以下の'2' or '3' だとargs.numberが'2' or '3'でないときとなりません

また、この場合はorではなくてandを使うべきではと思います。

変更前

python

1if args.number != '1' or '2' or '3': 2 print("4~")

変更後
args.numberが'1'でもなく且つ'2'でもなく且つ'3'でもないとき

python

1if args.number != '1' and args.number != '2' and args.number != '3': 2 print("4~")

また、以下のようにした方が分かりやすいと思います。

args.numberが'4'以上のとき

python

1if args.number <= '4': 2 print("4~")

投稿2020/11/12 02:27

akiruno-oneone

総合スコア815

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問