forで合計
3 件なら書ける、30 件は書けない
第 4 章までは、りんご 120 円とみかん 80 円のように、金額を 1 つずつ手で書いて足していました。3 件なら書けますが、30 件になると手に負えません。件数が増えても同じコードで動くようにする道具が ループ です。
Python でいちばんよく使うのが for です。並んでいるものを先頭から 1 つずつ取り出し、同じ処理を繰り返します。
Python
prices = [120, 80, 300]
for price in prices:
print(price)for のうしろに 取り出した 1 件を入れる名前 を、in のうしろに 取り出す元 を書きます。行末はコロンで閉じ、繰り返したい処理をその下にインデントして書きます。インデントの決まりは if とまったく同じです。
price には 1 周目に 120、2 周目に 80、3 周目に 300 が入ります。1 周ごとに中身が入れ替わる箱だと考えると分かりやすいです。
prices のように値を並べて 1 つにまとめたものを リスト と呼びます。角かっこの中に、値をカンマで区切って並べたものです。この章では、渡されたリストを for で回す使い方だけを覚えます。
入れ物はループの外に置く
1 周ごとに結果をためたいときは、for に入る 前 に入れ物を用意しておくのが定石です。
Python
names = ["りんご", "みかん", "パン"]
line = ""
for name in names:
line = line + name + " "
print(line)line = "" が入れ物の用意、line = line + name + " " が「今までの中身に 1 件分を足して入れ直す」処理です。この 2 行の組み合わせは、これから何度も出てきます。数を足し上げるときも、入れ物を 0 にしておく以外は同じ形です。
line = line + name は line += name とも書けます。+= は「右の値を足して入れ直す」という短縮形で、意味はまったく同じです。
入れ物の用意を
forの中に書いてしまうと、毎周ごとに空へ戻り、最後の 1 件しか残りません。入れ物はループの外、が鉄則です。
空のリストは 1 周も回らない
リストが空 [] のときは、取り出すものが最初から無いので、1 周もせずにループを抜けます。入れ物は用意したときの値のまま残ります。
つまり「空だったら」という場合分けを if で書かなくても、正しい答えが出ます。空のときに自然と正しくなる形 を選べているかは、書き終わったあとに必ず確かめる価値があります。
return の位置にも気をつけてください。ループの内側に置くと 1 周目で関数が終わり、最初の 1 件だけが返ります。return はループの外、for と同じ深さより手前です。
やってみよう
関数 total_price(prices) を実装してください。引数 prices は金額 (int) が並んだリストです。for ですべての要素を取り出して合計し、その合計を return します。
合計を入れる変数は、ループに入る前に 0 で用意します。リストが空のときは 0 を返しますが、そのための場合分けを書く必要はありません。書けたら total_price([120, 80, 300]) が 500 になるか、手元でも確かめてみてください。
要件
- 関数名は total_price で、引数はリスト prices の1つだけにする
- for でリストの要素を1つずつ取り出して合計する
- 合計を入れる変数はループに入る前に 0 で用意する
- 空のリストを渡されたときは 0 を返す
入出力例
total_price([120,80,300]) → 500
total_price([1000]) → 1000
total_price([120,80,300,50,250]) → 800
total_price([]) → 0
total_price([0,0,240]) → 240