Python(パイソン,と読む)は,インタプリタ言語なので,処理を1行ごとに入力し,順番に実行することができる.
(C言語はコンパイル言語)
また,ソースファイル(拡張子は .py )に記述して,まとめて実行することも可能.
このページでは,いちどC言語を学習した人向けに,ざっとPython3を説明します.
Python3はWindowsには標準でインストールされていないので,以下からダウンロードしてインストールする必要がある.
(MacOSXには,ふるいPython2が標準で入っているので,新しいVersionをダウンロード・インストールする.)
このほか,iOS用にも(有料の)Pythonの開発環境が用意されており,移動中でも気軽にプログラミングができる.
手順についてはPythonインストールの説明(外部サイト)を参照.
インストールが完了したら,コマンドプロンプトで,以下のように打ち込んでみよう.
Windowsの場合 Z:\> python Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> (<- このようなプロンプトが出ればOK)
Macの場合 % python3 Python 3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> % python (ふるい Python2 が起動してしまうので注意!) 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. >>>
いずれの場合も,exit()と入力することで,Pythonの入力プロンプトを終了できる.
Pythonはインタプリタ言語なので,プログラムを1行づつ入力・実行することができる.
(pythonを起動し,以下の赤字の部分をキーボードから順次入力)
>>> print('Hello world!') Hello world! >>> i=5+3 >>> print('i=', i) i= 8 >>>
このように,インタプリタ言語では,電卓のように簡単に計算プログラムを書くことができる.
処理手順が長くなると入力するのが面倒で,間違いも多くなるので,C言語のようにあらかじめソースファイルを書いておいて,一度に実行することもできる.
以下を test.py として保存
print(' --- Calc. prog. ---')
i = 3 + 5
j = 4 * 5
print('ans = ', i * j)
(実行方法)
Z:\> python test.py
--- Calc. prog. ---
ans = 160
このように,Pythonでは以下の2つの方法でプログラムを実行することができる.
python
(Macではpython3)と打ち込んで,>>>
のプロンプトで 1 行ごとに実行.
test.py
など,拡張子はpy)に記述・保存し,コマンドラインまたはシェルから python test.py
(Macではpython3 test.py) とする.
ちょっとしたテストなら1,何度も繰り返すような処理なら2で実行するとよい.
Pythonをインストールすると同時にインストールされる統合開発環境(IDE)「IDLEエディタ」を使用すると,
すぐに実行結果が確認できるので便利.
VSCodeやVSCodiumなどでソースファイルを編集し,ターミナルから実行することもできる.
# 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:')
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(数値)
を使う.
変数の型 == クラスと考えて差し支えない. 変数の型は実行時に動的に決まるので,宣言時にあらかじめ型名を決める必要はない. (そもそも,変数を使用する前に宣言する必要がない.)
# こんなのもOK.
i = 10 # 整数
print(i)
i = 'Hello' # 文字列
print(i)
実行結果
10
Hello
ただし,途中で変数の型がわからなくなってくるので,変数の型を調べるには,type()
を使う.
# 対話モードなら,printは不要.
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
風の書式指定が使いたい場合は,以下のように書けばよい. %(...)
で,変数を列挙する書式がC言語と異なるが,よく似ている.
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 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
基本中の基本
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言語などで書かれている.