[English/日本語]

|次のページへ: 数値微分>

Lesson 0: Pythonの基礎

ここでは、Pythonを用いたプログラミングの基礎について学びます。具体的には、Pythonコードの実行方法を学び、ListやRange関数の使い方、for文やif文について学びます。また、有用な外部ライブラリーとしてnumpyやmatplotの使い方について説明します。

 最近では、プログラミングを効率的に学習するためにAIの支援を受けることも有用です。本サイトの解説記事「ChatGPTを活用したプログラミング学習効率化」も参考にしてください。



Lesson 0-1: 実行

まず初めに、Pythonプログラミングの基本的な手順を学びます。Pythonは次のような手順でコードを書き、実行することが出来ます。

  1. テキストエディタでコードを書き、拡張子.pyを持つファイルとして保存します。
  2. 準備した.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プログラミングの基本について学びます。


Lesson 0-2: 基本的な計算操作(四則演算とべき乗)

多くの数値計算・数値解析では、加算、減算、乗算、除算、べき乗などの基本的な数学的操作を組み合わせて計算が行われています。この節では、Pythonを使用して基本的な数学演算を行う方法を学びます。まず、次のサンプルプログラムを見てみましょう。

(lesson0_2.py)

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.02.0を変数abにそれぞれ代入しています。Pythonでは、等号(=)は左右の両辺が等しいことを示す記号ではなく、等号の右側を左側に代入する代入操作の命令を意味します。次に、4行目と5行目は、上記で代入された実数a,bに格納された変数をprint文で出力しています。

Pythonでは、加算(足し算)は記号+で、減算(引き算)は記号-で、乗算(掛け算)は記号*で、除算(割り算)は記号/で、べき乗は記号**で表されます。

上記のコードでは、最後の行(行13から17)は、上記の4つの算術操作とべき乗操作の結果をそれぞれprint文を使用して出力する指示を与えています。

上記のコードを.py拡張子を持つファイルに保存し、pythonコマンドを使用してターミナル上で実行しましょう。そうすると、上記のコードに書かれた指示が上から順に実行されます。得られた結果が期待される結果と一致しているか確認しましょう。


Lesson 0-3: リスト

上記のソースコードでは、各変数に1つの値が格納されていました。このように一つの値だけを保持する変数をスカラー変数と呼びます。スカラー変数はプログラミングを行う際に最も基本的な変数ですが、1つの変数に複数の値を保存することで、より複雑なプログラムを書くことができるようになります。ここでは、そのような目的のために用意されているPythonの関数、listについて学びます。まず、次のプログラムを見てみましょう。

(lesson0_3.py)

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プログラムを実行して、リストがどのように動作するかを確認しましょう。


Lesson 0-4: for文(反復)とリスト

これまで見てきたように、プログラムが実行されるとコンピュータはコードの先頭から順に命令を実行していきます。したがって、複雑な手順を必要とするプログラムを書くとき、コードが複雑で長くなってしまいます。Pythonにはシンプルで読みやすいコードを書くために、与えられた命令を繰り返し実行するための機能として、for文が提供されています。for文について学ぶために、まずは以下のソースコードを見てみましょう。

(lesson0_4.py)

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文を使用した繰り返し処理の動作を確認しましょう。


Lesson 0-5: Rangeと繰り返し

前節では、リスト(list)を使用した反復処理について学びました。そこでは、リスト内の各要素に対して繰り返し処理が行われました。リストの他に、等間隔の数列を生成するrange関数を用いて、繰り返し処理を実行することが出来ます。まずは、range関数がどのように動作するかを見るための以下のソースコードを見てみましょう。

(lesson0_5.py)

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が生成され、変数rrange型のオブジェクトとして保存されます。

ソースコードの4行目は、range型の変数であるrを、関数list()を使用してリスト型の変数に変換しています。また、5行目は変換されたリストの内容を出力することで、range関数によって生成された数列を確認します。

コードの7行目では、関数rangerange(n,m)の形式で使用されています。この場合、range関数は、開始点がnで、終了点がm-1であるような数列を生成します。このように生成された数列も、list関数(list())を使用してリスト型のオブジェクトに変換することができます。上記のコード例の場合、数列2,3,4range(2,5)によって生成されています。

最後に、コードの13行目ではrange関数をrange(n,m,l)の形式で使用しています。この場合、range関数は、nから始まり、mを超えない公差lの数列を生成します。上記のコードの場合、数列2,4,6,8,10range(2,11,2)によって生成されます。上記のプログラムを実行して、range関数がどのように動作するかを確認しましょう。

さらに、以下のソースコードの例で示すように、range関数によって生成された数列を要素としてforループを使用した反復処理を行うことができます。まず、以下のソースコードを見てみましょう。

(lesson0_5_for.py)

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文を使って出力されます。

上記のコードでどのような処理が行われているのか考えてみましょう。そして出力結果を予測してみましょう。また、実際にコードを実行して、期待された結果が得られるかどうかを確認しましょう。


Lesson 0-6:If文(条件分岐)

プログラムを書く際に、与えられた条件ごとに異なる処理が必要となる場合があります。そのような場合には、if文を利用して、異なる条件ごとに異なる処理を実行することが出来ます。Pythonにおけるif文を理解するために、次のコードを見てみましょう。

(lesson0_6.py)

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が記されており、もし変数abの値が等し得れば、インデントされた領域のprint("a==b")が実行され、a==bが出力されます。

与えられた条件式はいつも満たされる訳ではありません。もし、if 条件文 :の条件文の条件が満たされなかった場合、その下のインデントされた領域はスキップされ、次の条件判定に移ります。Pythonでは、二つ目以降の条件判定には次のような文を用いています。

elif 条件文2 :

この条件文2が満たされれば、その下のインデント(字下げ)された領域に記されている処理が実行されます。上のコードの場合は、abよりも大きい場合、print("a>b")が実行され、a>bが出力されます。

Pythonにおける条件分岐では、if文とelif文に記された条件のどれにも合致しなかった場合の処理を記述する機能として、else文が用意されています。if文やelif文の後にelse:を記すことで、そこまでに記した条件のどれにも当てはまらなかった場合の処理を指定することが出来ます。上のコードの場合、abが等しくなく、かつabよりも大きくない場合、print("a<b")によってa<bが出力されます。

Pythonプログラミングでは、インデント(字下げ)によってfor文による反復処理のブロックや、if文による条件分岐処理のブロックが定義されているため、end if節のような明示的にif文を終了させる処理を書く必要はなく、字下げを解消することでif文の終了を表すことが出来ます。


Lesson 0-7:関数の定義と呼び出し

プログラムを書いていると、同じような手続きを複数回実行したい場合があります。このような場合、必要となる手続きをを実行する関数を定義して、その関数を呼び出すことで、何度も同じ内容のコードを書く必要がなくなります。関数の定義と呼び出しについて学ぶために、次のソースコードを見てみましょう。

(lesson0_7.py)

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文によって出力しています。

実際に上記のプログラムを実行して、関数の定義と呼び出しについて確認してみましょう。


Lesson 0-8:NumpyとMatplotlib

この節では、Pythonを使って数値計算とその結果の可視化をnumpymatplotlibを使用して行う方法を学びます。Numpyは数値計算のためのライブラリであり、Matplotlibは可視化のためのライブラリです。両方のライブラリは非常に有用であり、将来のプロジェクトで頻繁に使用されるため、ここでその使い方に慣れておきましょう。まずは、次のコードを見てみましょう

(lesson0_8.py)

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配列のy1y2に格納しています。

10行目では、

plt.plot(x, y1, label='sin(x)')

によってpyplot(短縮名plt)のプロット関数plotによってnumpy配列xをx軸、y1をy軸の値として線の描画を行っています。また、label='sin(x)'によって、描画された線の凡例としてsin(x)を指定しています。11行目も10行目と同様に、xy2をそれぞれ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の例示コードによって作成されたグラフを示しています。

Figure: An example of matplotlib pyplot output.


|次のページへ: 数値微分>

[Pythonホームへ戻る]