変数

meg01

反復のプログラムはこのように書くこともできます。

反復と変数を使った演算の例

  • x = 0
  • for i in range(1, 6, 1):
  •   x = x + 1
  •   print("x =", x)
blackboard bar

1行目はx = 0だけど,3行目にはx = x + 1ってなってるね...

mana-10

x = 0なのか,x = x + 1なのか...どっちなのか混乱するんだけど...

gaku-10
meg01

数学と同じように考えてしまうと混乱しますね。

数学だと何か一つの数字を「x」と定めるので,「x = 0」と「x = x + 1」が同じところに出てくるのはおかしいです。

meg01

Pythonのプログラムでは「x = 0」は「xと0は等しい」ではなく,「xのなかに0を代入する」という意味です。

xは箱のようなものをイメージするといいです。

たしかに,「等しい」を表す演算子は「=」ではなく「==」だった! 数学の「=」とは意味が違うんだね。

gaku-10

じゃあ1行目は,「x」という箱に0をこんな感じで入れた状態ね。

3_hensu1

mana-10
meg08

そうです。最初xのなかには0を入れたけれども, 3行目ではx+1を入れ直しています。なので,箱のなかはx+1に変わりました。

3_hensu2

箱の(xの)中身は変わっていくんだね!

gaku-10
meg04

そうです。ちょっと難しい考え方なので,考え方をまとめた動画をみてみましょう。

応用的なプログラムの導入

meg01

これまでに「順次」「分岐」「反復」について学習しましたね。

順次は前から順番に,分岐は条件によってどちらの処理をするかを選択すること。

gaku05

反復は条件を満たすまで処理を繰り返すことですよね!

mana08
meg15

そう,その3つを使うと例えばこんなプログラムが書けました。

順次・反復・分岐を使ったプログラムの例

4-2_1
blackboard bar
meg08

これからの学習内容でもとても重要な考え方です。

順次,分岐,反復ですべてのアルゴリズムを表せるんですよね。

mana15

ってことはこの先ずっと使うまさに「基本」ってやつですね!

gaku11
meg01

今回学習していくのは「リスト」「乱数」です。これまでの「順次」「分岐」「反復」と組み合わせることで,もっと複雑なプログラムを効率的に書くことができるようになります。

リストの基本

meg01

今回学習するのは「リスト」を使ったプログラムです。

meg15

例えばこんなプログラムを作りたいと思ったとき,どういう風に書いていきますか。

試合得点の集計プログラム

  • あるバスケットボール部員の各試合(合計10試合)での得点を集計し,最低得点,最高得点,全試合での合計点,平均得点を求めるプログラムをつくる。

試合スコア

blackboard bar

1試合目をgame1,2試合目をgame2…っていう感じで,まず変数を定義していくかな…

リンク

mana09
meg08

そうですね。でも,大量のデータがあるような場合,すべてに変数名をつけるのは大変だし効率が悪いですね。

たしかに全部のデータに1つずつ名前をつけていくのは大変…

gaku07
meg15

そこで登場するのが「リスト」です。

リストを使うとどんな風にプログラムが書けるのかな。

mana09
meg01

変数名を1つつけることで,あとは「添字」と呼ばれる番号でリストの要素を使うことができます。

変数名を「games」とする

リンク

縦に長くならなくて,すっきり表せた感じがするね。

gaku05
meg08

games[0]が10,games[1]が13を意味しています。 gamesという変数と添字を組み合わせることでリスト内のデータを読み込むことができます。

添字が0からはじまっていることにも注意しておいてくださいね。

4_array

meg01

1行目でリストをつくり,2,3行目でリストの添字[0]と[1]の合計を表示するように記述しました。

次のプログラムをコピーして実行ボタンを押してみましょう。

リストを使ったプログラムの例

  • games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]
  • sum = games[0] + games[1]
  • print(sum)
blackboard bar

「23」が出力されたよ!

左から1番目と2番目の10と13がたし算されたんだね!

gaku11
meg15

そうです。このように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)
blackboard bar
meg12

2行目に「sum = 0」とありますね。「sum」という名前の変数(箱)を決め,その変数(箱)にgames[i]の点数をたしながらいれていくプログラムです。

4-3_5

meg11

だんだん複雑になってきましたね。ただ,プログラムに気を取られて,インデントを入れ忘れるなどの,基本的なミスをしないように気をつけていきましょう。

演習1

  • 上記のバスケットボール10試合分の得点データについて,平均点を求めるプログラムを書きましょう。
  • 平均点は全体の合計得点を試合数で割った数字です。
blackboard bar

リストの活用

meg08

ちなみに...もしもう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)
blackboard bar

games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14]

このリストに加えればいいよね。

gaku16

games = [10, 13, 8, 19, 21, 4, 8, 10, 2, 14, 16]

こうかな。

mana09
meg01

もう1か所,変えなければいけないですね。いまはリストの0から9まで,になっているので,0から10までになるようにします。

そうか,

for in range(0, 11, 1):

にしなきゃいけないね。

mana10
meg12

元のデータの数が変わるたびに,添字の指定も変えなければいけない状態だと,変え忘れたり,数値を間違えたりする元になります。

気をつけないといけないね…

gaku10
meg20

ただ,こういうときに便利なlenという書き方があります。

lenはリストの要素の数や文字数を数えてくれる関数です!

meg01

つまり,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))
blackboard bar

なるほど!10試合だから,0から10までって書いていたところを,「0から試合数分まで」っていう風に書けるってことですね!便利!

mana04
meg15

これはおまけですが,リストを使った繰り返しの場合は,次のような添字を使わない書き方も可能です。

こちらのほうが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))

blackboard bar
meg21

このように,結果は同じでも異なるプログラムもつくることができます。

わかりやすさや,データの追加変更への対応のしやすさなどを考えて最適なプログラムを考えられるようになれれば楽しくなってきますよ。

unfold_more 拡大