Pythonプログラム入門
Sample:MonteCarlo Method
プログラミング初心者にとって、一般的な文法解説はハードルが高いものです。ここでは、簡単なサンプルプログラムを通して、Pythonプログラムの書き方を体験してみましょう。
CONTENTS
サンプルプログラム1
ファイルの新規作成
- Python IDLE を使っている場合
- PC上の任意の場所で新規フォルダを作成 > PythonSample
- IDLE のメニュー File > New File
- IDLE のメニュー File > Sava(または Save As)
> 作成済みのフォルダに main.py 等の名称で空のファイルを保存
- Google Colaboratory を使っている場合
- Google Colaboratory で ファイル> ノートブックを新規作成
- Untitled0.ipynb というファイル名を変更 > PythonSample.ipynb
サンプルコード
2つの数値を順に入力すると、その積(掛け算した値)が出力される・・というシンプルなプログラムです。以下のコードをコピー&ペーストして下さい。
- Python IDLE の場合は、上記で作成したファイル(main.py) にペースト
- Google Colaboratory の場合は、コードセルにペースト
a = input( "a = " ) b = input( "b = " ) a = int( a ) b = int( b ) c= a*b print( "a x b = ", c )
実行
- Python IDLE を使っている場合
- メニューの RUN > RUN Module とすると IDLE Shell 上で実行されます。
- Google Colaboratory を使っている場合
- コードセルで実行ボタン「▶︎」をクリックすると、セル直下の Out の部分で実行されます。
- 実行の流れ
- "a =" と入力が促されるので、数値を入力して下さい。
- "B =" と入力が促されるので、数値を入力して下さい。
- "axb = XXX" と、計算結果が出力されます。
サンプルプログラム2
モンテカルロ法を使って π の近似値を求めるプログラム
モンテカルロ法とは
計算機を使った数値計算手法の一つで、乱数を用いた試行を繰り返すことによって確率論的に近似的に求める解を得る手法です。名称の由来はカジノで有名なモナコ公国のモンテカルロ地区・・と言われています。
πの値を求める手法の解説
Wikimediacommons File:Montecarlo pi2.PNG
- 一辺の長さを r とする正方形の面積を S とし、その正方形の左下頂点を中心とする 半径rの4分円の面積を Q とすると
Q = π*r*r / 4 S = r*r よって、Q / S = ( π*r*r / 4 ) / ( r*r ) = π/4
- すなわち、以下の関係式が得られます。
π = Q / S * 4
- 正方形の「枠内」に一様な乱数を使って「雨を降らせる」と
正方形全体に降る雨粒の数:4分円の中に降る雨粒の数 ≒ S:Q
となり、雨粒の数が多くなれば、S:Q の比率に一致します。
- これを利用することで
π = 4分円の中に降る雨粒の数 / 正方形全体に降る雨粒の数 * 4
というかたちで、π の近似値を求めることができます。
ファイルの新規作成
- Python IDLE を使っている場合
- PC上の任意の場所で新規フォルダを作成 > MonteCarloMethod
- IDLE のメニュー File > New File
- IDLE のメニュー File > Sava(または Save As)
> 作成済みのフォルダに main.py 等の名称で空のファイルを保存
- Google Colaboratory を使っている場合
- Google Colaboratory で ファイル> ノートブックを新規作成
- Untitled0.ipynb というファイル名を変更 > MonteCarloMethod.ipynb
- テキストセルを追加して、ノートの冒頭にタイトルをつけましょう。
# モンテカルロ法による円周率の導出
サンプルコード
以下のコードをまるごとコピー&ペーストして下さい。
- Python IDLE の場合は、上記で作成したファイル(main.py) にペースト
- Google Colaboratory の場合は、コードセルにペースト
# ライブラリの読み込み import math import random # 初期化 n = 1000 cnt_in = 0 cnt_out = 0 # シミュレーション for i in range(n): # 0.0 - 1.0 のランダムな「雨粒」 x = random.random() y = random.random() # 4分円の中に落ちた数をカウント r = math.sqrt(x**2 + y**2) if r <= 1.0: cnt_in += 1 else: cnt_out += 1 # 円周率の近似値 Pi = cnt_in / n * 4 # 結果の表示 print("Num:", n) print("IN:", cnt_in) print("OUT:", cnt_out) print("Pi:", Pi)
- n の初期値を大きくしていくと、結果が 3.14 に近づくことを確認しましょう。計算資源に負担をかけることがないよう、n の値はほどほどに・・
実行
- Python IDLE を使っている場合
- メニューの RUN > RUN Module で実行されます。
- 結果は、IDLE Shell に表示されます。
- 実行の都度、IDLE Shell に結果が追加表示されます。
- Google Colaboratory を使っている場合
- コードセルで実行ボタン「▶︎」をクリックすると実行されます。
- 結果は、コードセルの直下に表示されます。
- このプログラムは乱数を使っていて、結果はその都度変わります。
サンプルプログラム2の解説
import <モジュール名>
既存のライブラリプログラムを利用するための下準備です。Python には、様々な既存の機能が「ライブラリ」というかたちで用意されています。例えば、乱数を発生する機能もその一つで、みなさんがその機能を実現させるためのコードを一から書く必要はありません。
import math # 数学関数を利用する場合に読み込みます。 import random # 乱数を利用する場合に読み込みます。
変数と代入
変数の活用と、代入処理はプログラミングの基本です。
n = 1000
- この例で n はデータ(数値や文字)を入れるための「器」として機能するもので、プログラミングの世界では一般に「変数」といいます。
- =記号は「等しい」という意味ではなく、右辺の内容を左辺の変数に代入することを意味します。
- ちなみに以下の記述は同意で、現在の x に 1 を加えて x を更新します。
x = x +1 x += 1
プログラム中にある cnt_in += 1 というのは、cnt_in という変数の値を1増やすことを意味するもので、このような処理を「カウント処理」と言います。
制御文
上記のプログラムでは if 文と for 文を利用していますが、プログラムの流れを制御するには、これに while 文 を加えた3つの文の書き方がわかっていれば、大半のことは可能になります。
if 文
判断結果(true / false)によって処理を分岐します。
if r <= 1.0: cnt_in += 1 else: cnt_out += 1
この例では、r が 1.0以下の場合は、cnt_in が1つ増え、そうでない場合は、cnt_out が一つ増えます。
for 文
一定回数処理を繰り返す場合に利用するものです。
for i in range(1000): # ここに処理内容を記述
この例では i の値が 0 から 999 まで「処理」が1000回繰り返されます。
while 文
while 文は条件が真の間処理を繰り返します。
while n < 100: # ここに処理内容を記述
この例では n の値が 100未満の場合に「処理」が繰り返されます。
range関数 について
range 関数は開始値から終了値(未満)までの数値を要素として持つオブジェクトで、繰り返し処理では頻繁に利用されます。
range(start, stop[, step])
- range(5) > 0 1 2 3 4
- range(0, 5) > 0 1 2 3 4
- range(1,10) > 1 2 3 4 5 6 7 8 9
- range(0, 10, 2) > 0 2 4 6 8
インデントについて
Python ではインデント(字下げ)によってブロックを表現します。
- if 文や for 文など、同一レベルのインデントを持つ複合文(複数の文)を処理対象のブロックとして扱います。
- インデントがきちんととられていないと文法エラーになる・・という仕様によって、プログラムは必然的に視覚的に見やすいものになります。
- 他の言語では、制御ブロックの終端の明記(「 } 」 など)が必要ですが、Pythonの場合これが不要なので、コードはシンプルになります。
コメントについて
Python では # 記号以降はコメントとして扱われます。プログラム上で文の機能を一時的に無効にする(コメントアウト)場合にも利用可能です。
- インラインコメント
#から行末までは実行時に無視されます。#より前のコードは有効です。a = 1 # comment
- ブロックコメント(行全体)
行頭に#を書くと、行全体コメントとなり、実行時には無視されます。a = 1 # b = 2 # c = 3 d = 4
サンプルプログラム3
GitHub上にある、spaceinvaders をダウンロードして、ローカルPC上で動かしてみましょう。
このプログラムは GUIベースのプログラムとして動くので、Colaboratory(jupyter notebook)で試すことはできません。自身のPCにPythonの環境(IDLE含む)がインストールされていることが前提となります。以下、標準でインストールされる Python IDLE を使って試す方法です。
準備
- GitHubから space-invaders をダウンロードします。
- https://github.com/leerob/space-invaders
- 緑のボタン "code" から Download Zip をクリック
- 任意の場所(デスクトップ等)に置いて解凍します。
space-invaders-master という名称のフォルダができます。 - Python IDLE のメニュー、File > Open で、spaceinvaders.py を開きます。
とりあえず、実行
- まずは、Python IDLE のメニュー、Run > Run Module してください。
- IDLE Shell にエラーメッセージが出ると思います。
ModuleNotFoundError: No module named 'pygame'
理由は、プログラムの5行目に記載のある from pygame import * に対して、pygame というパッケージが存在しないためです。 - このパッケージは、Pythonのインストール時には入らないので、追加でインストールする必要があります。
パッケージのインストール
この作業は、Terminal(Windowsではコンソール)で行う必要があります。以下の操作は、意味を理解せずに行うと、お使いのパソコンのの Python環境に影響を与える可能性があるので、注意してください。
- MacOSのメニュー、移動>ユーティリティ から ターミナルを起動
- 以下のようにタイプします。
pip3 install pygame
- ターミナルにメッセージが出力されますが、その中に Successfully installed という表現がみられればインストール成功です。
- この操作によって、実際には以下の場所にパッケージが置かれて、以降、プログラムで利用できるようになります(XX はバージョン名)
/Library/Frameworks/Python.framework/Versions/3.XX/lib/python3.XX/site-packages
再度実行
- spaceinvaders.py のウインドウをアクティブにした状態で、Python IDLE のメニュー、Run > Run Module してください。
- インベーダーゲームが動くはずです。
- Window を閉じると、IDLE Shell の画面のプロンプトに戻ります。
閉じない場合は、IDLE Shell のプロンプトで以下のようにタイプして下さい。quit()
- このように、Web上に公開されている様々な Pythonプログラムを体験することができます。
APPENDIX
- Python 文法の詳細については、以下のページをご覧下さい。
Python/Syntax