whileで繰り返す
何件入力されるかは、使う人にしか分からない
for は決まった数だけ回るループでした。並んでいるものが 3 件なら 3 周です。
ところが、おこづかい帳に何件記録するかは使う人にしか分かりません。3 件で終わる日もあれば 20 件の日もあります。条件が続くかぎり回り続けるループが while です。
Python
while True:
text = input("品名を入力してください ")
if text == "おわり":
break
print(text + " を記録しました")while のうしろには条件を書き、それが真であるあいだ、下にインデントした処理を繰り返します。while True は条件がいつも成り立つので、そのままでは永遠に回ります。止める役目を担っているのが break で、その場でループを抜ける命令です。
if は条件を 1 回だけ調べますが、while は 1 周まわるたびに調べ直します。形は似ていても、そこが決定的に違います。
条件はどうやって偽になるのか
while True ではない形では、条件が偽になる仕掛けを自分で用意します。
Python
count = 0
while count < 3:
print(count)
count = count + 10 1 2 を表示して止まります。4 周目に入ろうとしたとき count は 3 になっていて、3 < 3 が偽になるからです。
count = count + 1 の行を書き忘れると count は 0 のままで、条件がいつまでも真になり、プログラムが止まらなくなります。これを 無限ループ と呼びます。手元で止まらなくなったら、Ctrl と C の同時押しで強制終了できます。
whileを書いたら、その場で「この条件はどうやって偽になるのか」を口に出して確認します。答えられないなら無限ループです。
キーボードの代わりに、リストから 1 件ずつ読む
このコースの採点は、関数が return した値を見ます。キーボードは繋がっていないので input() は使えません。そこで演習では、入力されるはずだった文字列の並びをリストで受け取り、input() を 1 回呼ぶ代わりにリストから 1 件取り出す、と読み替えます。
そのために借りる道具が 3 つあります。
Python
names = ["りんご", "みかん"]
print(len(names))
print(names[0])
names.append("パン")len は件数を返すので 2 が出ます。角かっこの中の数は位置で、0 が先頭、1 が次です。件数が 2 なら読める位置は 0 と 1 までで、2 を指すと IndexError になります。append はリストの末尾に 1 件足す命令です。
読む位置を表す変数を 0 から始め、1 周ごとに 1 つ進めていけば、while で先頭から順にたどれます。位置が件数に届いたら、もう読むものが無いのでループが終わります。
やってみよう
関数 collect_until_end(inputs) を実装してください。引数 inputs は文字列のリストで、入力されるはずだった品名が順番に並んでいます。
先頭から順に見ていき、"終了" に当たったらそこで止め、それより前の品名だけを並べたリストを return します。"終了" が含まれていない場合は、全部を並べたリストを返します。空のリストを渡されたときは [] を返します。
for でも書けますが、今回は while で書いてみてください。位置を進める行を書き忘れないよう気をつけてください。
要件
- 関数名は collect_until_end で、引数はリスト inputs の1つだけにする
- while を使って先頭から順に見ていく
- "終了" に当たったらそこで止め、それより前の品名だけを返す
- "終了" が無い場合と空のリストの場合も正しく動くようにする