変数
反復のプログラムはこのように書くこともできます。
反復と変数を使った演算の例
- x = 0
- for i in range(1, 6, 1):
- x = x + 1
- print("x =", x)
1行目はx = 0
だけど,3行目にはx = x + 1
ってなってるね...
x = 0
なのか,x = x + 1
なのか...どっちなのか混乱するんだけど...
数学と同じように考えてしまうと混乱しますね。
数学だと何か一つの数字を「x」と定めるので,「x = 0」と「x = x + 1」が同じところに出てくるのはおかしいです。
Pythonのプログラムでは「x = 0
」は「xと0は等しい」ではなく,「xのなかに0を代入する」という意味です。
xは箱のようなものをイメージするといいです。
たしかに,「等しい」を表す演算子は「=」ではなく「==」だった! 数学の「=」とは意味が違うんだね。
じゃあ1行目は,「x」という箱に0をこんな感じで入れた状態ね。
そうです。最初xのなかには0を入れたけれども, 3行目ではx+1を入れ直しています。なので,箱のなかはx+1に変わりました。
箱の(xの)中身は変わっていくんだね!
そうです。ちょっと難しい考え方なので,考え方をまとめた動画をみてみましょう。
応用的なプログラムの導入
これまでに「順次」「分岐」「反復」について学習しましたね。
順次は前から順番に,分岐は条件によってどちらの処理をするかを選択すること。
反復は条件を満たすまで処理を繰り返すことですよね!
そう,その3つを使うと例えばこんなプログラムが書けました。
順次・反復・分岐を使ったプログラムの例
これからの学習内容でもとても重要な考え方です。
順次,分岐,反復ですべてのアルゴリズムを表せるんですよね。
ってことはこの先ずっと使うまさに「基本」ってやつですね!
今回学習していくのは「リスト」「乱数」です。これまでの「順次」「分岐」「反復」と組み合わせることで,もっと複雑なプログラムを効率的に書くことができるようになります。
リストの基本
今回学習するのは「リスト」を使ったプログラムです。
例えばこんなプログラムを作りたいと思ったとき,どういう風に書いていきますか。
試合得点の集計プログラム
- あるバスケットボール部員の各試合(合計10試合)での得点を集計し,最低得点,最高得点,全試合での合計点,平均得点を求めるプログラムをつくる。
1試合目をgame1,2試合目をgame2…っていう感じで,まず変数を定義していくかな…
そうですね。でも,大量のデータがあるような場合,すべてに変数名をつけるのは大変だし効率が悪いですね。
たしかに全部のデータに1つずつ名前をつけていくのは大変…
そこで登場するのが「リスト」です。
リストを使うとどんな風にプログラムが書けるのかな。
変数名を1つつけることで,あとは「添字」と呼ばれる番号でリストの要素を使うことができます。
変数名を「games
」とする
縦に長くならなくて,すっきり表せた感じがするね。
games[0]
が10,games[1]
が13を意味しています。
games
という変数と添字を組み合わせることでリスト内のデータを読み込むことができます。
添字が0からはじまっていることにも注意しておいてくださいね。
1行目でリストをつくり,2,3行目でリストの添字[0]と[1]の合計を表示するように記述しました。
次のプログラムをコピーして実行ボタンを押してみましょう。
リストを使ったプログラムの例
- games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]
- sum = games[0] + games[1]
- print(sum)
「23」が出力されたよ!
左から1番目と2番目の10と13がたし算されたんだね!
そうです。このように1つの変数名と添字でたくさんのデータを扱うことができます。このリストとこれまで学習した分岐や反復を使うと,合計点を求めるプログラムもこのように書くことができます。
リストを使って合計を求めるプログラムの例
- # リストを記述
- games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]
- sum = 0
- # i を0から9まで,1ずつ増やす
- for i in range(0, 10, 1):
- # i を添字としてリストを読み込み合計に加算する
- sum = sum + games[i]
- print(sum)
2行目に「sum = 0」とありますね。「sum」という名前の変数(箱)を決め,その変数(箱)にgames[i]の点数をたしながらいれていくプログラムです。
だんだん複雑になってきましたね。ただ,プログラムに気を取られて,インデントを入れ忘れるなどの,基本的なミスをしないように気をつけていきましょう。
演習1
- 上記のバスケットボール10試合分の得点データについて,平均点を求めるプログラムを書きましょう。
- 平均点は全体の合計得点を試合数で割った数字です。
- games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]
- sum = 0
- for i in range(0, 10, 1):
- sum = sum + games[i]
- print(sum / 10)
リストの活用
ちなみに...もしもう1試合やることになって,その試合が16点だったら,平均点を表示するプログラムはどのように変更するといいかな。
元のプログラム
- games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]
- sum = 0
- for i in range(0, 10, 1):
- sum = sum + games[i]
- print(sum / 10)
games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]
このリストに加えればいいよね。
games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14, 16]
こうかな。
もう1か所,変えなければいけないですね。いまはリストの0から9まで,になっているので,0から10までになるようにします。
そうか,
for in range(0, 11, 1):
にしなきゃいけないね。
元のデータの数が変わるたびに,添字の指定も変えなければいけない状態だと,変え忘れたり,数値を間違えたりする元になります。
気をつけないといけないね…
ただ,こういうときに便利なlen
という書き方があります。
len
はリストの要素の数や文字数を数えてくれる関数です!
つまり,len(games)
とすることで,games
のリストにある要素の数(=試合数)を自動で数えてくれるんですよ。
リストのlenを使ったプログラム例
- games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14, 16]
- sum = 0
- for i in range(0, len(games), 1):
- sum = sum + games[i]
- print(sum / len(games))
なるほど!10試合だから,0から10までって書いていたところを,「0から試合数分まで」っていう風に書けるってことですね!便利!
これはおまけですが,リストを使った繰り返しの場合は,次のような添字を使わない書き方も可能です。
こちらのほうがPythonらしいプログラムだと思うので,一度試してみてくださいね。
リストの反復のプログラム例
- games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14, 16]
- sum = 0
- # リストの要素が一つずつgameに入ります
- for game in games:
- sum = sum + game
- print(sum / len(games))
このように,結果は同じでも異なるプログラムもつくることができます。
わかりやすさや,データの追加変更への対応のしやすさなどを考えて最適なプログラムを考えられるようになれれば楽しくなってきますよ。