Python(パイソン,と読む.ギリシア神話に登場するへび.)は,近年広く使われているインタプリタ言語で,特に機械学習・人工知能の分野でのプログラミングには欠かせない言語となっている.
C言語がコンパイル言語であるのに対して,Pythonはインタプリタ言語であり,プログラムを1行ごとに入力・実行することができる. また,C言語と同様にソースファイル(拡張子は .py )にプログラムをまとめて記述し,実行することも可能である.
このページでは,C言語をひと通り学習した人向けに,ざっと Python3 の文法の基礎を説明します.
Python言語はインタプリタ言語であるため,ソーティングや数値計算などの基本的な処理アルゴリズムを記述・実行すると,同じ内容をC言語で記述した方が圧倒的に高速である.
したがって,Pythonではすでに用意されている様々なパッケージ・ライブラリを順次組み合わせて,それをスクリプト的に実行するような書き方が一般的である.
機械学習のための様々なフレームワークが提案されている.現状,PyTorch と Tensorflow が2大勢力である.
情報処理教室のPCでは以下のインストール作業は不要です.
Windowsのコマンドプロンプト,または Visual Studio Code のターミナルを起動して,以下のように打ち込んでみよう.
Version表示は異なる可能性がある.
Windowsの場合 Z:\> cd .windows2000 Z:\.windows2000> python Python 3.11.4 ... (省略) Type "help", "copyright", "credits" or "license" for more information. >>> <- このような入力プロンプトが出ればOK
ここにPythonのソースコードを逐次入力していくことによって,プログラムがその都度翻訳され実行される.
プログラムの入力が終了したら,exit()
で,Pythonの入力プロンプトを終了できる.
やや古めの Mac OSの場合,旧バージョンである Python2 が起動する場合がある.
Python3を使うようにしよう.
Mac OS % python3 Python 3.10.6 (v3.10.6:9c7b4bd164, Aug 1 2022, 17:13:48) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> <-これが入力プロンプト (Python2 が起動!) % python Python 2.7.10 (default, Feb 22 2019, 21:55:15) [GCC 4.2.1 Compatible Apple LLVM 10.0.1 (clang-1001.0.37.14)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
コマンドプロンプト(またはVSCodeのターミナル)からPythonインタプリタを起動, プロンプト(>>>)が表示されたら,以下の赤字の部分をキーボードから1行ずつ順次入力しよう.
>>> print('Hello world!') Hello world! >>> i=5+3 >>> print('i=', i) i= 8 >>> exit()
このように,インタプリタ言語では,簡単に計算プログラムを実行できる.
動画による説明.コマンドプロンプトの起動からプログラム実行まで.
処理手順が長くなると1行ごとに入力するのは面倒で間違いも多くなる.
そこで,C言語のようにあらかじめPythonのソースファイルを書いておいて,一度に実行することもできる.
(この場合でも,機械語への翻訳は1行ごとに行われる.)
以下を test.py としてマイドキュメント内(z:\.windows2000),またはUSBのMyProgフォルダなどに保存する.
print('--- Calc. prog. ---')
i = 3 + 5
j = 4 * 5
print('ans = ', i * j)
(コマンドプロンプトでの実行方法)
Z:¥> cd /d z:¥.windows2000 <-作業フォルダをマイドキュメントに移動 Z:¥.windows2000\> python test.py (コンパイルすることなく,すぐに実行が始まる.) --- Calc. prog. --- ans = 160
C++の開発の場合と同様,VSCodeのターミナルからも実行可能である.
設定によっては,VSCodeのメニューの「実行」「デバッグなしで実行」でも実行できる場合がある.
以下は情報処理教室の VSCode での実行を例に説明する.
作業フォルダを開き,拡張子を.pyとしたソースファイルを作成し,ターミナルから実行する.
# This is comment
print('Hello World!')
print('This is a "pen".')
実行結果
> python test.py
Hello World!
This is a "pen".
これだけでよい.
#
はコメント文である.C++の //
に相当.
文字列は,"
と '
のどちらで囲っても,開始と終了がそろっていればOK.
(Cでは"
は文字列,'
は1文字)
上の例のように," や ' を表示したいときに,いちいちエスケープしなくてもよいので便利.
print
は,C言語と異なり\n
を書かなくても改行が自動で追加される.
これを抑止したければ,以下のように end
に空文字を指定する.
また,end
に文字列を設定すると,文字列の最後に毎度,追加される.
print('ABC', end='') # ''は,シングルクオーテーション2つ
print('XYZ')
実行結果
ABCXYZ
変数などの値を書式付きで出力する方法は後述する.
print
では複数の値や変数をカンマ区切りで連続して出力できる.
この際,文字や数値の間に,区切り文字としてスペースが自動的に入る.
区切り文字変更するときは sep
変数を指定.
print(100, 200, 300)
print(100, 200, 300, sep = ',')
print(100, 200, 300, sep = '----')
print(100, 200, 300, sep = ' | ')
print(100, 200, 300, sep = '') # ''は,シングルクオーテーション2つ
実行例
100 200 300
100,200,300
100----200----300
100 | 200 | 300
100200300
キーボードからの入力には,input
を使う.
C言語の scanf()
に相当するが,input
の引数に,入力メッセージを渡すことができるので便利.
ret = input('Input a number:')
str1 = input('input a number 1:')
str2 = input('input a number 2:')
sum = str1 + str2
print(sum)
実行例:
input a number 1:10
input a number 2:20
1020
(予想した) 30 ではなく,1020 と表示される.(千と二十ではなく,イチ・ゼロ・ニ・ゼロ)
重要:キーボードからの入力は,文字列として返される.
数値として入力したい場合は,int(), float()
を使って,数値に変換する.
(Cでいうところの atoi, atof, strtol, strtof
)
str1 = input('input a number 1:')
str2 = input('input a number 2:')
sum = int(str1) + int(str2)
print(sum)
実行例:
input a number 1:10
input a number 2:20
30
あるいは,最初からinput
の戻り値を数値に変換してから,変数に代入できる.
x = int ( input('input a number 1:') )
y = int ( input('input a number 2:') )
sum = x + y
print(sum)
Pythonでは,変数の型 == クラスであり,何でも代入できる.
変数の型は実行時に動的に決まるので,事前に型名を決める必要はない.
そもそも,変数の宣言も必要ない.
ここがC言語と大きく異なるので,慣れないと少し気持ち悪いかもしれない.
# こんなのもOK.
i = 10 # 整数.宣言無しで,いきなり代入可
print(i)
i = 'Hello' # 文字列
print(i)
実行結果
10
Hello
print
で,文字列と変数の値をあわせて表示したければ,カンマ区切りで並べる.
i = 100 # 型名の指定は不要.
j = 200
print('Hello World! i=', i, 'j=', j)
変数は,数値だけでなく文字列もOK.
i = 'OMG!'
print('Hello World! i =', i)
print(i) # これもOK
print(i + ' --- ' + i) # 文字列の連結
print(i + '1' ) # これはOK
print(i + 1) # これはNG. i は文字なので,数値を足せない
最後の行を実行した時点で,以下のようなエラーが出るはずである.
Pythonは(コンパイル言語ではなく)インタプリタ言語なので,ソースコードの上から順に実行してゆき,エラーが出た時点で初めて実行が止まる.
このように Traceback (...) とのメッセージが出たら何かしらのエラーが発生したと考えられるため,行数や内容をヒントにソースコードを修正しよう.
Traceback (most recent call last): File "C:\....\test.py", line 6, inprint(i + 1) TypeError: can only concatenate str (not "int") to str
C言語の printf()
風の書式指定が使いたい場合は,以下のように書けばよい.
%(...)
で,表示したい変数名をカンマ区切りで列挙する.
name = 'Paul'
age = 90
height = 170.5
print('%s is %04d years old, height=%.2fcm.' % (name, age, height))
Paul is 0090 years old, height=170.50cm.
+, -, *, /, //, %, **
割り算は,Python3 とC言語とで若干異なるが基本は同じ.
**
は便利.
print(12 + 5)
print(12 - 5)
print(12 * 5)
print(12 / 5) # 浮動小数点で計算される.C言語では切り捨て
print(12 // 5) # 小数点以下を切り捨て
print(12 % 5)
print(12 ** 5) # べき乗
実行結果
17
7
60
2.4
2
2
248832
数値(や文字コード)の大小を比較する演算子.記号自体はC言語と同じである.
比較の結果,式全体として,True
か False
の値をとる.
(C言語では,非ゼロ値とゼロ,C++ではtrue, false
であらわされる.)
<, > <=, >=, ==, !=
print(2 > 3)
print(2 < 3)
実行結果
False
True
論理演算子は,そのまま and, or, not
と書く.
(C言語では,&&, ||, ! でした)
print(1>2 or 1<2)
print(not True)
実行結果:
True
False
if
文if 条件式:
Cと異なり,条件式を丸かっこ () で囲う必要はない.条件式の最後にコロン :
が必要.
i = int(input('i=?'))
if i > 0:
print('正です.')
elif i < 0:
print('負です.')
else:
print('ゼロです.')
print('おわり.')
実行結果:
i=?10
正です.
おわり.
elif ...:
や else:
は,必要なければ省略できる.
pythonでは,コードブロックを字下げで表すので,正しく字下げしないとエラーになる!
(C言語では,{}
で括られていれば,字下げありでもなしでもOK)
Pythonでは,インデントはソースコードの見た目の問題ではなく, 字下げを綺麗に書かないとプログラムが正しく実行できないという素晴らしい言語仕様である.
while
文while 条件式:
if文とほぼ同様の書式. これも字下げ重要.
i=0
while i<=10:
print(i)
i+=1 # インクリメント.i++ は,何と文法エラー!
for
文for 変数 in オブジェクト:
C言語ではカウンタ変数などを用意して反復回数をカウントしますが,Pythonでは反復可能(Iterable)な「オブジェクト」を置きます.リストなどの何らかのデータの集合です.
なんのことだかわかりにくいですが,例えば数値の連番の反復には,range
を使用します.
range(n)
で,0,1,2, ... , n-1 までの値の集合を表します.
for i in range(5):
print(i)
実行結果
0
1
2
3
4
range
は,(初期値, 終了値, 増加させる値)と書くことができる.
増加させる値を省略すると 1 となり,また負数を与えることもできる.
for i in range(20, 10, -2):
print(i)
実行結果
20
18
16
14
12
多重ループの場合も,字下げをきれいに書きましょう.
print('---------------------')
for i in range(1,10):
for j in range(1,10):
print(i*j, end=' ')
print('\n')
print('---------------------')
range
は,終了値には達しないので注意!
関数の定義は def
から書き始める.
def func():
print('Hello!') # 字下げ重要
# ↑↑↑↑ ここまでが関数 func() ↑↑↑↑
# ↓↓↓↓ ここから処理が開始される ↓↓↓↓
func()
func()
func()
実行結果
Hello!
Hello!
Hello!
順に渡す.型名は不要.
def func(a, b):
print('a=', a, 'b=', b)
func(1, 2)
func(3.2, 4.9)
func('AAA', 'ZZZ')
実行結果
a= 1 b= 2
a= 3.2 b= 4.9
a= AAA b= ZZZ
仮引数は,いわゆる値参照?
関数内で引数を変更しても,呼び出し元には影響しない.
def func(a):
a=100
a=1
print('a=', a)
func(a)
print('a=', a)
実行結果
a= 1
a= 1
リストは,Cでいう配列のようなもので,Pythonでは色々な型を混在できる.
(変数をまとめて扱う機能は,一般に「コンテナ」と呼ばれる.)
普通の変数と同様,宣言時に型を指定する必要もない.
宣言には角かっこ [ ]
を用い,要素をカンマ区切りで書く.
添字は C と同様,オフセット0が先頭.
a = [10, 20, 30] # リストの初期化
print('a =', a)
print('a[0] =', a[0])
print('a[1] =', a[1])
print('a[2] =', a[2])
実行結果
a = [10, 20, 30]
a[0] = 10
a[1] = 20
a[2] = 30
もちろん各要素は個別に変更可能.
a = [10, 20, 30]
print('a =', a)
a[0] = 100
print('a =', a)
実行結果
a = [10, 20, 30]
a = [100, 20, 30]
配列の境界をはみ出ると...
a = [10, 20, 30]
print('a =', a)
print('a[2] =', a[2]) # これはOK
print('a[3] =', a[3]) # ???
print('a[4] =', a[4]) # OMG!
実行結果
a = [10, 20, 30]
a[2] = 30
Traceback (most recent call last):
File "test.py", line 4, in <module>
print('a[3] =', a[3]) # ???
IndexError: list index out of range
と,きちんとエラーが出る.
リストの中身は数値でなくても良い.
(文字列の配列は,Cだと「ポインタの配列」が必要)
a = ['Oh', 'My', 'Goodness']
print('a = ', a)
print('a[0] =', a[0])
print('a[1] =', a[1])
print('a[2] =', a[2])
実行結果
a = ['Oh', 'My', 'Goodness']
a[0] = Oh
a[1] = My
a[2] = Goodness
リストの中身は数値と文字が混在しても良い.
a = ['Oh', 10, 'My', 20, 'Goodness']
print('a = ', a)
print('len(a) = ', len(a) )
print('a[0] =', a[0])
print('a[1] =', a[1])
print('a[2] =', a[2])
print('a[3] =', a[3])
print('a[4] =', a[4])
実行結果
a = ['Oh', 10, 'My', 20, 'Goodness']
len(a) = 5
a[0] = Oh
a[1] = 10
a[2] = My
a[3] = 20
a[4] = Goodness
array = [1, 3, 5, 10] # リスト
for i in array: # リストを使った繰り返し文
print(i)
実行結果
1
3
5
10
def func(a):
print('a=', a)
print('len(a) = ', len(a) )
a = [1,2,3]
func(a)
実行結果
a = [1,2,3]
リストのサイズ,型名は len()
, type()
で得られる.
基本の手順はC言語と同じく,「開く」「読み書き」「閉じる」.
f = open('sample.txt', 'w') # 引数はCのfopen()と同じ.ファイル名とモード
f.write('Hello World!\nGood Bye!')
f.close()
ファイル名などは,変数を使おう.
fname = 'sample.txt'
f = open(fname, 'w') # 'w' は書き込みモード
data = 'Hello World!\nGood Bye!'
f.write(data)
f.close()
fname = 'sample.txt'
f = open(fname, 'r') # 'r' は読み込みモード
line = f.readline() # (改行コードも含め)1行読み込み
print(line)
f.close()
これだと1行しか読み込まれないので,
fname = 'sample.txt'
f = open(fname, 'r')
for line in f:
print(line) # line は1行分のデータ
f.close()
実行結果
Hello World!
Good Bye!
print
で表示すると,改行コードが余分に入るため,1行空行ができる.
この方法では,ファイルからの読み込み処理と,計算処理とを分離できる.
ファイルサイズがそこそこ大きくても効率よく自動的にメモリが確保され,高速に読み込める.
f = open('sample.txt', 'r')
lines = f.readlines()
f.close()
print(lines)
実行結果
['Hello World!\n', 'Good Bye!']
以下は 10万行分の数値の書かれたデータファイル data.csv を読み込んで,平均値を画面に出力する例である.
ファイルには 0∼1 までの乱数が書かれているので,平均値は 0.5 前後になる.
注:data.csvは1.3MB程度あるため,プログラムの実行テストが終わったら削除しておいた方が良い.
#
# ファイル内の数値を読み込んで平均値を計算
#
f = open('data.csv', 'r')
lines = f.readlines()
f.close()
N = len(lines)
print(N, 'lines in file.')
sum=0.0
for i in range(N):
# print(float(lines[i])) # 毎行表示
sum += float(lines[i])
print('average =', sum/N)
ファイル処理は,なんだかんだエラーが発生する.
書き込むファイルが他のアプリでロックされている.
読み込むファイルが存在しない.など.
エラー処理には,「例外処理」を使用する.詳しい説明はここでは省略.
fname = 'non-existing-file.txt' # 存在しないファイル名
try:
f = open(fname, 'r')
lines = f.readlines()
except:
print('読み込めなーい')
else:
print('読み込みました.')
print(lines)
f.close()
finally:
print('おしまい.')
実行結果:
読み込めなーい
おしまい.
ここではこれ以上詳しい説明は行わないが,さらなる詳細な解説は公式ドキュメント内にある「チュートリアル」「言語リファレンス」「ライブラリーリファレンス」を参照するとよい.
また,プログラミングに際しては,これ以外にも多くの重要なトピックがある.
興味がある諸君はインターネットのサイトや書籍などを積極的に調べて学習してみよう.
Pythonはインタプリタ言語であるため,自分でアルゴリズムをゼロから記述しても処理が遅いことが多い.
(逆に,C言語では下手なプログラムを適当に書いても,そこそこ高速に処理できる.)
むしろ,いろいろな既存のパッケージ等をうまく組み合わせて使用するのが吉である.
(Pythonのパッケージの内部処理は,高速化のためにC言語などで書かれている.)
よく使われるパッケージ類などへのリンク.いずれもpipコマンドで簡単にインストールできる.
Python本体のインストール方法はこちらを参照.
Macの場合,「アクセサリ」の「ターミナル」から
$ sudo pip3 install matplotlib password: (管理者のパスワードを入力) Collecting matplotlib Downloading matplotlib-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl (8.5 MB) |████████████████████████████████| 8.5 MB 5.3 MB/s
Windowsの場合,「Windowsシステムツール」「コマンドプロンプト」を(管理者として)実行し,
> pip install matplotlib ...省略...
この際,他の関連パッケージもインストールされる場合がある.
以下に簡単なグラフ作成の例を示す.
# matplotlib をインポート
import matplotlib.pyplot as plt
# 適当な配列データ
x = [1, 2, 3, 4, 5]
y = [10, 9, 7, 4, 1]
# グラフを描いて表示
plt.plot(x, y)
plt.show()
表示されたグラフの設定を変えたり,ファイルに保存することもできます.
これでも何となくデータの形はわかりますが,工学文書の作法に則ったグラフにするには,もう少し軸や色の設定がいろいろ必要です.
以下のプログラムでは,軸の説明や範囲,プロットの色などを設定したうえで,ファイルに自動保存します.
このソースは,githubに置いてあります.
import matplotlib.pyplot as plt
import numpy as np
# data set, omega and power
RPM = [ 155, 175, 200, 210, 250, 319, 380, 490, 550, 617]
Pout = [ 0.02, 0.11 , 0.36, 0.45, 0.51, 0.59, 0.66, 0.71, 0.58, 0.42 ]
# draw scatter plot
plt.scatter(RPM, Pout, marker='o', color = 'black', label='high')
# configure title, axis label and grid
plt.title('Output power of engine.')
plt.xlabel('Revolution (rpm)')
plt.ylabel('$P$ (W)')
# add axis tick
ax = plt.gca() # get current axis
ax.tick_params(direction = 'in', length = 5)
# set range of axis
plt.xlim(100, 700)
plt.ylim(0, 1.0)
# grid lines
plt.grid(True, color='black')
# save figure to file
plt.savefig('figure1.pdf') # PDF file
plt.savefig('figure1.png', dpi=300) # png image file
# Show image
plt.show()
実行結果.以下のようなグラフが表示されると思います.
同時に,作業フォルダ内にこの画像が figure1.png, figure1.pdf として保存されます.