chikuwa_paradise
@chikuwa_paradise

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonの「=」の扱い、bool型構文について

Q&A

Closed

解決したいこと

Pythonの「=」の扱い、bool型構文について

お世話になります。python始めたてで、こういう条件の文章を作ってみようという練習問題にて躓いたので質問させてください。

条件
1) 変数countを任意の値で初期化する
2) 画面に「ご飯をどうぞ」と表示する
3) 画面に「あなたはn杯のご飯を食べました」と表示 (nは何杯のご飯を食べたか、数字が入る)
4) 画面に「おかわりはいかが? (y/n)で答えてください」と表示
5) yが入力された場合、変数count を1増やして過程3)に戻る
6) nが入力された場合、「食いしん坊バンザイ!」と表示して終了

以下の2種類の文章を作りました。
ソースコードの下に疑問点を記載させていただきます。

該当するソースコード(1)

count = 0
print ("ご飯をどうぞ")
is_gohan = True
    while is_gohan == True:
    print ("あなたは{}杯のご飯を食べました".format(count))
     okawari= input ("おかわりはいかが? (y/n)で答えてください")
    if okawari == "y":
        count +=1
    else:
        is_gohan == False
        break
print ("ごちそうさまでした")

該当するソースコード(2)

count = 0
print ("ごはんを召し上がれ")
okawari = "y"
while okawari == "y":
    print ("あなたは{}杯のご飯を食べました".format (count))
    okawari = input ("おかわりは? y/n")
    if okawari =="y":
        count +=1
print ("ごちそうさまでした")

いずれも条件を満たすと思いますが、
質問1
ソースコード(1)にて、11行目にbreakを入れないと、任意の時点でinputに「n」を入力したときの出力結果は
「あなたは{}杯のご飯を」→「おかわりは?」→「あなたは{}杯の…」 と無限ループに陥ります。
10行目に「is_gohan == False」としてwhileの条件を満たなさいようにしたのでループにならないと思っていたのですが、
どのような点がおかしいのでしょうか?

質問2
ソースコード(2)にて、3行目の「okawari = "y"」を「okawari == "y"」とイコールを増やすと、
ご飯を召し上がれ
ごちそうさまでした

と2行のみ表示して終わる(whileに入っていない?)のですが、この点について、なぜ==としてはいけないのでしょうか。

以上2点に付きまして、ご教授ください。なにとぞよろしくお願いいたします。

自分で試したこと

がんばりました

1

2Answer

is_gohan == False

質問1:
== は比較演算子で、比較するだけで変数の値は変化しません。
= は代入文で、変数の値が変化します。
= にすれば break 不要になります。

質問2:
== は比較、= は代入です。
初期値を代入するためには = を使わないといけません。
== にすると変数に代入されない・変数が定義されないので実行エラーになります。

NameError: name 'okawari' is not defined

それと、「PEP8: Pythonコードのスタイルガイド」で、TrueFalseと比較するのはNGになってます。

ブール型の値と True や False を比較するのに == を使うのはやめましょう。:

# 正しい:
if greeting:
# 間違い:
if greeting == True:

もっと悪い:

# 間違い:
if greeting is True:
5Like

Comments

  1. 質問内容や、自分がわかっていない部分が明確にわかりました。
    ご回答いただき、ありがとうございました。

・=は代入。
・==は左辺と右辺が一致しているかの比較演算子。
概念が違います!

で、すでに回答が付いてあるので、僕はコードの添削してみます:grin:

code1.py
count = 0
print("ご飯をどうぞ")
while 1:
    print(f"あなたは{count}杯のご飯を食べました")
    okawari = input("おかわりはいかが? (y/n)で答えてください \n")
    if okawari == "y":
        count += 1
    else:
        break
print("食いしん坊バンザイ!")
code2.py
count = 0
print("ごはんを召し上がれ")
while 1:
    print(f"あなたは{count}杯のご飯を食べました")
    okawari = input("おかわりは? y/n \n")
    if okawari =="y":
        count += 1
    else:
        break
print("食いしん坊バンザイ!")

※補足※
・is_gohanなど変数名が微妙!といってもそもそもいい感じの変数名を考えるのはストレスなので、変数作らずに済む書き方ができるならそっちがベター!(変数名をしっかり考えることの重要性)
・while 1→の1は「1」でも「True」でも真になるのならなんでもOK。で、ループから抜けたいときにbreakで抜けるようにすれば、変数不要。
・別に問題なく動くけどメソッドの後の半角スペースは不要!めちゃくちゃ気になる!
・f文字列の方が楽にかける!
・改行コードは、"\n" (バックスラッシュ+n)
・食いしん坊バンザイ!

0Like

Your answer might help someone💌