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

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

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

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

Python 3.x

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

5回答

754閲覧

if/elifの条件が似ているのでコードを修正し短くすっきりさせたい

pystudent

総合スコア10

if

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

Python 3.x

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

3クリップ

投稿2020/05/04 01:52

前提・実現したいこと

多重ループの中にあるwhileに、if/elif/else条件が設定されています。
ifとelifの条件は少し異なるものの、大部分が同じ内容です。
統合させコードをすっきりさせたいです。アドバイスをいただけたら大変助かります。

location = input() という文を入れていまして、
locationに与えられた文字列が「HOME」だったらif、「OFFICE」だったらelifに移ります。それ以外はelse。if/elif内では最初に「HOME」「OFFICE」の表記を「Home」「Office」に直す文を与えています。しかしながら、そのあとに続く命令はif/elifどちらも全く同じです。

該当のソースコード

以下、抜粋になります。

python3

1 inputCheck = True 2 while inputCheck: 3 location = input("Location: ") 4 location = location.upper() 5 if len(location) == 0: 6 print("No data.") 7 inputCheck = False 8 9 elif len(location) > 0: 10 checkLocation = True 11 while checkLocation: 12 13#以下のif/elifが修正したい部分になります。 14 15 if location == "HOME" : 16 location = "Home" 17 listing = location + "." 18 listings.append(listing) 19 output = " It is at " + location + "." 20 print(output) 21 checkLocation = False 22 inputCheck = False 23 24 elif location == "OFFICE": 25 location = "Office" 26 listing = location + "." 27 listings.append(listing) 28 output = " It is at " + location + "." 29 print(output) 30 checkLocation = False 31 inputCheck = False 32 33 else: 34 checkLocation = False 35

試したこと

追加でwhile(listPrint)を作って試してみましたが、うまくいきませんでした。
挿入する場所が間違っているのでしょうか。

inputCheck = True while inputCheck: location = input("Location: ") location = location.upper() if len(location) == 0: print("No data.") inputCheck = False elif len(location) > 0: checkLocation = True while checkLocation: #if/elif文を最小限に修正し・・・ if location == "HOME" : location = "Home" listPrint = True elif location == "OFFICE": location = "Office" listPrint = True else: checkLocation = False #ここにlistPrintを追加しました。 listPrint = False while listPrint == True: listing = location + "." listings.append(listing) output = " It is at " + location + "." print(output) listPrint = False checkLocation = False inputCheck = False

補足情報(FW/ツールのバージョンなど)

python3.8.2

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

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

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

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

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

Kenji.Noguchi

2020/05/11 23:26

Pythonらしいコードを俗にパイソニックと言いますが、if location == X, elif location == Y, ... と言う感じで同じ変数をチェックしている場合はdictに置き換えるとパイソニックです。また入力がされたかどうかもif len(location) == 0とせずにif not locationとするだけでlocationがNoneまたは空文字列であることがチェックできます。これもまたパイソニックな書き方です。
pystudent

2020/05/12 07:08

そうなんですね。まだPython勉強し始めたばかりで知りませんでした。ご丁寧に教えていただきまして大変ありがとうございます。さっそく自分のコードに適用させていただきたいと思いますm(__)m
guest

回答5

0

ベストアンサー

以下の点を変更してみてはいかがでしょうか。

  • in を使って、locationが"HOME"や"OFFICE"などのいずれかにマッチするかを確認
  • str.capitalize() でlocationの先頭のみ大文字に
  • f-string を使って文字列の組み立て
  • checkLocation = False は共通なのでifブロックの外に出す(これでelse節をカット)

変更後のイメージは、こんな感じになります。

python

1target_locations = ("HOME", "OFFICE") 2listings = [] 3 4location = "OFFICE" 5 6if location in target_locations: 7 listings.append(f"{location.capitalize()}.") 8 print(f" It is at {location.capitalize()}.") 9 inputCheck = False 10checkLocation = False

投稿2020/05/04 02:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pystudent

2020/05/05 05:20

ご回答いただきまして大変ありがとうございました。知りたかったcapitalize機能とそのほかにも+αのアドバイスもいただけ、とても参考になりました。参考例もありがとうございました。
guest

0

While や check*** 変数の処理がわかりにくかったので全体を書き換えてみました。
p.py

python3

1 2LOCATIONS = {"HOME": "Home.", "OFFICE": "Office."} 3 4listings = [] 5while True: 6 location = input("Location: ") 7 if len(location) == 0: 8 break; 9 10 val = LOCATIONS.get(location.upper()) 11 if val: 12 listings.append(val) 13 print(" It is at " + val) 14 15print("End of Data.") 16print(listings)

実行例:
イメージ説明

空行をいれると、処理が終了します。
Home や office (大文字・小文字は区別しない) を入力すると、 listings にデータを追加し、
"it is ag ***." のような出力をします。
それ以外の入力は何もしません。

入力が終了したら、 "End of Data." を出力し、さらに listings[] の値も表示します。

投稿2020/05/04 03:38

編集2020/05/04 08:45
katoy

総合スコア22324

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

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

pystudent

2020/05/05 05:25

ご回答いただきましてありがとうございました。dictionary機能は使用したことがありませんでしたので、大変参考になりました。実際にコードの実行までしていただきとても感謝しております。本当にありがとうございました。また、アカウントフォローさせていただきました。
guest

0

文字列の文字を最初の文字のみ大文字、他を小文字に変化するにはstr.capitalize()が使えます。

https://docs.python.org/ja/3/library/stdtypes.html#str.capitalize

ですので

Python

1location = "Home" # or "Office"

の部分を

Python

1location = location.capitalize()

に置き換えることで、2つの条件文の中を完全に同じ内容にできるのではないでしょうか。

Python

1 #以下のif/elifが修正したい部分になります。 2 if location in ["HOME", "OFFICE"]: 3 location = location.capitalize() 4 listing = location + "." 5 listings.append(listing) 6 output = " It is at " + location + "." 7 print(output) 8 checkLocation = False 9 inputCheck = False 10 11 else: 12 checkLocation = False

投稿2020/05/04 02:52

magichan

総合スコア15898

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

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

pystudent

2020/05/05 05:22

的確なアドバイス大変ありがとうございました。教えてくださったcapitalize()機能を使わせていただきたいと思います。説明のリンクもつけていただき、本当に為になりました。ありがとうございます。
guest

0

比較する文字列と代入する文字列をテーブルに入れといて、ループさせれば、コードを書くのは一回分で済みますね

投稿2020/05/04 01:59

y_waiwai

総合スコア87719

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

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

pystudent

2020/05/05 05:22

ご回答いただきましてありがとうございました。ループ機能を使用してコードを修正したいと思います。
guest

0

python

1if location in ["HOME", "OFFICE"]: 2 listing = location.title() + "." 3 ... 4 ...

obj in (list likeなobj)で真偽判定できます。

投稿2020/05/04 02:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pystudent

2020/05/05 05:23

ご回答いただきまして大変ありがとうございました。教えていただきましたobj in []機能を使用して、コードを修正させていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問