Python(パイソン,と読む.ギリシア神話に登場するへび.)は,近年広く使われているインタプリタ言語で,処理を1行ごとにインタラクティブに入力・実行することができる.
C言語がコンパイル言語であるのに対して,Pythonはインタプリタ言語である.
C言語と同様にソースファイル(拡張子は .py )にプログラムを記述して,まとめて実行することも可能であるが,基本的には機械語への翻訳作業が1行ごとに行われる.
このページでは,C言語をひと通り学習した人向けに,ざっと Python3 の文法の基礎を説明します.
Python言語はインタプリタ言語であるため,ソーティングや数値計算などの基本的な処理アルゴリズムを記述・実行すると,同じ内容をC言語で記述した方が圧倒的に高速である.
したがって,Pythonではすでに用意されている様々なパッケージ・ライブラリを順次組み合わせて,それをスクリプト的に実行するような書き方が一般的である.
Python3 の開発環境は 標準のWindowsにはインストールされていない.
(Mac OSには,旧バージョンの Python2 が入っている場合があるが,新しい Python3 をダウンロード・インストールする.)
注:情報処理教室のWindowsPCには,Python3がインストールされているので,インストール作業は必要ない.
詳細なインストール手順についてはPythonインストールの説明(外部サイト)を参照.
インストールが完了したら,以下のようにインタプリタが実行できるか確かめてみよう.
コマンドプロンプト(Windows) またはターミナル(Mac OS, Linux) を起動して,以下のように打ち込んでみよう.
Windowsの場合 Z:\.windows2000> python Python 3.9.12 (main, Apr 4 2022, 05:22:27) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 Warning:(省略) Type "help", "copyright", "credits" or "license" for more information. >>> <- このような入力プロンプトが出ればOK
Macの場合 % 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. >>> <-これが入力プロンプト (古めのMac OSの場合,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. >>>
ここにPythonのソースコードを逐次入力していくことによって,プログラムがその都度翻訳され実行される.
プログラムの入力が終了したら,exit()
で,Pythonの入力プロンプトを終了できる.
まずはプログラムを1行ずつ入力して実行する方法.
pythonを起動し,以下の赤字の部分をキーボードから順次入力しよう.
>>> print('Hello world!') Hello world! >>> i=5+3 >>> print('i=', i) i= 8 >>> exit()
このように,インタプリタ言語では,電卓のように簡単に計算プログラムを書くことができる.
動画による説明.コマンドプロンプトの起動からプログラム実行まで.
処理手順が長くなると入力するのが面倒で,間違いも多くなるので,C言語のようにあらかじめソースファイルを書いておいて,一度に実行することもできる.
以下を test.py としてマイドキュメント内(z:\.windows2000フォルダなど)に保存
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
VSCode(統合開発環境)での実行方法
C言語の場合と同様,VSCodeやVSCodium内の「ターミナル」から python インタプリタを実行する方法.
設定によっては,VSCodeのメニューの「実行」「デバッグなしで実行」でも実行できる場合がある.
Pythonをインストールすると同時にインストールされる「IDLEエディタ」を使用すると,
すぐに実行結果が確認できるので便利.
上記の実行方法のほか,IPython, Jupyter notebook など便利な実行環境が利用可能であるので,興味があれば調べてみよう.
# This is comment
print('Hello World!')
print('This is a "pen".')
実行結果
Hello World!
This is a "pen".
これだけでよい.
#
以降はコメントとみなされる.C++の //
に相当.
文字列の括りは,"
と '
のどちらで囲っても,開始と終了がそろっていればOK.
(Cでは"
は文字列,'
は1文字)
上の例のように," や ' を表示したいときに,いちいちエスケープしなくてもよいので便利.
print
は,C言語と異なり改行が自動で追加される.
これを抑止したければ,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()
に相当するが,少し異なる.
ret = input('Input a number:')
C言語のscanf()
と違って,input
の引数に,入力メッセージを渡すことができるので,便利.
重要:キーボードからの入力は,まず 文字列として返される.
以下の例では,入力した文字列は変数 ret
に代入される.
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
あるいは,最初から数値に変換して変数に代入.
(変数名をx,y
に変えてある.)
x = int ( input('input a number 1:') )
y = int ( input('input a number 2:') )
sum = x + y
print(sum)
逆に,数値を文字列にする場合は,str(数値)
を使う.
Pythonでは,変数の型 == クラスであり,何でも代入できる.
C言語とは異なり,変数の型は実行時に動的に決まるので,型名を決める必要はない.
そもそも,変数の宣言も必要ない.
# こんなのもOK.
i = 10 # 整数
print(i)
i = 'Hello' # 文字列
print(i)
実行結果
10
Hello
変数の型を調べるには,type()
を使う.
print( type(10) )
print( type(10.0) )
print( type("10") )
print( type('10') )
実行結果
<class 'int'>
<class 'float'>
<class 'str'>
<class 'str'>
print
で,文字列と変数の値をあわせて表示したければ,
i = 100 # 型名の指定は不要.
print('Hello World! i=', i)
変数は,数値だけでなく文字列も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[-1] =', a[-1])
print('a[-2] =', a[-2])
print('a[-3] =', a[-3])
実行結果
a = [10, 20, 30]
a[-1] = 30
a[-2] = 20
a[-3] = 10
配列の境界をはみ出ると...
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
数値と文字が混在したリストでもOK.(何に使うんだろう)
array = ['Oh', 'My', 'goodness', 10, 20] # 混在リスト
for i in array:
print(i)
実行結果
Oh
My
goodness
10
20
def func(a):
print('a=', a)
a = [1,2,3]
func(a)
実行結果
a = [1,2,3]
リストのサイズ,型名は len()
, type()
で得られる.
a = ['Oh', 10, 'My', 20, 'Goodness']
print('a = ', a)
print('len(a) = ', len(a) )
print(type(a))
print(type(a[0]))
print(type(a[1]))
実行結果
a = ['Oh', 10, 'My', 20, 'Goodness']
len(a) = 5
<class 'list'>
<class 'str'>
<class 'int'>
リスト全体の type は list,先頭は str, 二番目は int
基本の手順は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!']
ファイル処理は,なんだかんだエラーが発生する.
書き込むファイルが他のアプリでロックされている.
読み込むファイルが存在しない.など.
エラー処理には,「例外処理」を使用する.詳しい説明はここでは省略.
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コマンドで簡単にインストールできる.
Windowsの場合,「Windowsシステムツール」「コマンドプロンプト」で
> pip install matplotlib ...省略...
この際,他の関連パッケージもインストールされる場合がある.
Macの場合,「アクセサリ」の「ターミナル」から
$ 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
いずれも,管理者権限が必要となる場合がある.
以下に簡単なグラフ作成の例を示す.
# matplotlib をインポート
import matplotlib.pyplot as plt
# 適当な配列データ
x = [1, 2, 3, 4, 5]
y = [10, 9, 7, 4, 1]
# グラフを描いて表示
plt.plot(x, y)
plt.show()
表示されたグラフの設定を変えたり,ファイルに保存することもできます.
これでも何となくデータの形はわかりますが,工学文書の作法に則ったグラフにするには,もう少し軸や色の設定がいろいろ必要です.
以下のプログラムでは,軸の説明や範囲,プロットの色などを設定したうえで,ファイルに自動保存します.
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()
実行結果(保存されたファイル)