niigata にログインして、 各自のホームディレクトリ (この授業用のディレクトリをつくっている人はそこ) に cd したうえで、 つぎのことをやってください。
Python には if と似た while という構文があって、 条件指定のところ (while のあと、コロン(:) のまえ) には論理型のものがくる。 それが真 (True) であるかぎり、そのあと段下げされた内容 (複数の文があってよい) がくりかえし 実行される。
ここでは、s という文字列変数を用意し、 s の現在の値を print (画面に表示) して、 「Input string>」というプロンプト文字列をだして入力待ちになり、 キーボードからつぎの s の値を読む、 ということをくりかえすプログラムをつくってみた。
ループの初回につかわれる s の値は、ループのまえに代入文であたえておくことにする。 (現在のプログラム例では 'mojiretsu' とあたえている。)
30: [未完成] 文字列を表示し、つぎの文字列を読むことをくりかえすプログラム。
このままでは、while の条件がつねに真 (True) なので、無限ループになってしまい、 おわらせるには、control-c で強制的にとめるしかない。
[変更 1] 文字列が「end」だったらループを終了するように変えてみる。
30_loop.py のプログラムを編集し、 「while True:」を「while s != 'end':」と書きかえて、動かしてみよう。 「!=」は (2文字あわせて)「not equal」 (等しくない) をあらわす演算子である。
【「while (s != 'end'):」のように条件を かっこ でくくってもよいが、くくらなくても意味はかわらない。 他のプログラム言語では かっこ が必須のことがある。】
キーボードから「end」(につづいて Enterキー) を入力したとき、 プログラムが正常に終了するだろう。[変更 2] 文字列が「空文字列」だったらループを終了するように変えてみる。 「空文字列」は、空白文字ではなく、文字数ゼロの文字列である。 キーボードから入力するときは、入力待ちになったらどの文字キーもおさずに Enter キーをおすと 空文字列が入力される。 プログラム中では、空文字列は、引用符を開いてすぐ閉じる、 つまり同じ引用符が2つすきまなしにならぶ形で表現される。
30_loop.py のプログラムを編集し、 もと「while True:」であったところを 「while s != '':」と書きかえて、動かしてみよう。 (「''」は single quotation mark を 2つ、空白をいれずにならべる。) キーボード入力が空文字列のとき、プログラムが正常に終了するだろう。
31: 文字列とその字数を書きだす作業をくりかえし、 入力された文字列が空文字列ならば終了するプログラム。
文字列の字数を得るには len() という関数をつかう。 【ただし、変数の型がリストや配列ならば、 len() は要素数を返す。 あとの例文38以後にその例がある。】
書きだすメッセージは英語にしてみたが、コメントとして日本語ローマ字のばあいも用意した。
文字列を引用符 (double quotation mark) でくくって書きだしたい。 プログラムの趣旨をわかりやすくするために、文字列変数 quote に引用符をひとつだけ入れ、 それをつかって出力文字列を組み立てるようにした。
32: うるう年の判定のプログラムは、[第2課] でつくったが、 そこでは、1つの年について判定した。 その最後の例文27 [27_leap.py] と同じ方法による判定を、 キーボードからの入力が空文字列でないかぎりくりかえすものを、例文32とする。 その中では、まず例文31と同様にキーボードから文字列を読みとり、 int() で整数 year に変換している。
数値を コンマくぎりで列挙し、角かっこでかこんだものが リスト (list) である。
for 文 の in のあとにリストを置くと、リストの各要素を順につかってループする。 (in のあとに直接リストを書いても、リスト型の変数に代入しておいて変数名を書いてもよい。)
33: リストに列挙された年についてそれぞれうるう年の判定をする。
【この例は内容をつぎの例文34と同じにしたのでリストの要素は小さい順にならんでいるが、 一般には、リストの要素はどのような順序にならんでいてもよいし、 同じ値が複数回あらわれてもよい。】
数値の例としては、1年きざみのばあいと、100年きざみのばあいをやってみて、 一方をコメントにしてある。
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:」としている。
数値の例としては、1年きざみのばあいと、100年きざみのばあいをやってみて、 一方をコメントにしてある。
34a: 例文 34 と同じ機能だが、リスト変数 yearlist をつかわず、 for 文 の in のあとに直接 range 関数をかく。
35: 西暦年をあたえられて、十二支を日本語ローマ字で表示する。
36: 西暦年をあたえられて、十干十二支を日本語ローマ字で表示する。 十干は、五行 (木火土金水) と「え・と」(兄・弟) から組み立てる。
37: 1! から順に整数の階乗を計算して数字で示す。
数値計算のための Numpy (npと略すことが多い) というパッケージをつかう。 そのために最初に「import numpy as np」を実行する。
Numpy の配列 (array) という型の複合変数をつかう。 (リストのなかまであるがリストとは区別されている。)
range と同様だが浮動小数点用の arange という関数がある。 「np.arange(astart, aend, astep)」のような形でつかう。 (「np.arange」は「Numpy というパッケージに属する arange」のような意味である。) range のばあいと同様、aend の値そのものはリストにふくまれず、その手前までである。 そこで、aend のところには、実際につかいたい上限の値よりもちょっと大きい値を指定する。 (この「ちょっと」は、range のばあいは 1 でよかったが、 arange では astep の値以下の適当な値をあたえる。 つぎのプログラム例では xeps という変数に代入する値であたえている。)
リストや配列の要素数は len という関数で知ることができる。
38: 一連の数値について、sin と cos を計算して数字で書き出す。
この例文では、print() の中に変数名を書きならべていて、 書式指定はしていない。結果の文字数がそろわない。
sin, cos, exp, log などの関数や 円周率 pi の値などは、 Python 本体にはなく、math パッケージ または Numpy パッケージのものをつかう。 例文では、Numpy にふくまれた sin, cos 関数をつかうことにしたので、 「np.sin」「np.cos」のような形でよびだしている。 もし math パッケージをつかうならば、「import math」を実行しておき、 「math.sin」「math.cos」のような形でよびだす。
38a: 例文 38 と同じ作業だが、print() の中に、変数を書式 (format) 指定して書きだす。
書式指定についてはここではくわしくのべない。希望があれば追って説明ページをつくる。 このプログラム例では、x の値は ASCII 8文字 (うち小数点下 4けた)、 sin(x), cos(x) の値は ASCII 12文字 (うち小数点下 8けた) の場所をとっている。
Python で 基本的な作図をするには、matplotlib というパッケージをつかう。 そのために最初に「import matplotlib.pyplot as plt」を実行する。 matplotlib のつかいかたには、figure と axes をくみあわせる方式があって、 あとの回ではそちらもつかう予定だが、今回は単純な方式による。
「plt.plot(x, y)」で、x, y にリストあるいは配列をあたえると、 x の各要素を横軸、y の各要素を縦軸にとったグラフをかく。 3つめの要素を指定しないと、折れ線になる。 3つめの要素として「'o'」, 「'x'」などの文字を書くと、 記号列による散布図のようなグラフになる。 (折れ線と記号列の両方をかくこともできるが、今回の例文にはふくめていない。)
matplotlib でこのようにしてつかえる記号とその指定のしかたを しめした日本語ページの一例と、matplotlibの「本家」のサイト (英語) を紹介しておく。
図をどこに出力するかを選択するため、savefig という論理型の (True または False の値をとる) 変数を用意し、False という値をあたえてある。
savefig が False のとき、 「plt.show()」が実行され、図は X Window の画面に出る。 (端末が Windows のばあい、あらかじめ xming を実行してから端末を起動すること。) 図を消してつぎに進むには、図の窓の右上にある「x」印を押せばよい。
savefig が True のとき、 「plt.savefig(画像ファイル名)」が実行され、 図は画像ファイルに出る。 例文では、画像ファイルの形式は 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 をつかう方式ではもうすこしわかりやすく指定できるのだが、 今回はそこまでいかない。)