ここでは、Pythonを用いたプログラミングの基礎について学びます。具体的には、Pythonコードの実行方法を学び、ListやRange関数の使い方、for文やif文について学びます。また、有用な外部ライブラリーとしてnumpyやmatplotの使い方について説明します。
最近では、プログラミングを効率的に学習するためにAIの支援を受けることも有用です。本サイトの解説記事「ChatGPTを活用したプログラミング学習効率化」も参考にしてください。
まず初めに、Pythonプログラミングの基本的な手順を学びます。Pythonは次のような手順でコードを書き、実行することが出来ます。
.py
を持つファイルとして保存します。.py
ファイルを、ターミナル上のpython
コマンドを使用して実行します。この手順を学ぶために、"Hello world (ハローワールド)"と呼ばれる簡単なプログラムを書いて実行してみましょう。まず、以下の1行だけのPythonコードを書き、lesson0_1.py
という名前のファイルとして保存します。
print('Hello world!!')
上記のコードが準備できたら、Pythonプログラムを実行するために、ターミナルで次のコマンドを入力して実行します。
python hello.py
結果として、以下のメッセージが表示に出力されます:
Hello world!!
上記のコードで使用したprint
文は、変数を出力するための関数です。上のコードの場合、print関数は文字列Hello world!!
を出力するために使用されています。Pythonでは、文字列を引用符(''
)で囲むことで、その間の文字列を文字変数として扱うことができます。
ここで、Pythonのコードを書き、実行する方法を学びました。次の節では、Pythonプログラミングの基本について学びます。
多くの数値計算・数値解析では、加算、減算、乗算、除算、べき乗などの基本的な数学的操作を組み合わせて計算が行われています。この節では、Pythonを使用して基本的な数学演算を行う方法を学びます。まず、次のサンプルプログラムを見てみましょう。
a = 3.0
b = 2.0
print('a=',a)
print('b=',b)
c = a + b
d = a - b
e = a * b
f = a / b
g = a ** b
print('a+b=',c)
print('a-b=',d)
print('a*b=',e)
print('a/b=',f)
print('a**b=',g)
上記のプログラムでは、1行目と2行目で実数3.0
と2.0
を変数a
とb
にそれぞれ代入しています。Pythonでは、等号(=
)は左右の両辺が等しいことを示す記号ではなく、等号の右側を左側に代入する代入操作の命令を意味します。次に、4行目と5行目は、上記で代入された実数a,b
に格納された変数をprint
文で出力しています。
Pythonでは、加算(足し算)は記号+
で、減算(引き算)は記号-
で、乗算(掛け算)は記号*
で、除算(割り算)は記号/
で、べき乗は記号**
で表されます。
上記のコードでは、最後の行(行13から17)は、上記の4つの算術操作とべき乗操作の結果をそれぞれprint
文を使用して出力する指示を与えています。
上記のコードを.py
拡張子を持つファイルに保存し、python
コマンドを使用してターミナル上で実行しましょう。そうすると、上記のコードに書かれた指示が上から順に実行されます。得られた結果が期待される結果と一致しているか確認しましょう。
上記のソースコードでは、各変数に1つの値が格納されていました。このように一つの値だけを保持する変数をスカラー変数と呼びます。スカラー変数はプログラミングを行う際に最も基本的な変数ですが、1つの変数に複数の値を保存することで、より複雑なプログラムを書くことができるようになります。ここでは、そのような目的のために用意されているPythonの関数、list
について学びます。まず、次のプログラムを見てみましょう。
la = ['April', 'May', 'June']
print('la=',la)
print('la[0]=',la[0])
print('la[1]=',la[1])
print('la[2]=',la[2])
lb = [1.2, 2.4, 3,6]
print('lb=',lb)
print('lb[0]=',lb[0])
print('lb[1]=',lb[1])
print('lb[2]=',lb[2])
上記のソースコードの1行目では、'April', 'May', 'June'
という3つの文字変列を要素とするリストが[]
によって作成され、変数la
に代入されます。Pythonでは、要素を[]
で囲むことによってリストの作成が行われます。
ソースコードの3行目では、print
関数を使用してリストの全体が出力されます。これとは対照的に、5-7行目ではリストの要素を1つずつ出力しています。このように、リストの要素の一部だけを読み出すことも可能です。例えば、la[2]
はリストの2番目の要素を表す変数です。ただし、Pythonのリストの要素番号は、0番目の要素から数え始めることに注意してください。
上記の説明は、要素が文字列'April', 'May', 'June'
のリストを参照していますが、他の種類(型)の変数もリストの要素にすることができます。例えば、上記のソースコードの10-16行目では、リストlb
に3つの実数を保存し、各要素を出力する指示が示されています。上記のPythonプログラムを実行して、リストがどのように動作するかを確認しましょう。
これまで見てきたように、プログラムが実行されるとコンピュータはコードの先頭から順に命令を実行していきます。したがって、複雑な手順を必要とするプログラムを書くとき、コードが複雑で長くなってしまいます。Pythonにはシンプルで読みやすいコードを書くために、与えられた命令を繰り返し実行するための機能として、for
文が提供されています。for文について学ぶために、まずは以下のソースコードを見てみましょう。
lc = ['April', 'May', 'June']
for l in lc:
print(l)
print('End')
上記のソースコードの最初の行では、'April', 'May', 'June'
という3つの文字列を要素として持つリストを作成し、変数lc
に代入しています。
コードの3行目はfor l in lc:
文によって反復を行う領域の定義を開始しています。ここで変数l
は、反復ごとに値が変わる変数であり、イテレータと呼ばれます。ここでは、イタレータl
は、反復ごとにリスト変数lc
の各要素を値として持っています。上記のコードの場合、変数l
には順に'April', 'May', 'June'
の三つの文字列が代入され、各繰り返しで繰り返し領域の処理が実行されます。
Pythonでは、for
文の反復領域はインデント(字下げ)を使用して定義されます。したがって、上記のソースコードの場合、4行目のprint(l)
の部分のみが繰り返されます。
繰り返し処理領域の記述が終わったら、インデント(字下げ)を解消して、次の処理内容を記述します。上記のソースコードの例では、for
ループの繰り返し処理の後、インデントが解消され、print('End')
によって終了ログEnd
が出力され、プログラムが終了します。
上記のコードの動作を要約すると、上記のプログラムは最初の行で3つの要素を持つリスト変数lc
を作成し、for
ループを使用してprint(l)
でリストの各要素を出力し、最後に終了ログ('End')を出力してプログラムを終了します。
上記のプログラムを実行して、リストとfor
文を使用した繰り返し処理の動作を確認しましょう。
前節では、リスト(list
)を使用した反復処理について学びました。そこでは、リスト内の各要素に対して繰り返し処理が行われました。リストの他に、等間隔の数列を生成するrange
関数を用いて、繰り返し処理を実行することが出来ます。まずは、range関数がどのように動作するかを見るための以下のソースコードを見てみましょう。
r = range(5)
print(r)
l = list(r)
print(l)
r2 = range(2,5)
print(r2)
l2 = list(r2)
print(l2)
r3 = range(2,11,2)
print(r3)
l3 = list(r3)
print(l3)
上記のソースコードの最初の行は、range
関数の最もシンプルな使用方法を示しています。このようにrange(n)
の形でrange
関数を呼び出すと、整数0
からn-1
までの数列が生成されます。上記のソースコードの場合、range(5)
によって数列0,1,2,3,4
が生成され、変数r
にrange
型のオブジェクトとして保存されます。
ソースコードの4行目は、range
型の変数であるr
を、関数list()
を使用してリスト型の変数に変換しています。また、5行目は変換されたリストの内容を出力することで、range
関数によって生成された数列を確認します。
コードの7行目では、関数range
がrange(n,m)
の形式で使用されています。この場合、range
関数は、開始点がn
で、終了点がm-1
であるような数列を生成します。このように生成された数列も、list関数(list()
)を使用してリスト型のオブジェクトに変換することができます。上記のコード例の場合、数列2,3,4
がrange(2,5)
によって生成されています。
最後に、コードの13行目ではrange
関数をrange(n,m,l)
の形式で使用しています。この場合、range
関数は、n
から始まり、m
を超えない公差l
の数列を生成します。上記のコードの場合、数列2,4,6,8,10
がrange(2,11,2)
によって生成されます。上記のプログラムを実行して、range
関数がどのように動作するかを確認しましょう。
さらに、以下のソースコードの例で示すように、range
関数によって生成された数列を要素としてfor
ループを使用した反復処理を行うことができます。まず、以下のソースコードを見てみましょう。
s = 0
for i in range(1,11):
s = s + i
print('s=',s)
上記のコードでは、最初の行で変数s
に値0を代入して、変数s
を初期化します。2行目では、変数i
をイテレータとしてfor
文を使用して繰り返し処理領域の定義を開始します。ここで、range
関数は1
から10
までの数列を生成するために使用され、数列の各整数値は、後続の繰り返し処理領域の中でイテレータi
に代入されます。
コードの3行目はインデント(字下げ)されており、for
文によって定義された反復処理エリアであることを示しています。この行では、イテレーターi
の値が変数s
に加えられ、その結果が変数s
に代入されます。最終的に、5行目で、上記のfor
ループの反復処理によって計算された変数s
の値がprint
文を使って出力されます。
上記のコードでどのような処理が行われているのか考えてみましょう。そして出力結果を予測してみましょう。また、実際にコードを実行して、期待された結果が得られるかどうかを確認しましょう。
プログラムを書く際に、与えられた条件ごとに異なる処理が必要となる場合があります。そのような場合には、if
文を利用して、異なる条件ごとに異なる処理を実行することが出来ます。Pythonにおけるif
文を理解するために、次のコードを見てみましょう。
a = 2.0
b = 3.0
print("a=", a)
print("b=", b)
if a == b:
print("a==b")
elif a > b:
print("a>b")
else:
print("a<b")
上記のコードでは、まず1,2行目で変数a,b
に実数2.0, 3.0
を代入し、4,5行目でそれらの値をprint
文を用いて出力しています。
コードの7行目からif
文により条件分岐が行われています。Pythonにおけるif文は
if 条件文 :
の形で書き始め、条件文
には判定に用いる条件文が記されます。もしこの条件が満たされていればif 条件文:
の下に記されたインデント(字下げ)された領域(ブロック)に書かれている命令が実行されます。上記のコードの場合は、条件文としてa==b
が記されており、もし変数a
とb
の値が等し得れば、インデントされた領域のprint("a==b")
が実行され、a==b
が出力されます。
与えられた条件式はいつも満たされる訳ではありません。もし、if 条件文 :
の条件文の条件が満たされなかった場合、その下のインデントされた領域はスキップされ、次の条件判定に移ります。Pythonでは、二つ目以降の条件判定には次のような文を用いています。
elif 条件文2 :
この条件文2
が満たされれば、その下のインデント(字下げ)された領域に記されている処理が実行されます。上のコードの場合は、a
がb
よりも大きい場合、print("a>b")
が実行され、a>b
が出力されます。
Pythonにおける条件分岐では、if
文とelif
文に記された条件のどれにも合致しなかった場合の処理を記述する機能として、else
文が用意されています。if文やelif文の後にelse:
を記すことで、そこまでに記した条件のどれにも当てはまらなかった場合の処理を指定することが出来ます。上のコードの場合、a
とb
が等しくなく、かつa
がb
よりも大きくない場合、print("a<b")
によってa<b
が出力されます。
Pythonプログラミングでは、インデント(字下げ)によってfor
文による反復処理のブロックや、if
文による条件分岐処理のブロックが定義されているため、end if
節のような明示的にif文を終了させる処理を書く必要はなく、字下げを解消することでif
文の終了を表すことが出来ます。
プログラムを書いていると、同じような手続きを複数回実行したい場合があります。このような場合、必要となる手続きをを実行する関数を定義して、その関数を呼び出すことで、何度も同じ内容のコードを書く必要がなくなります。関数の定義と呼び出しについて学ぶために、次のソースコードを見てみましょう。
def my_func(x):
y = x*x
return y
for x in range(11):
y = my_func(x)
print(x,y)
上記のコードでは、1行目で新しい関数としてmy_func
を定義しています。このように、Pythonでは
def 関数名(引数1, 引数2, …):
のような形で関数を定義することが出来ます。ここで、引数1や 引数2などは、関数の内部で処理を行うために外部から与えられる変数です。def
文の最後はコロン(:)で終わり、次の行からはインデント(字下げ)した領域に関数内部で行われる処理が記されます。
上記のコードの例では、引数としてx
を外部から読み込み、コードの2行目では関数の内部処理として、x
を二乗した値を変数y
に格納しています。
関数の定義の最後の行(3行目)では、return
文によって、関数の処理が終了して呼び出し元に処理が戻ることを示しています。この際、return
分の後に、
return 返り値1, 返り値2, …
のような形で返り値を指定することで、関数の呼び出しもとに関数内で行われた処理の結果を返すことが出来ます。上のコードの例では、3行目でreturn y
として、関数内部で計算されたy
の値が、関数の呼び出しもとに返されます。
上記のように定義された関数は、プログラム内部から呼び出すことが可能です。上のコードの例では、6行目からfor
文により変数x
の値を0から10まで変化させながら、上記手で意義された関数my_func
を呼び出しています。関数my_func
から帰ってきた値を変数y
に格納し、その後print
文によって出力しています。
実際に上記のプログラムを実行して、関数の定義と呼び出しについて確認してみましょう。
この節では、Pythonを使って数値計算とその結果の可視化をnumpy
とmatplotlib
を使用して行う方法を学びます。Numpyは数値計算のためのライブラリであり、Matplotlibは可視化のためのライブラリです。両方のライブラリは非常に有用であり、将来のプロジェクトで頻繁に使用されるため、ここでその使い方に慣れておきましょう。まずは、次のコードを見てみましょう
import numpy as np
import matplotlib.pyplot as plt
# Generate data
x = np.linspace(0.0, 10.0, 64)
y1 = np.sin(x)
y2 = np.cos(x)
# Create a plot
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# Add labels and title
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.title("How to use numpy and matplotlib")
# Add a legend
plt.legend()
# Save the plot to a file with a more descriptive filename
plt.savefig("plot.png")
# Display the plot
plt.show()
上記のソースコードの最初の行では、
import numpy as np
によって、numpyが読み込まれ、numpyのライブラリーを使用する準備を行っています。ここではas np
によって、numpyの短縮名としてnp
を定義しており、numpyをnpとして呼び出すことが出来ます。
2行目では、
import matplotlib.pyplot as plt
をによってmatplotlibのライブラリであるpyplotを使用する準備を行っています。ここでは、pyplotの短縮名をplt
として定義しており、pyplotをpltとして呼び出すことが出来ます。
コードの4行目の# Generate data
はコメント行で、シャープ(#
)から始まる行は、プログラム実行時には無視されます。このようなコメント行は、プログラムを書く人や見る人の理解の助けになるように書き加えられるものです。
5行目では、0.0から10.0までの数値を等間隔に64分割した点の値を持つのnumpy
の配列x
を生成しています。
6,7行目では、生成されたnumpyの配列x
の各要素に対して、三角関数(\(\sin(x), \cos(x) \))の値をnumpyの関数np.sin(x)
とnp.cos(x)
を用いて計算し、結果をnumpy配列のy1
とy2
に格納しています。
10行目では、
plt.plot(x, y1, label='sin(x)')
によってpyplot(短縮名plt)のプロット関数plot
によってnumpy配列x
をx軸、y1
をy軸の値として線の描画を行っています。また、label='sin(x)'
によって、描画された線の凡例としてsin(x)
を指定しています。11行目も10行目と同様に、x
とy2
をそれぞれx軸とy軸として、線の描画を行っています。
コードの14-16行目では、それぞれx軸のラベル、y軸のラベル、図のタイトルの指定を行っています。また、19行目のplt.legend()
は、凡例(sin(x)
, cos(x)
)の描画を行っています。
22行目のplt.savefig("plot.png")
では、ここまでに描画してきた図をファイル名"plot.png"というpngファイルに保存しています。また、25行目のplt.show()
によって画面上に同様の図を出力してプログラムが終了します。
下の図は、matplotlibを使用した上記のPythonの例示コードによって作成されたグラフを示しています。