step02 初めてのプログラム、変数の使い方
プログラミングの準備
コマンドプロンプト
python言語は、WindowsデスクトップというGUI(グラフィカルユーザインタフェース)の世界ではなく、コマンドプロンプトというCUI(キャラクタユーザインタフェース)の世界で動作する。これはWindowsの前身である「MS-DOS」というCUIベースのOSの名残だが、実は現在のWindowsも基底レベルではここで動作している。いわばWindowsの奥の院である。図2-1に、コマンドプロンプトの画面を示す。これは、このstepで最初に学ぶ「hello.py」を実行したところだ。

みなさんが馴染んでいるGUIの世界では、ウィンドウやアイコン(正式にはピクトグラム)にキーボードやマウスで指示することにより、さまざまな機能を呼び出す。これに対しCUIの世界では、ユーザがキーボードからコマンドライン(コマンド行)を入力し、プログラムも実行結果を文字列形式で出力する。ユーザとコンピュータが文字でインタラクション(情報のやり取り)を行うこの画面を、キーボード入力と合わせてコンソールという。
もちろんGUIの方が、画像やサウンドを駆使したプログラミングができ、華やかに映るが、そのためにはイベント駆動プログラミングという中級レベルの知識が必須なので、【基礎編】では、まずコマンドプロンプトという、いわば「自動車教習所」でプログラミングの基本を身につけ、【応用編】でTkinterやpygameなどのライブラリを使ったGUIプログラミングという、いわば「路上教習」につなげるというカリキュラムにした。CUIの世界は、なんだか見た目も真っ黒で暗いが、プログラムの動作は逆に見えやすく、分かりやすい。まあしばらくの辛抱だから、前向きに学んでいこう。
コマンドプロンプトの世界では、こちらがコマンドを入力しないと、何も起こらない。そこで最初に、ここで通用するいくつかのコマンドを覚えなくてはならない。これを図2-2にまとめておいた。コマンドはここに挙げた以外にもたくさんあるが、ここではこの講座で使うものだけに限っている。コマンド入力の手間を省ける便利な裏技も一緒に挙げておいた。

つぎに、これから多数作るサンプルプログラムを置くためのディレクトリ※1を、各自のUSBメモリのルート直下に作ろう。ディレクトリ名は「python」とする。コマンドプロンプト内での日本語入力はとても面倒だからだ。
1 Windowsの「フォルダ」を、コマンドプロンプトでは「ディレクトリ」と呼ぶ。
つまり皆さんは、毎回の講座のはじめに、スタートメニューからコマンドプロンプトを立ち上げ、その画面で、
f:(教室環境によってはe:かもしれない。USBメモリを指すドライブ文字)
cd python
という、2つのコマンドを入力すれば準備完了である。この手順は頭に叩き込んでおこう。
テキストエディタ
pythonプログラムは、形式的には定型テキストファイルなので、作成にはテキストエディタを使う。具体的には秀丸エディタを強く推奨する。長年使われている、日本を代表するテキストエディタだし、pythonなどのプログラミング言語についてもある程度知っているため、多少の入力支援をしてくれるからである。メモ帳を使うことはお奨めできない。
図2-3に、秀丸エディタで最初のサンプルプログラムを入力した画面を示す。
最終行の[EOF]は、ファイルの終わりを示す表示であり、文字ではない。この記号は必ず、プログラムの最終行の次行に、単独で置く。4行目のprint文の後ろにあると、python処理系がコマンドを無視するかもしれない。

プログラムの入力が終わり、間違いがないか確かめたら、ファイルを先ほど作ったpythonディレクトリに「名前をつけて保存」しなくてはならない。図2-4に、保存操作のときのダイアログ画面を示す。普通の日本語文章を入力した場合と異なる点が2つあるので注意が必要だ。

- pythonプログラムには、拡張子「.py」をつけて保存する※2
- 「ファイルの種類」を「すべてのファイル(*.*)にしてから、「hello.py」のファイル名を入力し、「保存」ボタンを押す。「秀丸」などのテキストエディタでは、そのまま保存するとテキストファイル(*.txt)として保存されるため、「ファイルの種類」を指定し忘れると、「hello.py.txt」というファイル名で、つまりテキストファイルとして保存されてしまう。当然、pythonプログラムとは認識されない。多くの初心者がつまづくところだから注意しよう。
- 「エンコードの種類」を、Unicode(UTF-8)と指定する
- エンコードとは、システムでマルチバイト文字(日本語など)を扱う際の文字コードの種類をいう。
「秀丸」などのテキストエディタでそのまま保存すると日本語(Shift-JIS)になるが、python3.xでは、日本語を含むすべての文字をUnicode(UTF-8)で扱う規定になっているので、それに合わせた指定が必要である※3。一度指定して保存すれば、上書き保存の時には気にしなくともよい。この指定は初心者が忘れがちなところなので、新たなプログラムを入力し、保存する時には常に気をつけなくてはならない。
2 【応用編】では「.pyw」というのも登場するが、これはGUIのプログラム用である。
3 pythonプログラムがUTF-8のテキストファイルであるということは、もはや1バイト文字(英数字)とか2バイト文字(日本語文字)といった区別がないことを意味する。これは大変便利なことで、変数名や関数名を日本語で自由につけられるわけである。この講座のサンプルプログラムでもしばしばその手を使っている。少なくとも、変な和製英語で命名するよりはるかによい。
プログラミングのための態勢
この講座を受講中は、デスクトップに、
- 秀丸エディタ:プログラムを入力、デバッグする
- コマンドプロンプト:プログラムを実行する
- エクスプローラ:「python」フォルダを表示しておき、プログラムファイルを選択する
また、机の上には、教科書を開いておこう。前stepでも述べたように、この講座【基礎編・応用編共通】では、
『入門 Python3』 Bill Lubanovic著 オライリー・ジャパン
を指定している。この講座資料では、親切丁寧な説明を心がけたけれど、python言語の文法の隅々まで網羅的に書いてあるわけではない※4。プログラミング作業は、このような「座右の書」がなければ、人生の時間をどんどん無駄にする。
4 そうするくらいなら、入門書を1冊書いて出版する。
名前を聞いて、あいさつする
プログラミング言語のカリキュラムでは、最初に「Hello, World!」という短いプログラムを作る慣わしになっている。いつ、どの言語から発祥した習慣かは、よくわからない。
リスト2-1に挙げたプログラムは、それを一部拡張し、ユーザの名前を訊ね、それを含めてあいさつを返す動作をする。コメントを含めてわずか5行の短いプログラムだが、データの入出力や変数への代入など、一通りの基本を含んでいる。
1行目はコメント(注釈)である。pythonでは、「#」から行末(改行文字)までがコメントとみなされる。
コメントは言語処理系ではなく、人間がプログラムを読むためのヒントである。処理系はコメント部分を何もせずに読み飛ばす。注釈の最初に書いてある「hello.py」は、このプログラムの名前であり、この名前で保存しよう(注意点は前述)。
2行目と4行目に見られるprint()関数※5は、文字列や数値などのデータを出力(表示)する。デフォルトの出力先はコンソール(コマンドプロンプト画面)であり、これを標準出力(sys.stdout)という。print()関数には、文字列定数('Howdy')や変数(name)、オプション(end = '')を引数(パラメータ)として渡すことができ、オプション以外の引数はこの順番で連結されて出力される。文字列中に変数名を記述すると、出力時に変数の値に置き換えられる(これを評価(eval)という)、Perl言語と異なり、文字列中においた変数の展開は起こらないから、文字列と変数とは、このように別々に指定しなくてはならない。より複雑な出力をしたいときには、step08で扱う書式指定を用いる方がよい。
print()中のオプション「end = ''」は、行末の改行を抑止する。同じ行にさらに文字列を表示したいときに使う。この形式の引数はキーワード引数という
5 数学における関数は、パラメータを計算して値を返すだけだが、pythonの関数は、他にいろいろなことをやってくれることがある(副作用という)。print()では副作用の方が重要で、関数が帰す値(出力した値そのもの)は使わないことが多い。
変数nameは、ユーザの名前という文字列を値としている。その値は3行目の代入文で与えられたものだ。ここでは関数input()に引数は与えられていないが、つぎのようにプロンプト文を与えれば、2行目の関数print()は不要になる。
name = input('あなたの名前を教えてください:')
いずれにしても、関数input()は、標準入力(sys.stdin)からユーザが入力した文字列、変数「name」に代入する。他の多くの言語と同様、pythonにおいて「=」は代入を意味する。数学で習った等号ではない。後述する条件式のなかで、「xは1に等しい」といった等式を表現するには、「x == 1」のように書く。つまり、
- =
- 代入演算子
- ==
- 比較演算子(等号)
つまり全体として、このプログラムは、
- ユーザの入力を促す文(プロンプト)を出力する。
- ユーザに名前文字列を入力させ、変数nameに格納する。
- その名前を織り込んだあいさつ文を出力する。
飲み会の勘定清算
最初の「hello.py」では、ユーザの名前という文字列を格納するために変数nameが使われた。今度は、数値を格納したいくつかの変数を使って、飲み会の勘定を計算するプログラムを作ってみよう。それぞれの変数の役割を判断して、【 空欄 】にどのような式が入るか考えよう。aveを浮動小数点数ではなく、整数にするには、除算の演算子にやや特別なものを使わなくてはならない。サンプルプログラムをリスト2-2に挙げる。
print()の中で、複数の値を出力するために、hello.pyとは異なり文字列連結演算子「+」が使われていることに注目しよう。str()は、数値を文字列化する関数である※6。pythonでは、四則演算で書けない計算などをするため、多くの関数が用意されている。必要に応じて活用しよう。関数は自分でも定義できる。
6 Perl言語などと違い、数値変数のままでは文字列に連結できないことに注意。
見慣れない演算子「-=」が並んでいるが、これは「左辺の変数から右辺(の式)を引いた値を新たに左辺に代入する」という意味である。つまり、
suzuki = suzuki - ave
と同じ意味になる。pythonに限らず、プログラム中ではこのように、変数の値を更新する処理が非常に多いので、更新する変数名を左辺と右辺に2回書く手間を省くため、このような演算子が多数用意されている。一部をここに挙げるが、他にどんな種類があるか、教科書で調べておこう。
- n += 5
- 加算して代入。「n = n + 5」と同じ。文字列やリストにも使える(その場合は「末尾に連結」を意味する)
- n -= 5
- 減算して代入。「n = n - 5」と同じ
- n *= 2
- 乗算して代入。「n = n * 2」と同じ
- n /= 2
- 除算して代入。「n = n / 2」と同じ
n += 1
n -= 1
7 逆にC系言語では、単項演算子++/--で変数の値を変えられることで、変数の評価(値の取り出し)と増減操作の順序をどうするかという問題が発生する。そこで順序と加減の組合せで、4通りの演算子が用意されている。便利と不便は常に背中合わせなのだ。
pythonでは、文字列を値とする変数(name)も、整数や浮動小数点数を値とする変数(ave)も、特に区別せず、事前の宣言なしで使える。このルーズさ(型付けの弱さ)は一見便利なようだが、プログラマが自分で変数の種類を意識的に管理していないと、逆に面倒なバグを生み出す原因にもなる。いいことずくめではないのだ。