高校向けPython入門(5) リスト
5 リスト
いくつかの値をまとめて扱いたいとき,リストを用いる。
リストは,角カッコの中に,まとめたいものをコンマで区切って表す。たとえば,1 桁の自然数は [1,2,3,4,5,6,7,8,9] と表せる。これを num という変数で表すなら, num = [1,2,3,4,5,6,7,8,9] とすればよい。この中のものを要素 という。要素の番号は 0 から始まる。m 番目の要素は num[m] で表す。
たとえば,print(num[4]) とすると,4 番目の要素 5 が表示される。0 番から始まるので, 4 番目の要素は 5 である。このあたり,生徒にとってはちょっとしたハードルになるだろう。
num[3] = 0 とすると,3 番目の要素に 0 が代入される。( 4 が 0 に変わる)
このことを,次のプログラムで確かめよう。

リストは文字の集まりでもよく,リストの集まりでもよい。リストのリスト(2 次元のリスト)の場合,その要素のリストの中の要素は [1][0] のように 2 つの括弧で表す。

リストの扱いで注意するのは,変数のようなコピーはできないということだ。
Python では,「変数に代入」というのは,値やリストをそのまま代入するのではなく,コンピュータのメモリ上にその値(数や文字列やリスト)を作り,その場所を変数で表すよう になっている。さらに,それがどんな値か(数か,文字列か,リストの要素か)によって,値を変更できるかどうかの扱いが異なる。
このとき,直感に反するのがリストだ。x = [1,2,3] とすると,x はリスト [1,2,3] がある場所を示す。 y = x とすると,y もリスト [1,2,3] がある場序を示す。ここで,y[1]=9 とすると, [1,2,3] の第 1 要素の 2 を 9 に変える。x は y と同様にこのリストの場所を示しているので,リスト x の第 1 要素も 9 になってしまうのだ。

変数の場合,b = a としたあとで b = 3 とすると,メモリ上にあらためて値 3 を作り,b はそこを指す。これに対して,リストの場合は,指定された要素を書き換えて,リストのある場所は変化しないので,x も変更されたように見えることになる。変更されたのはリストの要素であって, x も y も指し示す場所は変化しない。
なお,y = [5,6,7] とすれば,y は新しく作ったリストの場所を示すので,もとのリスト x は変化しない。実際にコードを書いて確かめられたい。
x というリストをそのまま取っておき,y にコピーして y だけを変更していきたい場合は, y = x とするのではなく,copy モジュールを使う。

2 次元のリストの場合は,さらに,deepcopy を使う。これについては,マニュアルを参照 のこと。
リストを扱うのに便利な関数がいろいろある。このあと,例題でいくつか説明していく。
【例】リストを使って 10 から 100 までの和を求める。
整数の連番は range() で作ることができるので,これをリスト化して利用する。リスト化 するには,list() を使う。リストの要素の和は sum() で求められる。

リストを使わなければ,for による繰り返しで次のようにする。

ところで,num = list(range(10,101)) で,本当に 10 から 100 までの整数のリストが できているのだろうか。print(num) で確かめればよいが,全部表示しなくても,最初と最後がわかればいいだろう。リストの要素の個数を求めて最後の要素を表示する。要素の個数は len(list) で求められる。

【例】2 の累乗の値を 2 から 2の10乗までリストにして表示し,その和を求める。(その 1) 1 から 10 までの連番をリストにし,それぞれの要素を 2のn乗 で置き換えていく。

ここで,range(10) は,0 から 9 までの連番で,リストのインデックスは 0 から始まること に注意しよう。
(その 2) はじめは空のリストを作っておき,2から順にリストに追加していく。リスト に要素を追加するには,append というメソッドを使う。メソッドというのは関数のようなものだ。リスト名の次に,ピリオドに続いてそのメソッド名を書き,引数に追加する要素を書く。

以下の例では,数学 B(2 年時に履修)で学ぶ数列を題材にしている。
【例】漸化式 a_1 = 1, a_2 = 1, a_(n+2) = a_(n+1) + a_n で表される数列(フィボナッチ数列)の,初項から第 10 項までの各項と,その和を表示する。
漸化式は,現在の項から次の項を計算するもの。したがって,初めは a_1, a_2 をリストにし ておき,a_1,a_2 を使ってa_3 を求めて追加する。第10項までなので,これを8回繰り返せば よい。

この「8 回」というのが,意外に生徒にはわかりにくいので注意。
【例】漸化式 a_1 = 1, a_(n+1) = 2a_n + 3 で表される数列 a_n の初項から第 10 項までの各項と,その階差数列を b_n として,両方とも表示する。

=========================
まだ追加するかもしれないが,ひとまずここまで。
ここまでのことが生徒もできれば,「情報Ⅰ」のプログラミングの節と,大学入試共通テストには対応できると思われる。
しかし,モデル化とシミュレーションやデータの分析もプログラミングでやるなら,図の描き方を知らなければならない。たとえば,文科省の教員用研修教材には,モンテカルロ法や,ヒストグラム(棒グラフで描いているが),放物運動のシミュレーションがあり,外部ライブラリの matplotlib を使っている。
が,matplotlib についての説明どころか,外部ライブラリの使い方などの説明は一切ない。例題だけ見て,真似してやってみようというのは無理な話だ。
生徒は詳しいことは知らなくてよいが,教員は知らなかったら指導できない。
matplotlib について詳しく書かれたPythonの入門書はほとんどない。以前も書いたが,Pythonの入門書ではなく,Jupyter Notebook の入門書で見つけた。本のタイトルには Pythonという文字はない。しかも,この本をちょっと読んだだけではやはりよくわからないのだ。詳しく調べるには matplotlib のWebページを参照するしかないのだが,書かれていることが膨大すぎて,プログラミングの初心者がこの中から必要なことを拾い上げるなど,ほとんど不可能だろう。
マニュアルには,今までに調べたことを書いてあるが,まだ足りない。必要なことを調べ上げるにはまだ時間がかかる。まあ,3月末にはなんとかなるかな。
