41264


先月からPython3の勉強を始めた初心者です。

現在サイコロを振るプログラムを作っているのですが、  
その中でうまく動作の繰り返しを行うことができず悩んでいます。

下のようなコードなのですが、diceQ にどんな文字を入力しても  
else以下が3回繰り返されてしまいます。

[code]

    import random
    
    dice = random.randint(1, 6)     # random.randintで6面サイコロ
    
    
    diceQ = input("サイコロを振りますか？ : ")  # yesかnoの選択
    for diceQ in "yes":
        if diceQ == "yes":
            print("結果が出ます。。。")
            print("[ ", dice, " ]が出ました。")   # 結果が出た後 diceQ に戻りたい
            continue
        elif diceQ == "no":
            print("プログラムを終了します")    # ここで終わる
        else:
            print("「yes」か「no」で答えてくださいッ！")   # この後も diceQ に戻りたい
            continue
    
[/code]

for以外にwhileで考えてはみたのですが、それらしきものはわかりませんでした。  
for diceQ in "yes": の下りがおかしいのでしょうか。

よろしくお願いします。


CC BY-SA 3.0
2018-01-28T13:55:22.170
41263
2018-01-28T15:03:19.570
2018-01-28T14:18:42.770
24284
27172
question
python python3
for の中で if と continue を動作させたいです。


**原因**  
`for diceQ in "yes":`の部分が少なくともおかしいと思います。  
この処理の意味は、"yes"を一文字ずつ処理するという意味です。  
diceQには、順に"y","e","s"と入れられ、ループに入るので、  
３回処理されるわけです。"y","e","s"は、どれも"yes"でもなく、  
"no"でもないので、 **３回** 、"yes"か"no"でこたえてくださいという  
処理に振り分けられてしまうのです。

for文は、最初にどのようなシーケンスを定めるかで、処理の回数が決まってしまうと言っていいです。つまり、有限回数のループを行うという点が、while文と違います。  
そのため、無限ループという表現は、while文の説明でよくなされます。  
**シーケンスとは**  
シーケンスとは、要素を一つずつ取り出すことのできる連続したデータの事を言います。  
[1,2,3]などのリストや(1,2,3)のタプルはもちろん、"あいう"などの文字列もシーケンスとなります。他にもありますが、ここでは詳しく書きません。  
連続したデータと書きましたが、[1]だと動かないというわけではありません。

ユーザーの入力によって、処理が終了するか、継続するかが問われていますから、while文によるのがいいでしょう。  
for文だと、ユーザーの意志ではなく、シーケンスがすべて取り出されるか否かで終了するか否かでユーザーの意志にかかわらず終了してしまうため、ユーザーの意志に処理の継続をかかわらせているこのコードとは、親和性が無いと思います。おそらく質問者様の意図に沿わない結果になりそうです。  
**代替案**  
出来合いの物ですが、これを試してみてください。

[code]

    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を初期化`コードをここに入力
    
[/code]

`

これだと、思ったような動作をされるのではないでしょうか？  
**continue文**  
`continue`はループ処理でループの最初に戻るということのようで、  
while文でもfor文でも使えるようです。  
私のコードより別解答の方のコードの方が`continue`を利用している美しい答案だと思います。

**random.randintの注意点**  
それと、`random.randint`の使い方ですが、これは、最初に変数に入れてしまうと、もう、その最初に入れた変数で固定化してしまいます。ループにいれて、その都度変数に入れなおさないと、別々の数字ではなく、常に同じ数字が出てくることになります。  
もしよろしければ、`random.randoint(1,6)`をループの外に出して、処理の違いを確認してみてください。


CC BY-SA 3.0
2018-01-28T14:30:22.883
41264
2018-01-28T15:03:19.570
2018-01-28T15:03:19.570
24284
24284
41263
answer


`for diceQ in yes`  
としてしまうと、diceQには、`y`と`e`と`s`が1回ずつ入ってしまいます。  
そうなると`"y" == "yes"`、`"e" == "yes"`、`"s" == "yes"`となり絶対に条件がTrueになりません。  
そのため、else節が3回実行されています。

下の例のように変えてみてください

[code]

    import random
    
    
    while True: # whileを使う 
        diceQ = input("サイコロを振りますか？ : ")  # yesかnoの選択
        if diceQ == "yes":
            dice = random.randint(1, 6)    # random.randintで6面サイコロ
            print("結果が出ます。。。")
            print("[ ", dice, " ]が出ました。")
            continue # whileの最初に戻る
        elif diceQ == "no":
            print("プログラムを終了します")
            break # whileから抜ける
        else:
            print("「yes」か「no」で答えてくださいッ！")   # この後も diceQ に戻りたい
            continue
    
[/code]


CC BY-SA 3.0
2018-01-28T14:31:39.953
41265
2018-01-28T14:31:39.953
5246
41263
answer