niigata にログインして、 各自のホームディレクトリ (この授業用のディレクトリをつくっている人はそこ) に cd したうえで、 つぎのことをやってください。
Python には if と似た while という構文があって、() の中には論理型のものがくる。 それが真 (True) であるかぎり、そのあと段下げされた内容 (複数の文があってよい) がくりかえし 実行される。
ここでは、文字列変数 s に読みこんだ値によってループを終了するようにしたいのだが、 ループの頭の while( ... ) の条件のなかで input() を実行することはできないらしい (できたとしてもわかりにくいプログラムになる) ので、 ループの最後で s を読むことにする。 初回の s の値は input ではなく代入文であたえておく。
30: [未完成プログラム] while の条件がつねに真 (True) だと、無限ループになってしまい、 control-c で強制的にとめるしかない。
31: 読まれた文字列が空文字列 (空白文字ではなく、文字数ゼロの文字列。 引用符を開いてすぐ閉じることによって表現する) だったら ループを終了する。
32: 前回の例文に追加した 27_leap.py の処理を 31_loop.py と同様なループでまわす。
s に読まれた文字列を int() で 整数 year に変換してつかう。
数値を コンマくぎりで列挙し、角かっこでかこんだものが リスト (list) である。
for 文 の in のあとにリストを置くと、リストの各要素を順につかってループする。 (in のあとに直接リストを書いても、リスト型の変数に代入しておいて変数名を書いてもよい。)
33: リストに列挙された年についてそれぞれうるう年の判定をする。
【この例は内容をつぎの 34 と同じにしたのでリストの要素は小さい順にならんでいるが、 一般には、リストの要素はどのような順序にならんでいてもよいし、 同じ値が複数回あらわれてもよい。】
range() という関数によって、整数のリストをつくることができる。 range(istart, iend, istep) とすれば、 リストの最初 (0番) の要素の値が istart, つぎ (1番) の要素の値が istart+istep というように 順に istep をたしていって、iend の手前 までいく。 iend の値はリストに ふくまれない ので、iend には ふくめたい最大の値 +1 をいれておく。 【このようなリスト終端の指定のしかたは Python 言語の特徴で、 他のプログラム言語の習慣とちがう。】
range関数に 2つだけの引き数を指定すると、それは istart と iend で、 istep = 1 とみなされる。
range関数に 1つだけの引き数を指定すると、それは iend で、 istart = 0, istep = 1 とみなされる。
34: 33 と同様な うるう年の判定だが、 対象となる年を range関数で指定するようにした。
この例文では、range 関数をリスト変数 yearlist に代入しているので、 それをつかえば、つぎの for 文は 「for range in yearlist:」でよい。 しかし、for 文 の yearlist のところに range 関数を書きこんでしまうこともできる。 ここではそうしたので、yearlist は いらないのだが、 リストをつくっていることの確認のためにのこしておいた。
数値の例としては、1年きざみのばあいと、100年きざみのばあいをやってみて、 一方をコメントにしてある。
35: 西暦年をあたえられて、十二支を日本語ローマ字で表示する。
36: 西暦年をあたえられて、十干十二支を日本語ローマ字で表示する。 十干は、五行 (木火土金水) と「え・と」(兄・弟) から組み立てる。
37: 1! から順に整数の階乗を計算して数字で示す。
数値計算のための Numpy (npと略すことが多い) というパッケージをつかう。 そのために最初に「import numpy as np」を実行する。
Numpy の配列 (array) という型の複合変数をつかう。 (リストのなかまであるがリストとは区別されている。) range と同様だが浮動小数点用の arange という関数がある。 「np.arange(astart, aend, astep)」のような形でつかう。 ここで「np.arange」は「Numpy というパッケージに属する arange」のような意味である。 リストや配列の要素数は len という関数で知ることができる。
38: 一連の数値について、sin と cos を計算して数字で書き出す。
同じものを 2回書き出している。 最初は print() の中に変数名を書きならべる方式で、文字数がそろわない。 2回めは書式文字列という機能をつかって文字数をそろえている。
(sin, cos, exp, log などの関数や 円周率 pi の値などは、 Python 本体にはなく、math パッケージのものをつかうことが多い。 例文では、Numpy にふくまれた sin, cos 関数をつかうことにしたので、 「import math」は不要になったが、消さずに残してある。)
Python で 基本的な作図をするには、matplotlib というパッケージをつかう。 そのために最初に「import matplotlib.pyplot as plt」を実行する。 matplotlib のつかいかたには、figure と axes をくみあわせる方式があって、 あとの回ではそちらもつかう予定だが、今回は単純な方式による。
「plt.plot(x, y)」で、x, y にリストあるいは配列をあたえると、 x の各要素を横軸、y の各要素を縦軸にとったグラフをかく。 3つめの要素を指定しないと、折れ線になる。 3つめの要素として「'o'」, 「'x'」などの文字を書くと、 記号列による散布図のようなグラフになる。 (折れ線と記号列の両方をかくこともできるが、今回の例文にはふくめていない。)
[授業後補足] matplotlib でこのようにしてつかえる記号とその指定のしかたを しめした日本語ページの一例と、matplotlibの「本家」のサイト (英語) を紹介しておく。
「plt.show()」を実行すると、図は X Window の画面に出る。 (端末が Windows のばあい、あらかじめ xming を実行してから端末を起動すること。) 図を消してつぎに進むには、図の窓の右上にある「x」印を押せばよい。
そのかわりに「plt.savefig(画像ファイル名)」を実行すると、 図は画像ファイルに出る。 プログラム例 39, 40 では、「plt.show()」の行の頭に「#」をつけてコメントにし、 「##plot.savefig(...)」をふくむ「##」のついた4行の「##」をはずして実行文にする。 例文では、画像ファイルの形式は png にしてある。
png 形式の画像ファイルは、display コマンド (ImageMagick または GraphicsMagick というソフトウェアにふくまれる) をつかって、X Window の画面に表示できる。
39: t を横軸にとって sin(t) と cos(t) のグラフをかく。
グラフの凡例を plt.legend() でつけている。 そこで書く文字列は、plt.plot() のパラメーター「label」であたえている。
40: 横軸に cos、縦軸に sin をとって散布図のようなプロットをする。
図の縦横比を 1:1 にするために 「plt.gca().set_aspect('equal', adjustable='box')」をつかっている。 (figure と axes をつかう方式ではもうすこしわかりやすく指定できるのだが、 今回はそこまでいかない。)