while ... else

if文は、ifの条件が満たされなかった場合に実行されるelseブロックを持つことができます。同様に、whileループもelseブロックを持つことができ、whileの条件が満たされなかった場合に実行されます。
name = input()
if name != 'Alice':
    print('I don\'t know you')
else:
    print('Hi, Alice!')

print('End!')
name = input()
while name != 'Alice':
    print('I don\'t know you')
    name = input()
else:
    print('Hi, Alice!')

print('End!')
whileを使ったプログラムでは、名前が'Alice'でない限り、ユーザーに名前の入力を促し続けます。最終的に名前が'Alice'になった場合、条件name != 'Alice'は成立せず、プログラムはelseブロックに入り、Hi, Alice!を出力します。
 

それなら、whileの外でprint('End!')の直前に書けばいいのではないでしょうか?

この例では、その通りです!しかし、while ... elsebreak文を扱うときにとても便利です。whileループ内でbreakした場合、ループに入った時点で条件はまだ成立しているため、elseブロックは実行されません。これをwhile ... elseではなくwhile ... nobreakと呼ぶべきだという議論もありました。
数値に数字の5が含まれているか調べたいとします:
n = 123409087542108
while n != 0:
    if n % 10 == 5:
        print('The number contains a digit 5!')
        break
    n //= 10
else:
    print('The number does not have a digit 5')
このように、whileループがbreakすると、elseブロックは実行されません。そのため、数字の5を既に見つけた場合、プログラムは2番目のメッセージを出力しません。
whileループが最後まで到達し、条件がもう成立しなくなった場合、elseブロックが実行され、プログラムはThe number does not have a digit 5を出力します。
while ... elseの概念をwhile ... nobreakと解釈することができますが、プログラムではelseを用いて記述します。

チャレンジ

入力として与えられた整数について、その数字に3または7が含まれているかを判定するタスクです。含まれている場合、プログラムはThe number contains a digit 3 or 7と出力してください。含まれていない場合は、The number neither has a digit 3 nor a digit 7と出力します。
入力
出力
1208452
The number neither has a digit 3 nor a digit 7
12939078123
The number contains a digit 3 or 7
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue