質問: "no": print("プログラムを終了します") # ここで終わる else: print("「yes」か「no」で答えてくださいッ!") # この後も diceQ に戻りたい continue ``` for以外にwhileで考えてはみたのですが、それらしきものはわかりませんでした。 for diceQ in "yes": の下りがおかしいのでしょうか。 よろしくお願いします。
回答: **原因** `for diceQ in "yes":`の部分が少なくともおかしいと思います。 この処理の意味は、"yes"を一文字ずつ処理するという意味です。 diceQには、順に"y","e","s"と入れられ、ループに入るので、 3回処理されるわけです。"y","e","s"は、どれも"yes"でもなく、 "no"でもないので、**3回**、"yes"か"no"でこたえてくださいという 処理に振り分けられてしまうのです。 for文は、最初にどのようなシーケンスを定めるかで、処理の回数が決まってしまうと言っていいです。つまり、有限回数のループを行うという点が、while文と違います。 そのため、無限ループという表現は、while文の説明でよくなされます。 **シーケンスとは** シーケンスとは、要素を一つずつ取り出すことのできる連続したデータの事を言います。 [1,2,3]などのリストや(1,2,3)のタプルはもちろん、"あいう"などの文字列もシーケンスとなります。他にもありますが、ここでは詳しく書きません。 連続したデータと書きましたが、[1]だと動かないというわけではありません。 ユーザーの入力によって、処理が終了するか、継続するかが問われていますから、while文によるのがいいでしょう。 for文だと、ユーザーの意志ではなく、シーケンスがすべて取り出されるか否かで終了するか否かでユーザーの意志にかかわらず終了してしまうため、ユーザーの意志に処理の継続をかかわらせているこのコードとは、親和性が無いと思います。おそらく質問者様の意図に沿わない結果になりそうです。 **代替案** 出来合いの物ですが、これを試してみてください。 ``` import random diceQ = "" while True: if diceQ =="": diceQ = input("サイコロを振りますか? : ") elif diceQ == "yes": dice = random.randint(1, 6) # random.randintで6面サイコロ print("結果が出ます。。。") print("[ ", dice, " ]が出ました。") # 結果が出た後 diceQ に戻りたい diceQ = ""#その都度、diceQを初期化 elif diceQ == "no": print("プログラムを終了します") break else: if diceQ != "": print("「yes」か「no」で答えてくださいッ!") diceQ = "" #その都度、diceQを初期化`コードをここに入力 ``` ` これだと、思ったような動作をされるのではないでしょうか? **continue文** `continue`はループ処理でループの最初に戻るということのようで、 while文でもfor文でも使えるようです。 私のコードより別解答の方のコードの方が`continue`を利用している美しい答案だと思います。 **random.randintの注意点** それと、`random.randint`の使い方ですが、これは、最初に変数に入れてしまうと、もう、その最初に入れた変数で固定化してしまいます。ループにいれて、その都度変数に入れなおさないと、別々の数字ではなく、常に同じ数字が出てくることになります。 もしよろしければ、`random.randoint(1,6)`をループの外に出して、処理の違いを確認してみてください。