2016-09-15 8 views
0

私はPythonを学んでいますが、次のコードで無限whileループに陥っています。pythonでのstatmentループwhile

A = input("Hello what is your name? ") 
D = input("What is today's date? ") 
B = input("Did you have a good day [y/N]") 
while B != "y" or B != "Y" or B != "N" or B != "n": 
    B = input("Did you have a good day [y/N]") 
else: 
    if B == "Y" or B == "y": 
     print(A + ", ") 
     C = input("Tell me about your day ") 
     with open("Start.txt", "a") as infile: 
      infile.write("\n") 
      infile.write(A) 
      infile.write(" ran Start.py and said he had a good day on ") 
      infile.write(D) 
      infile.write(".") 
      infile.write("\n He reports today:\n  ") 
      infile.write(C) 
    elif B == "N" or "n": 
     print(A + ", ") 
     C = input("Tell me about your day ") 
     with open("Start.txt", "a") as infile: 
      infile.write("\n") 
      infile.write(A) 
      infile.write(" ran Start.py and said he had a bad day on ") 
      infile.write(D) 
      infile.write(".") 
      infile.write("\n He reports today:\n  ") 
      infile.write(C) 

問題はBが、それはY、yに等しいかどうかを確認するために比較されたときにN、たまたま、あるいはn それはまだ関係なく、私はBのためにそれを与えるどのような入力while文の中に私をスティックず、続けて私はそこにいる。

答えて

0

問題は、orwhile B != "y" or B != "Y" or B != "N" or B != "n":

を行っているそのオプションのいずれかに該当する場合にはtrueを返すということです。 bは、まだ「n」は

あなたは問題がここにある。この while B != "y" and B != "Y" and B != "N" and B != "n":

2

を取得するためにand秒ですべてor Sを交換することによってこの問題を解決することができないので、だから、B =「N」 b!="N" or b!=n"がtrueの場合:

while B != "y" or B != "Y" or B != "N" or B != "n": 

Bは、それらのいずれかに常に等しくありません。それが「y」の場合、それは他の3つと等しくはありません。そして、これらの条件を組み合わせるのにorを使用しているので、いずれかが真であればループは継続します。これまでのように、常にそうです。 andを使用して

書き換え:

while B != "y" and B != "Y" and B != "N" and B != "n": 

またはドモルガンの法則(因子発現とスワップand/orのうちnot)適用:すべての

while not (B == "y" or B == "Y" or B == "N" or B == "n"): 

またはベストは、それをPythonのを書きますway:

while B.lower() not in "yn": 

(空の回答も受け付けます。プロンプトに応じて「N」に相当します。これに対処するには、ちょうどあなたのelifは条件なしで、平野elseに変換。)

0

このライン

elif B == "N" or "n": 

単に"n"(非空で、あなたが条件を使用する必要があります

elif B == "N" or B == "n": 

であるべき文字列)の意味はtrue

1

whileループの簡略化されたバージョンを使用します。

Falseと評価される方法はありません。 BがYに設定した

場合、B != "Y"Falseだろうが、B != "y"Trueだろう。

私は、このような場合には、入力がリスト内のいずれかの文字になるまで繰り返されます

while B not in ["y", "Y", "n", "N"]: 
    # ... 

ような何かをきれいかもしれないと思います。

編集:while B not in "yYnN"または同等のものを使用して他の回答が示唆されています。期待されるすべての応答が1文字なので、これはここで機能します。応答として"yes"を後で受け入れることに決めた場合は、上記のようにリストを使用する必要があります。

0

これは最も簡単な解決策です。

while B not in "YNyn":