Pythonに挑戦(15)
1.導入
Windows環境にPython処理系を導入する方法について書きます。
Pythonの代表的サイトは、
Pythonの代表的サイトは、
です。このサイトのメニューには、
[About] [Downloads] [Documentation] [Community] [Success Stories] [News] [Events]
が並んでいて、充実したウェブサイトです。
[About] [Downloads] [Documentation] [Community] [Success Stories] [News] [Events]
が並んでいて、充実したウェブサイトです。
[About]メニューをクリックすると、
[Getting Started] 初心者向けの記述があります。インストールに関する注意も書かれています。
[Friendly & Easy to Learn] Python関連文書への入り口、メーリング・リストへの入り口があります。
[Applications] 種々の応用事例が書かれています。
[Open-source] Pythonは基本的にオープン・ソースでうが、Pythonのライセンスに関する注意が書かれています。
[Downloads]メニューをクリックすると、様々なバージョンのPythonのダウンロードができるようになっています。開発日程も書かれています。
[Documentation]メニューをクリックすると、
[Beginner] 初心者用の記述、Pythonに関するFAQがあります。
[Moderate] Python関係の定期刊行物・書籍の紹介が書かれています。
[Advanced] Pythonのパッケージ化の流れ、パッケージの配布に関する案内について書かれています。
[General] PEP(Python Enhanced Proposals)の入り口があります。また、Python関連イベントの動画を見ることができます。
[Community] Python関連のコミュニティーが紹介されています。
[Success Stories] 種々の分野への成功事例が紹介されています。
[News] Pythonに関する最近のできごと、新バージョンが公開された、というようなことが書かれています。
[Events] Python関連の来たるイベントが紹介されています。
Pythonをインストールするためには、[Downloads]メニューをクリックします。
最初の[Active Python Releases]には、Pythonにどのようなバージョンがあるかが書かれています。開発中のもの、リリースされた日付なども書かれています。
次の[Looking for a specific release?]のリストの中から、導入するPythonのバージョンを選択します。Pythonはバージョンによって機能・文法が異なることがあるので、場合によっては古いバージョンを選択する必要があるかも知れません。各バージョン毎にリリース・ノートがついているので、これを参考にします。バージョンを選択すると出てくるページには、色々な注意書きがされていて、一番下に、どの環境のものをダウンロードするのかを選択するリストがあります。Windows(64bit)とか、macOSとか、どれか選択します。Windowsであれば、ダウンロード・フォルダーにzipファイルとしてダウンロードされます。
なお、新版を導入する場合には、旧版をアンインストールしてから導入することになります(旧版を残すこともできます)。
ダウンロードされたパッケージを解凍実行すると開かれるダイアログには、
[Install Now]と[Customise installation]の2つが選べるようになっていますが、簡単にインストールするには、[Install Now]を選べばよいのですが、Windowsのユーザ領域にインストールされてしまうので、[Customise installation]を選んでProgram Filesの中に導入するようにします。但し、ファイル・コピーの権限などでうまく行かないこともあり得ます。
導入後、コマンドライン・プロンプトから起動しようとすると、PATHが通っていないので、導入したディレクトリをPATHに付加する必要があります。
次の[Looking for a specific release?]のリストの中から、導入するPythonのバージョンを選択します。Pythonはバージョンによって機能・文法が異なることがあるので、場合によっては古いバージョンを選択する必要があるかも知れません。各バージョン毎にリリース・ノートがついているので、これを参考にします。バージョンを選択すると出てくるページには、色々な注意書きがされていて、一番下に、どの環境のものをダウンロードするのかを選択するリストがあります。Windows(64bit)とか、macOSとか、どれか選択します。Windowsであれば、ダウンロード・フォルダーにzipファイルとしてダウンロードされます。
なお、新版を導入する場合には、旧版をアンインストールしてから導入することになります(旧版を残すこともできます)。
ダウンロードされたパッケージを解凍実行すると開かれるダイアログには、
[Install Now]と[Customise installation]の2つが選べるようになっていますが、簡単にインストールするには、[Install Now]を選べばよいのですが、Windowsのユーザ領域にインストールされてしまうので、[Customise installation]を選んでProgram Filesの中に導入するようにします。但し、ファイル・コピーの権限などでうまく行かないこともあり得ます。
導入後、コマンドライン・プロンプトから起動しようとすると、PATHが通っていないので、導入したディレクトリをPATHに付加する必要があります。
2.Pythonの起動
(1) コマンドライン・プロンプトから起動する。
Windowsのコマンドライン・プロンプトを起動し、コマンドラインから、“py”と打ち込むと、Pythonランチャーが起動し、“>>>”というPythonのプロンプトが出てきます。ここから、Pythonのコマンドなどを入力することにより、Pythonを動かすことができます。この場合は、PATHを通しておかなくても起動できます。
例えば、
例えば、
C:\Program Files\Python312\
以下に、Pythonがインストールされているのであれば、コマンドライン・プロンプトから
set PATH=C:\Program Files\Python312;%PATH%
として、PATHが通してある場合には、コマンドライン・プロンプトから
py[ENTER]
として、Pythonランチャーを起動することができます。この際、複数のPythonがインストールされている場合、Pythonランチャーが自動的に最新のものを起動します。以前のバージョン、例えば、バージョン3.6を起動する場合には、
py -3.6[ENTER]
として起動します。“>>>”というプロンプトに対して、ファイルの終了を意味する文字ctrl-Z(Ctrlキーを押しながらZキーを押す)を入力し[ENTER]すれば、Pythonを終了し、コマンドライン・プロンプトに戻ります。
(2) スクリプトから起動する。
テキスト・エディタなどで、pythonのスクリプトを作成し、マウスでダブルクリックすると、このスクリプトを起動することができます。
テキスト・エディタ(Windowsのメモ帳でも良いそうです)を使って、
テキスト・エディタ(Windowsのメモ帳でも良いそうです)を使って、
print (“Hello, Python”)
と書かれたファイルhello.pyを作成(文字コードはUTF-8)し、C:\に格納します。コマンドラインプロンプトから、
py C:\hello.py
と入力するか、このファイルをマウスでダブルクリックすると、hello.pyが実行され、画面に
Hello, Python
と表示されます。
(3) IDLEを使用する。
Pythonをインストールすると、IDLEという開発環境が自動的にダウンロードされており、この画面から、Pythonのスクリプトを作成させたり、実行させたり、デバグすることができます。
Windowsの場合、スタートメニューの「P」の欄に、インストールされたPythonが表示されます。Python3.12をダウンロードしたのであれば、
Windowsの場合、スタートメニューの「P」の欄に、インストールされたPythonが表示されます。Python3.12をダウンロードしたのであれば、
Python3.12 ∨
という行が出て来るので、これの「∨」のところをクリックすると、
IDLE(Python3.12 64bit)
などと出てくるので、これをクリックすると、IDLE Shellが起動します。
この画面で、Pythonの文法に従ってスクリプトをコーディングし、動作させたり、デバグ作業を行います。
IDLEの使い方については、Pythonに挑戦(5)、あるいは、Pythonサイト内の、
この画面で、Pythonの文法に従ってスクリプトをコーディングし、動作させたり、デバグ作業を行います。
IDLEの使い方については、Pythonに挑戦(5)、あるいは、Pythonサイト内の、
を参照してください。
3.プログラム開発
(1) Pythonプログラム作成の流れ
どの言語でも、基本的なプログラム作成の流れは変わりませんが、Pythonは基本的にインタプリタとしてプログラム作成を行います。
・プログラムの目的
まず、何をするプログラムを作成するのかを明確にし、どんなデータを使って、どんな結果を得たいのかを仕様書にまとめます。
「住所録」のソフトであれば、住所録の住所・氏名・電話番号などの各データをどのようにPCに入力し、住所録データをPC内でどのように保持し、どのように画面あるいはプリンタに出力するのかフォーマットを決めます。
ここを最初からしっかり決めておくことがプログラム作成時の混乱を起こさないための秘訣です。プログラムを作りながら、プログラムの都合上で入力法や出力フォーマットを考えると、行き詰まりやすくなります。
「住所録」のソフトであれば、住所録の住所・氏名・電話番号などの各データをどのようにPCに入力し、住所録データをPC内でどのように保持し、どのように画面あるいはプリンタに出力するのかフォーマットを決めます。
ここを最初からしっかり決めておくことがプログラム作成時の混乱を起こさないための秘訣です。プログラムを作りながら、プログラムの都合上で入力法や出力フォーマットを考えると、行き詰まりやすくなります。
・フローチャートの作成
PCへの入力に対し、プログラムにどう応答させるのか、入力ミスなどにどう対応するか、入力されたデータをどのように保持するか、あるいは、そこに何らかの処理が必要か、
また、PC内に保持されているデータをどのようなフォーマットでファイルに書き出すか、また、ファイルに書き出されたデータをどのように読み込むか、
さらには、ソートしたり、不足情報を書き出したりするような処理を行うのであれば、その処理方法・流れを検討し、
画面やプリンタに住所録をどのような流れで表示させるか、
について、フローチャートにまとめます。
必要なら、全体を見やすいようにいくつかの部分に分け、それぞれをモジュールとして作成し、他のモジュールからimportして動作させるようにします。
モジュールによっては、1つのプログラムのために作成するのではなく、汎用化して、色々なプログラムから呼び出せるような形にすることも検討すると良いでしょう。
プロのシステム・エンジニアになると、一々フローチャートにしなくても、処理の流れを文章に整理しておく程度でコーディングに移ってしまうかも知れませんが、初学者のうちは、しっかりフローチャートを作成するように心がけることが、上達の早道です。
各処理を全体としてどのようにつなげて行くのかを、どのような工程でプログラムを作成していくかを検討します。未作成のモジュールは、関数名、クラス名だけを決めておいて、pass文だけにしておく、というようなことも考えます。
また、PC内に保持されているデータをどのようなフォーマットでファイルに書き出すか、また、ファイルに書き出されたデータをどのように読み込むか、
さらには、ソートしたり、不足情報を書き出したりするような処理を行うのであれば、その処理方法・流れを検討し、
画面やプリンタに住所録をどのような流れで表示させるか、
について、フローチャートにまとめます。
必要なら、全体を見やすいようにいくつかの部分に分け、それぞれをモジュールとして作成し、他のモジュールからimportして動作させるようにします。
モジュールによっては、1つのプログラムのために作成するのではなく、汎用化して、色々なプログラムから呼び出せるような形にすることも検討すると良いでしょう。
プロのシステム・エンジニアになると、一々フローチャートにしなくても、処理の流れを文章に整理しておく程度でコーディングに移ってしまうかも知れませんが、初学者のうちは、しっかりフローチャートを作成するように心がけることが、上達の早道です。
各処理を全体としてどのようにつなげて行くのかを、どのような工程でプログラムを作成していくかを検討します。未作成のモジュールは、関数名、クラス名だけを決めておいて、pass文だけにしておく、というようなことも考えます。
・コーディング
Pythonのプログラム開発は、通常のエディタ(Windowsのメモ帳でもOKです)で、プログラムを書いて、・・・.pyというファイルに保存し、このファイルをダブル・クリックしても実行できるし、IDLEを起動して、IDLE内でプログラムを書いて、Runメニューのサブメニュー[Run Module]をクリックしても実行させることができます。
使い慣れたエディタで編集する場合、インデントに[TAB]を使いたくなりますが、これをIDLEで編集してしまうと、インデントに空白と[TAB]が混じり見かけ上同じインデントに見えても、異なるインデントと判断されてエラーになることがあります。見た目で判断できないので非常に厄介です。IDLEで読み直して、Formatメニューのサブメニューの[Untabify Region]を使って[TAB]を空白に直してからIDLEの作業に入るとよいと思います。
逆に、IDLEで作成したPythonプログラムをエディタで編集する場合、空白4個が煩わしい人は、Formatメニューのサブメニュー[Tabify Region]で空白4個を一旦[TAB]に直してからエディタの編集に移るとよいと思います。
また、IDLEはデフォルトでUTF-8で動作することにも注意してください。文字フォントを自動判別するエディタなら問題はありませんが、シフトJISのエディタでそのまま編集しようとすると文字化けします。IDLEのデフォルトのフォントを変更することもできますが、可能ならエディタの文字コードをUTF-8にして統一するのがよいと思います。
使い慣れたエディタで編集する場合、インデントに[TAB]を使いたくなりますが、これをIDLEで編集してしまうと、インデントに空白と[TAB]が混じり見かけ上同じインデントに見えても、異なるインデントと判断されてエラーになることがあります。見た目で判断できないので非常に厄介です。IDLEで読み直して、Formatメニューのサブメニューの[Untabify Region]を使って[TAB]を空白に直してからIDLEの作業に入るとよいと思います。
逆に、IDLEで作成したPythonプログラムをエディタで編集する場合、空白4個が煩わしい人は、Formatメニューのサブメニュー[Tabify Region]で空白4個を一旦[TAB]に直してからエディタの編集に移るとよいと思います。
また、IDLEはデフォルトでUTF-8で動作することにも注意してください。文字フォントを自動判別するエディタなら問題はありませんが、シフトJISのエディタでそのまま編集しようとすると文字化けします。IDLEのデフォルトのフォントを変更することもできますが、可能ならエディタの文字コードをUTF-8にして統一するのがよいと思います。
・デバグ
デバグする際に、勿論、要所にprint関数を置いてデバグすることもできますが、Pythonには、色々とデバグ用のツールが標準で準備されています。
一つは、breakpoint()関数です。プログラム内の要所にbreakpoint()を仕込んでおくと、ここで、プログラムを一旦止めて、変数の内容などを確認することができます。事前に、import pdbとしておいて、pdb.set_trace()としても同様の動作をします。プログラムが一旦停止すると、Pythonは(Pdb)というプロンプトを表示して入力待ちになります。ここで、入力できるコマンドのうち代表的なものは、
一つは、breakpoint()関数です。プログラム内の要所にbreakpoint()を仕込んでおくと、ここで、プログラムを一旦止めて、変数の内容などを確認することができます。事前に、import pdbとしておいて、pdb.set_trace()としても同様の動作をします。プログラムが一旦停止すると、Pythonは(Pdb)というプロンプトを表示して入力待ちになります。ここで、入力できるコマンドのうち代表的なものは、
(a) p(print) # p abcとすると、変数abcの内容を出力します。
(b) s(step) # sとすると、次の1行を実行して停止します。次の1行が関数のとき、関数の中に入って停止します。
(c) n(next) # nとすると、次の1行を実行して停止します。次の1行が関数のとき、その関数を実行して停止します。
(d) c(continue) # cとすると、停止した位置からプログラムの実行を再開します。
(e) l(list) # l(Lの小文字)とすると、停止した位置の前後のプログラムを表示します。
(f) a(args) # aとすると、現在実行中の関数の引数を表示します。
(g) r(return) # rとすると、現在実行中の関数の最後のreturnまでを実行して停止します。
(h) run # runとすると、プログラムを最初からリスタートさせます。
(i) h(help) # h comとすると、コマンドcomのhelpを表示します。
(j) q(quit) # qとすると、デバグを終了します。
プログラムが期待通りの動作をすることが確認できるまで、デバグ作業を続けます。
(j) q(quit) # qとすると、デバグを終了します。
プログラムが期待通りの動作をすることが確認できるまで、デバグ作業を続けます。
・テスト
プログラムが最初に想定された動作をするか、ということをテストする必要があります。最初に作られた仕様書の通りに動作するか、というテストはデバグ時にも行われると思いますが、テストで最重要な点は、想定されていない動作に耐えられるか、ということです。人が、キー入力したり、マウス操作をしたりして動作確認するのでは、異常な使い方の可能性すべてをテストすることができません。
そこで、テストそのものが自動化されている必要があり、pythonの場合、input()関数を、キーから入力するのではなく疑似的なinput関数に入れ替えるか、file引数を用いてファイルから入力させるか、@デコレータを利用するような工夫が必要です。こうした書き換えも手入力では大変な作業になるので、pythonプログラムを文字列としてスキャンして、自動的に書き替えるようなツールが必要です。その上で、キー入力するはずの文字列を乱数などを用いて発生させて作成した疑似入力ファイルを作成して、あらゆる異常なキー入力をしたときに、プログラムが正常動作するかをテストします。
tkinterを使うプログラムの場合も、テキスト入力、ボタン動作を別に用意したファイルから行うようなインターフェース、ボタンに付属させる関数を、ボタンを押下するのではなく、ファイルに書かれたある文字列から起動させるような工夫を考える必要があります。実動作と食い違いますが、ファイルから起動させるときと、実動作とを比較するテスト(このテストは全機能について行う必要はありません)を行うようにします。
テストは、単体のモジュール、単体の関数、単体のクラス・メソッドについて行う単体テスト、全体を通してプログラムを動作させる結合テストに分かれます。単体テストは、要求されている仕様を満たすかどうか、そのモジュール・関数の開発者が担当します。結合テストは、開発の統括者が行います。
充実したテストを行っても、プログラムを実動作させると、想定外の状況に陥り、最悪、プログラムが停止してしまうことがあり得ます。例えば、銀行のオンライン・システムで起こる障害の中には、データの衝突によるものがあります。異なる複数の端末から同時に処理を要求された場合に、処理が追いつかなくなり、データ相互の整合性が崩れて、プログラムが動作不能な状況に陥る、というものです。テストの抜けを防ぐために、送られてくる要求を1列に並べて順次動作させるシステムと、データの整合性を監視するシステムを別動作させて、異常が発生してもシステムを止めないようにする工夫が必要になります。
そこで、テストそのものが自動化されている必要があり、pythonの場合、input()関数を、キーから入力するのではなく疑似的なinput関数に入れ替えるか、file引数を用いてファイルから入力させるか、@デコレータを利用するような工夫が必要です。こうした書き換えも手入力では大変な作業になるので、pythonプログラムを文字列としてスキャンして、自動的に書き替えるようなツールが必要です。その上で、キー入力するはずの文字列を乱数などを用いて発生させて作成した疑似入力ファイルを作成して、あらゆる異常なキー入力をしたときに、プログラムが正常動作するかをテストします。
tkinterを使うプログラムの場合も、テキスト入力、ボタン動作を別に用意したファイルから行うようなインターフェース、ボタンに付属させる関数を、ボタンを押下するのではなく、ファイルに書かれたある文字列から起動させるような工夫を考える必要があります。実動作と食い違いますが、ファイルから起動させるときと、実動作とを比較するテスト(このテストは全機能について行う必要はありません)を行うようにします。
テストは、単体のモジュール、単体の関数、単体のクラス・メソッドについて行う単体テスト、全体を通してプログラムを動作させる結合テストに分かれます。単体テストは、要求されている仕様を満たすかどうか、そのモジュール・関数の開発者が担当します。結合テストは、開発の統括者が行います。
充実したテストを行っても、プログラムを実動作させると、想定外の状況に陥り、最悪、プログラムが停止してしまうことがあり得ます。例えば、銀行のオンライン・システムで起こる障害の中には、データの衝突によるものがあります。異なる複数の端末から同時に処理を要求された場合に、処理が追いつかなくなり、データ相互の整合性が崩れて、プログラムが動作不能な状況に陥る、というものです。テストの抜けを防ぐために、送られてくる要求を1列に並べて順次動作させるシステムと、データの整合性を監視するシステムを別動作させて、異常が発生してもシステムを止めないようにする工夫が必要になります。
(2) Pythonの基本的データ構造・基本的予約語
Pythonのプログラム作成時の注意点について述べます。以下のリンク先では、すべての内容を網羅しているわけではないことに注意してください。詳細を知りたい場合は、ネット上で検索することをお勧めします。
(a) IDLEの使い方
Pythonのプログラミングを行う開発環境の一つであるIDLEについて説明します。
(b) pythonで使われる用語
pythonでよく出てくる基本用語を説明します。
(c) pythonのモジュールについて
Pythonではモジュールと呼ばれる強力なライブラリがあります。一部ですが、モジュールを説明します。
(d) pythonのデータ構造について
変数、配列、関数名などのpythonのデータ構造・演算子について、また、プログラムの構造について説明します。
(e) pythonの予約語について
pythonにはif文、while文、組み込み関数名、自分自身を示すselfなどの予約語があり、変数名などに使用することはできません。合わせて、その基本的な機能について説明します。
(f) pythonのメソッドについて
オブジェクト指向言語であるpythonには、メソッドと呼ばれる各クラスに付属した関数が存在します。基本的なメソッドについて説明します。
pythonにあらかじめ組み込まれている関数について説明します。他言語には存在しないような関数もあります。
(h) テスト・プログラム
上記に関して、その機能確認を行った簡単なテスト・プログラムを公開します。
(3) Pythonの基本
pythonのプログラムは、基本的に上から下に1行ずつ実行されていくので、基本的な規則に従って、実行する順に書き連ねていきます。
pythonでは左端から何カラム空けるか(インデントと言います)、ということが重要なのですが、同じインデントの部分(節とかブロックと呼ばれます)についても、上から下に実行されていきます。
時に、状況に応じて、実行の流れを変化させたいことがあります。
何らかの条件が満たされる場合にのみ実行させたいときには、if文を用いて条件分岐させます。
pythonでは左端から何カラム空けるか(インデントと言います)、ということが重要なのですが、同じインデントの部分(節とかブロックと呼ばれます)についても、上から下に実行されていきます。
時に、状況に応じて、実行の流れを変化させたいことがあります。
何らかの条件が満たされる場合にのみ実行させたいときには、if文を用いて条件分岐させます。
if 条件:
が基本パターンです。条件の部分が真(True)のときに、if文の次の行に進むのですが、このとき、if文以下の一連の部分(ifブロックなどと呼ばれます)にインデント(半角空白4個が原則)をつけて文を書く規則になっています。ifブロックが終了すれば、if文と同じインデントの次の行に制御が移ります。条件が偽(False)のときには、ifブロックを飛ばして、if文と同じインデントの次の行に制御が移ります。
また、反復処理を行うこともできます。2通りの方法があり、while文による方法とfor文による方法があります。while文では、
また、反復処理を行うこともできます。2通りの方法があり、while文による方法とfor文による方法があります。while文では、
while 条件:
が基本パターンです。条件の部分が真(True)のときに、while文の次の行に進むのですが、このとき、while文以下の一連の部分(whileブロックなどと呼ばれます)にインデントをつけて文を書く規則になっています。whileブロックが終了すると、ifブロックとは異なり、while文の位置に戻って、再び条件が真か偽か調べられ、真なら再度whileブロックが実行されます。条件が真の状態が続けば無限に繰り返されることになります。whileブロックのどこかで条件が偽の状態を作ると、その回で繰り返し動作を終了し、while文と同じインデントの次の行に制御が移ります。最初から条件が偽の場合も、while文と同じインデントの次の行に制御が移ります。
3回繰り返したい、というような場合、for文を用いて、
3回繰り返したい、というような場合、for文を用いて、
for j in range(3)
というようにします。変数j(jである必要はありません)の値が、反復動作を1回行うごとに、0,1,2と変化します。forの場合も、for以下に書かれるforブロックはインデントをつけて書きます。forの繰り返し動作が終了すると、for文と同じインデントの次の行に制御が移ります。
以下のプログラムでは、変数の内容を画面表示させるのに、
以下のプログラムでは、変数の内容を画面表示させるのに、
print(“c = a + b =”, a, “+”, b, “=”, c)
という文が何度も出てきます。文字列“c = a + b =”に続けて変数 aの内容を文字列化して続け、さらに、 “+”,変数bの内容を文字列化したもの、 “=”,そして変数 cの内容を文字列化したものを続けて、画面に表示します。何度も書くのは面倒なので、これをsubpという関数という形にまとめます。最初に出てくる、
def subp(a, b, c)
は、関数subpの定義です。(a, b, c)は引数と言いますが、関数の動作に対して、関数の呼び出し側から与えるデータを意味します。ここでは、3つのデータa, b, cが与えられてprint文で画面表示されます。
最初に出てくるsubp(a, b, c)では、aが関数subpのaに、bが関数subpのbに、cが関数subpのcに渡ります。
次のsubp(x, y, z)では、xが関数subpのaに、yが関数subpのbに、zが関数subpのcに渡ります。
また、以下のプログラムで、
最初に出てくるsubp(a, b, c)では、aが関数subpのaに、bが関数subpのbに、cが関数subpのcに渡ります。
次のsubp(x, y, z)では、xが関数subpのaに、yが関数subpのbに、zが関数subpのcに渡ります。
また、以下のプログラムで、
a = int(input(“整数値入力a:“))
x = float(input(“数値入力a:“))
x = float(input(“数値入力a:“))
としているのは、input()関数が文字列を返すからです。単に、
a = int(input(“整数値入力a:“))
b = int(input(“整数値入力b:“))
c = a + b
b = int(input(“整数値入力b:“))
c = a + b
としてしまうと、「整数値入力a:」に対して123,「整数値入力b:」に対して45678と入力すると、c = a + bは、整数値の和として動作するのではなく、文字列aと文字列bの連結操作となり、変数cの内容は、文字列“12345678”になってしまいます。a = int(input(“整数値入力a:“))で変数aに整数値123が入り、b = int(input(“整数値入力b:“))で半数bに整数値が45678入り、c = a + bは、整数値の和となり、変数cの内容は整数値45801になります。
こうして、以下のようなプログラム(各行で#から右側はコメントで実行には関係ありません)、
こうして、以下のようなプログラム(各行で#から右側はコメントで実行には関係ありません)、
# まず、関数を定義します。
def subp(a, b, c):
def subp(a, b, c):
print(“c = a + b =”, a, “+”, b, “=”, c)
a = 2 # 変数aに整数2を代入
b = 3 # 変数bに整数3を代入
c = a + b # 変数aの内容と変数bの内容を加えて変数cに代入
print(“c = a + b =”, a, “+”, b, “=”, c) # 結果を表示
a = 2.7
b = 3.91
c = a + b
print(“c = a + b =”, a, “+”, b, “=”, c)
cflag = True # 変数cflagに論理値Trueを代入
if cflag: # ifの右がTrueなら次の行を実行
b = 3 # 変数bに整数3を代入
c = a + b # 変数aの内容と変数bの内容を加えて変数cに代入
print(“c = a + b =”, a, “+”, b, “=”, c) # 結果を表示
a = 2.7
b = 3.91
c = a + b
print(“c = a + b =”, a, “+”, b, “=”, c)
cflag = True # 変数cflagに論理値Trueを代入
if cflag: # ifの右がTrueなら次の行を実行
print(“cflag:“, cflag, “なので、処理を行います“)
while cflag: # whileの右がTrueなら次の行を実行
while cflag: # whileの右がTrueなら次の行を実行
a = float(input(“数値入力(やめたいときは0):“))
if a == 0:
if a == 0:
break # a=0のときここにきてbreakすると、whileループを抜ける
else: # a=0でないときは次の行を実行
b = float(input(“数値入力(やめたいときは0):“))
if b != 0:
if b != 0:
c = a + b # bが0以外の時は、ここにくる
print(“c = a + b =”, a, “+”, b, “=”, c)
continue # whileループの先頭に戻りループの次の回に行く
print(“c = a + b =”, a, “+”, b, “=”, c)
continue # whileループの先頭に戻りループの次の回に行く
else
cflag = False # b=0のときcflagをFalseにする
print(“実行されるかな(1)?“)
print(“実行されるかな(2)?“)
print(“実行されるかな(3)?“)
k = 0 # whileとifを終了するとここに来て、kをあらかじめ0にする
for j in range(3): # rangeオブジェクトから0, 1, 2が取り出される
for j in range(3): # rangeオブジェクトから0, 1, 2が取り出される
k += j # kにjを加えてkに入れる。
print(“j:“, j, “, k:“, k) # jとkを表示
s1 = input(“何か入力“)
if s1 == ‘e’:
print(“j:“, j, “, k:“, k) # jとkを表示
s1 = input(“何か入力“)
if s1 == ‘e’:
break
a = int(input(“整数値入力a:“)) # int関数で文字列を整数値に変換
b = int(input(“整数値入力b:“))
c = a + b
subp(a, b, c) # 一々printを書くのが面倒なので関数を呼び出す
x = float(input(“数値入力a:“)) # float関数で文字列を実数値に変換
y = float(input(“数値入力b:“))
z = x + y
subp(x, y, z) # 引数x, y, zが関数subpのa, b, cに割り当てられる。
b = int(input(“整数値入力b:“))
c = a + b
subp(a, b, c) # 一々printを書くのが面倒なので関数を呼び出す
x = float(input(“数値入力a:“)) # float関数で文字列を実数値に変換
y = float(input(“数値入力b:“))
z = x + y
subp(x, y, z) # 引数x, y, zが関数subpのa, b, cに割り当てられる。
を動作させると、まず、
c = a + b = 2 + 3 = 5
c = a + b = 2.7 + 3.91 = 6.61
cflag: True なので、処理を行います
c = a + b = 2.7 + 3.91 = 6.61
cflag: True なので、処理を行います
と表示された後、
数値入力(やめたいときは0):
と表示して入力待ちになります。input文の中に書かれている“数値入力(やめたいときは0):“をプロンプトと言います。単に入力待ちになってしまうと、プログラム利用者は、どうしてよいかわからなくなるので、入力を促すような文字列を表示するのです。これに対して、1.2と入力したとします。次に、
数値入力(やめたいときは0):
と表示して入力待ちになります。これに対して、2.5と答えると
c = a + b = 1.2 + 2.5 = 3.7
数値入力(やめたいときは0):
数値入力(やめたいときは0):
と表示して入力待ちになります。これに対して、1.3と答え、次の、
数値入力(やめたいときは0):
に対して、0と答えると、
実行されるかな(1)?
実行されるかな(2)?
実行されるかな(3)?
j: 0 , k: 0
何か入力
実行されるかな(2)?
実行されるかな(3)?
j: 0 , k: 0
何か入力
と表示して入力待ちになります。ここでeと入れると、forループを抜けてしまいますが、単に[Enter]キーを押すと、
j: 1 , k: 1
何か入力
何か入力
と表示して入力待ちになります。単に[Enter]キーを押すと、
j: 2 , k: 3
何か入力
何か入力
と表示して入力待ちになります。単に[Enter]キーを押すと、
整数値入力a:
と表示して入力待ちになります。57と答えると、
整数値入力b:
と表示して入力待ちになります。189と答えると、
c = a + b = 57 + 189 = 246
数値入力a:
数値入力a:
と表示して入力待ちになります。5.7と答えると、
数値入力b:
と表示して入力待ちになります。19.225と答えると、
c = a + b = 5.7 + 19.225 = 24.925
と表示します。
4.プログラムの文書化
(1) 文書化の意義
Pythonに限りませんが、プログラムが所与の目的を達成して期待通りに動作したところで油断してしまうと、あとで痛い目に遭うことになります。
期待通りの動作をしている、と言っても、常識的なデータ・操作に対して動作している、というだけで、想定外のデータ・操作に対応できているかどうか、完璧に保証する方が無理なのです。
最悪、ウィルス感染などの想定外の事件で、プログラム自身、あるいは、データが壊れてしまう、という事態もあり得ます。
そのとき、プログラムやデータの再生を行う場合に、有力な助けとなるのが、文書です。
ファイルに保存されたデータの正しいフォーマットはどのようなものか、プラグラムの構成・流れについて、詳細に書かれた文書が残されていれば、その文書によって、破壊されたデータであっても何とか修復できるかも知れません。文書も残されていないというのであればお手上げで、最初からプログラム開発もデータ作成もやり直さなければいけない、という憂き目を見るかも知れません。
期待通りの動作をしている、と言っても、常識的なデータ・操作に対して動作している、というだけで、想定外のデータ・操作に対応できているかどうか、完璧に保証する方が無理なのです。
最悪、ウィルス感染などの想定外の事件で、プログラム自身、あるいは、データが壊れてしまう、という事態もあり得ます。
そのとき、プログラムやデータの再生を行う場合に、有力な助けとなるのが、文書です。
ファイルに保存されたデータの正しいフォーマットはどのようなものか、プラグラムの構成・流れについて、詳細に書かれた文書が残されていれば、その文書によって、破壊されたデータであっても何とか修復できるかも知れません。文書も残されていないというのであればお手上げで、最初からプログラム開発もデータ作成もやり直さなければいけない、という憂き目を見るかも知れません。
(2) 文書化の内容
a. 仕様書・使用説明書の作成
まず、プログラムを動作させたときに、画面を通して入出力する各状況において、キー入力、マウス操作によって、どういう変化が起きるのか、このプログラムでできることを網羅的に説明します。
グラフィック・インタフェースで動作させる場合には、各ウィンドウ・ダイアログの中に設けられたテキスト入力、ボタン類で、テキストボックスの文字列(ファイル名とか、ものの名前とか)、チェックボックスにチェックを入れるといかなる初期設定がなされて、今後のプログラムの動作にどういう影響を与えるのか、ということの説明をします。
コマンドライン・インタフェースで動作させる場合には、入力待ちになったときに、どういうコマンドが用意されていて、それぞれのコマンドで何ができるのかを説明します。
プログラムの扱う対象に制約があるのであれば、何ができて何ができないのかを説明する必要があります。
最後に、プログラムが、この説明の通りに動作するかどうかを詳細に(入力の間違い、異常なデータに対しても、エラー表示するなど、それなりの対応ができるか)テストしなければなりません。
プログラムのメンテナンス用に隠し機能を設ける場合も、文書化しておかないと、メンテナンスに利用できなくなります。
グラフィック・インタフェースで動作させる場合には、各ウィンドウ・ダイアログの中に設けられたテキスト入力、ボタン類で、テキストボックスの文字列(ファイル名とか、ものの名前とか)、チェックボックスにチェックを入れるといかなる初期設定がなされて、今後のプログラムの動作にどういう影響を与えるのか、ということの説明をします。
コマンドライン・インタフェースで動作させる場合には、入力待ちになったときに、どういうコマンドが用意されていて、それぞれのコマンドで何ができるのかを説明します。
プログラムの扱う対象に制約があるのであれば、何ができて何ができないのかを説明する必要があります。
最後に、プログラムが、この説明の通りに動作するかどうかを詳細に(入力の間違い、異常なデータに対しても、エラー表示するなど、それなりの対応ができるか)テストしなければなりません。
プログラムのメンテナンス用に隠し機能を設ける場合も、文書化しておかないと、メンテナンスに利用できなくなります。
b.動作概要説明書
プログラムの動作については、全体的な流れの説明(動作概要説明書)と、細部の説明を分けて用意するべきです。
動作概要説明書では、各ウィンドウ間の相互関連、相互移行の起動、結果的に起こる処理内容について書きます。どの起動ボタンを押すと、初期設定に基づいて、どのように処理が行われ、処理結果によって、どのウィンドウが表示され、そのウィンドウで使用者に何を要求するのか、という全体像を記述します。
複数の作業者でプログラム開発を行う場合、統括責任者が作成する動作概要説明書は、最初はラフなものであってもよいと思いますが、プログラム開発が進行する過程で精密にしておかないと、各モジュールがうまく連携できず、作業者間で混乱が起きます。プログラムを全体を通して走らせる局面においては、各作業者は、動作概要説明書を見て、担当している部分のモジュールの動作を考えることになります。
プログラムが完成し実用に供され、何らかの障害が起きた時、メンテナンス作業者は、まず、動作概要説明書を見て、プログラムのどの部分に問題があるかを調べることになります。
動作概要説明書では、各ウィンドウ間の相互関連、相互移行の起動、結果的に起こる処理内容について書きます。どの起動ボタンを押すと、初期設定に基づいて、どのように処理が行われ、処理結果によって、どのウィンドウが表示され、そのウィンドウで使用者に何を要求するのか、という全体像を記述します。
複数の作業者でプログラム開発を行う場合、統括責任者が作成する動作概要説明書は、最初はラフなものであってもよいと思いますが、プログラム開発が進行する過程で精密にしておかないと、各モジュールがうまく連携できず、作業者間で混乱が起きます。プログラムを全体を通して走らせる局面においては、各作業者は、動作概要説明書を見て、担当している部分のモジュールの動作を考えることになります。
プログラムが完成し実用に供され、何らかの障害が起きた時、メンテナンス作業者は、まず、動作概要説明書を見て、プログラムのどの部分に問題があるかを調べることになります。
c.詳細動作説明書
プログラムの各部分について、それが、全体を連携させている部分と、どのように情報をやり取りし、どのように内部処理をしているかを記述する説明書を準備します。
複数の作業者で開発を行う場合には、各作業者が自分の担当しているモジュールについて、内部処理の流れ、どうしてそうした処理を行っているのか(動作速度の向上のためか、ユーザー・インタフェースを改良するためか、内部処理を簡略にするためか、各種制約を考慮するためか)を記録に残します。メンテナンス作業者が読んだ時に、なぜ、その処理を行うかを理解するためです。
障害が起きるのは、内部処理のどこかに不充分な点が残っていることが理由になることが多いので、メンテナンス作業者は、想定されていないような異常なデータを用いて、プログラムの、微細なミス・抜けを探すことになります。こうしたことを踏まえて、詳細動作説明書が書かれている必要があります。
複数の作業者で開発を行う場合には、各作業者が自分の担当しているモジュールについて、内部処理の流れ、どうしてそうした処理を行っているのか(動作速度の向上のためか、ユーザー・インタフェースを改良するためか、内部処理を簡略にするためか、各種制約を考慮するためか)を記録に残します。メンテナンス作業者が読んだ時に、なぜ、その処理を行うかを理解するためです。
障害が起きるのは、内部処理のどこかに不充分な点が残っていることが理由になることが多いので、メンテナンス作業者は、想定されていないような異常なデータを用いて、プログラムの、微細なミス・抜けを探すことになります。こうしたことを踏まえて、詳細動作説明書が書かれている必要があります。