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

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

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

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

Python

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

Q&A

解決済

4回答

977閲覧

if文のorのエラー

sasuke_killer

総合スコア42

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/08/16 12:48

編集2018/08/16 13:39

入力したキル数の平均を求める関数型プログラムです。
23行目のrecordsとnumの間に空白を空けているのはなぜでしょうか?

python3

1def get_kill_count(): 2 while True: 3 try: 4 return int(input("キル数は: ")) 5 except ValueError: 6 print("整数値を入力してください") 7 8 9def ask_quit(): 10 while True: 11 str = input("終了しますか? Yes/No: ") 12 if str == "Yes" or "yes": 13 return True 14 if str == "No" or "no": 15 return False 16 print("Yes/Noを選択して入力してください") 17 18 19def calc_average(records,num): 20 return (sum(records) + num) / (len(records) + 1) 21 22def show_average(records,num): 23 print("平均キル数:{}".format(calc_average(records, num))) #なぜ空白? 24 print("注意、記録は保持されません") 25 26 27kill_records=[1,2,5,6] 28while True: 29 show_average(kill_records, get_kill_count()) 30 if ask_quit(): 31 break

この前ある方からいただいたコードですので、もし不快だったら言ってください。

追記1

すみません、該当の個所が違いました。
12行目と14行目の条件式でorを使うと、意図しない挙動を起こします。(YesでもNoでも、終了してしまう)
なぜか、わかりますか?

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

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

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

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

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

guest

回答4

0

12行目と14行目の条件式でorを使うと、意図しない挙動を起こします。(YesでもNoでも、終了してしまう)

なぜか、わかりますか?

python

1str == "Yes" or "yes"

という比較は、演算子の優先順位*1に従って

python

1(str == "Yes") or ("yes")

という順番で処理されます。

str == "Yes"はわかるけど、"yes"に対して論理演算はできないじゃん」と思われるかもしれませんが、pythonのオブジェクトは雑に言えばすべてbool値に変換できます。

python

1>>> bool("yes") 2True

細かい定義とかは参考リンク*2を見てくれれば良いのですが、とにかくこの真理値判定にもとづいてその式が評価されます。

bool("yes")が常にTrueであるために、その式は常にTrueになります。

参考:
*1 演算子の優先順位 - 数値 - Python入門
*2 4. 組み込み型 — Python 3.6.5 ドキュメント 4.1. 真理値判定

投稿2018/08/16 13:34

hayataka2049

総合スコア30933

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

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

sasuke_killer

2018/08/16 13:41

なるほど、比較演算子の順番がポイントだったのですね。 回答ありがとうございました!
guest

0

ベストアンサー

12行目と14行目の条件式でorを使うと、意図しない挙動を起こします。

orの使い方を完全に誤っています。
ご提示のコードは次のように書いているのと同じです。

Python

1if (str == "Yes") or ("yes"):

Pythonでは空でない文字列は真値として取り扱われるので、上記の条件式は恒真です。

次のように書くと良いでしょう。

Python

1if str in ('Yes', 'yes',):

どうしてもorを使いたいなら、次のようにします。

Python

1if (str == "Yes") or (str == "yes"):

ただし

変数名にliststrintなどの命名をすることは絶対に避けてください。
不可解なエラーを引き起こします。

Python

1>>> str(42) 2'42' 3>>> str = 'spam' 4>>> str(42) 5Traceback (most recent call last): 6 File "<stdin>", line 1, in <module> 7TypeError: 'str' object is not callable

元の質問に対して

PythonにはPEP8という規定があり、それに従うのが慣習となっています。
PEP 8 -- Style Guide for Python Code
PEP 8 -- Style Guide for Python Code (和訳)

ただ、『カンマの後には空白を開けましょう』って規定が見当たらないのですよね...
pycodestyleはしっかりとそれを報告してくれるのですが。

plain

1>python --version 2Python 3.6.2 :: Continuum Analytics, Inc. 3 4>python -m pycodestyle --version 52.4.0 6 7>type tera3.py 8print(1,2) 9 10>python -m pycodestyle tera3.py --show-pep8 11tera3.py:1:8: E231 missing whitespace after ',' 12 Each comma, semicolon or colon should be followed by whitespace. 13 14 Okay: [a, b] 15 Okay: (3,) 16 Okay: a[1:4] 17 Okay: a[:4] 18 Okay: a[1:] 19 Okay: a[1:4:2] 20 E231: ['a','b'] 21 E231: foo(bar,baz) 22 E231: [{'a':'b'}]

私の見ている情報が古いのだろうか?

投稿2018/08/16 13:27

編集2018/08/16 13:57
LouiS0616

総合スコア35660

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

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

sasuke_killer

2018/08/16 13:36

なるほど。ありがとうございます!
sasuke_killer

2018/08/16 14:03

式や文中の空白文字 イライラの元 という続いている二つの見出しにある 末尾のカンマと、その後に続く閉じカッコの間: という項目は裏を返せば、(続く場合)『カンマの後には空白を開けましょう』ということなのではないでしょうか?
LouiS0616

2018/08/16 14:10 編集

『イライラする空白の置き方』が網羅されているという仮定の下で、『カンマの後には空白を開けてもイライラしない』ってことしか導かれないのですよね。 イライラしない空白なら置かねばならないと強制する記述は無いのです。
guest

0

特に理由はありません。「この方が見やすい」と思ったから、そういうルールにしているのでしょう。
なんか、よく分からないルールですね。「仮引数を区切るカンマの後は空けない。実引数を区切るカンマの後は空ける。配列の要素を区切るカンマの後も空けない」ですかね。

何故ここだけ気になるのでしょうか?
str = input("終了しますか? Yes/No: ")=の前後とか、他にもたくさん文法的には不要な空白があります。

投稿2018/08/16 13:01

otn

総合スコア84533

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

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

sasuke_killer

2018/08/16 13:12

あれ、すみません、この部分で意図しない挙動がおきているのかと思いましたが違いました。 とりあえず、回答ありがとうございます。
otn

2018/08/16 13:22

カンマの後の空白のことですよね?
otn

2018/08/16 13:40

ありゃ、質問が全然別の物になってる。
sasuke_killer

2018/08/16 13:42

すみません、勘違いしていたようです。
sasuke_killer

2018/08/16 13:43

空白ではなく、if文が意図しない挙動の原因でした
guest

0

質問文のコードを a.py とし、 style 修正しコードを b.py としました。

b.py

python3

1def get_kill_count(): 2 while True: 3 try: 4 return int(input("キル数は: ")) 5 except ValueError: 6 print("整数値を入力してください") 7 8 9def ask_quit(): 10 while True: 11 str = input("終了しますか? Yes/No: ") 12 if str == "Yes" or "yes": 13 return True 14 if str == "No" or "no": 15 return False 16 print("Yes/Noを選択して入力してください") 17 18 19def calc_average(records,num): 20 return (sum(records) + num) / (len(records) + 1) 21 22def show_average(records,num): 23 print("平均キル数:{}".format(calc_average(records, num))) #なぜ空白? 24 print("注意、記録は保持されません") 25 26 27kill_records=[1,2,5,6] 28while True: 29 show_average(kill_records, get_kill_count()) 30 if ask_quit(): 31 break 32

a,py, b,py の style chekp 結果と 2つのフィアルの差分を示します。
イメージ説明

a.py は警告が出てますが、b.py は警告は消えています。
この差分にでている SPACE 有無は、プログラムの動作には影響はないはずです。

追記:

if str == "Yes" or "yes":

は, 他の回答にあるように、変な記述ですね。

[https://teratail.com/questions/141409] の回答にあった類義のコードでは、

str = input("終了しますか? Y/N:") if str == 'Y':

となってます。
これを Yes/No の入力に対応sしようとした際にミスしたと思われます。

イメージ説明

投稿2018/08/16 13:36

編集2018/08/16 14:07
katoy

総合スコア22324

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

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

sasuke_killer

2018/08/16 13:55

空白は問題ないのですね。 調べていただきありがとうございました!
sasuke_killer

2018/08/16 14:28

はい、その通りでございます...!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問