Pythonプログラムのソースファイルの名前は、一般的には
名前.pyのように拡張子 py のテキストファイルとして作成する。エンコーディングは UTF-8 とするのが無難である。
※ UTF-8 以外のエンコーディングでソースファイルを作る場合には、ソース先頭 (1行目または2行目) でエンコーディング指定が必要になる。例えば、WindowsのシフトJIS (cp932) でソースファイルを作成するなら、ソース先頭で
# coding: cp932のような行を入れる。
プログラムの実行は、コマンドプロンプトや端末アプリで、
python 名前.pyのように入力して python コマンドでソースファイルを実行させる。ただし、Linuxでは、python コマンドの代わりに python3 コマンドでバージョン3の Python を指定する必要がある場合がある。
Python では、プログラムの構造をソースのインデント (字下げ) で表す。
インデントでは、スペースとタブが区別されるので注意。
インデントとして、スペース 4 つが推奨されている。
C, C++, Java 等のプログラミング言語では、ステートメント (文) の終りにセミコロンをつける決まりだが、Python ではセミコロンは不要で、一般に、改行でステートメントを終了する。
文字列は、前後をシングルクォーテーション ' またはダブルクォーテーション " で囲んで表す。
また、トリプルクォート ''' または """ で囲むことで改行を含めた複数行に亘る文字列を表せる。
ソースの行で、番号記号 # 以降の部分はコメントとなる。ただし、文字列内で使用されている # は除く。
C言語などで利用できるインクリメント演算子 ++、デクリメント演算子 -- はPythonにはないので、それぞれ += 1、-= 1 に書き換える必要がある。
Python 3 では、除算演算子 / は整数同士の除算であっても結果を小数部分も含めた浮動小数点として求める。一方、// は整数部分の商を求める演算子である。
べき乗演算子 ** でべき乗を計算させることができる。例えば
3**4は 34 = 81 となる。
一般に、変数は型を付けずに利用する。変数にはいろいろな型のオブジェクトを代入できる。
素のPythonには「配列」は用意されていない。代わりにリスト (list)とタプル(tuple)を使う。
※ ただし、よく利用される NumPy というライブラリでは(多次元)配列が利用できる。ここでは説明を省くが、興味のある人はWebで調べてみるとよい。
リストは追加・削除・中身の書き換えができる。(mutable)
具体的なリストは角括弧で囲んだ中に要素をコンマ区切りで並べて表記する。
タプルは追加・削除・要素の書き換えができない。(immutable)
具体的なタプルは、一般的には、丸括弧で囲んだ中に要素をコンマ区切りで並べて表記する。ただし、構文上の解釈に問題がない箇所では、丸括弧で囲まず、要素をコンマ区切りで並べるだけの書き方もできる。
リストまたはタプルの要素には、角括弧の中に 0 始まりのインデックスを入れて
リストまたはタプル [ インデックス ]
の形でアクセスする。
マイナスのインデックス値を使用できる。インデックス -1 で末尾の要素、-2 で末尾から2番目の要素、... のように指定できる。
[] 空リスト (要素0個) [4] 要素1個のリスト () 空タプル (要素0個) (7,) 要素1個のタプル。1個の場合に限り要素の後ろにコンマが必須であることに注意 7, 要素1個のタプル。構文上の解釈に問題がない箇所では、丸括弧は必須ではない (7) タプルでなく、数値の 7 に丸括弧をつけただけ x = [1, 3, 5, 7, 6] x は要素5個のリスト x[0] は 1、x[1] は 3、x[2] は 5 など。 x[-1] は 6、x[-3] は 5 など。 x[2] = 8 要素の書き換え。 x は [1, 3, 8, 7, 6] となる。 y = (1, 4, 16, 64) y は要素4個のタプル y[0] は 1、y[1] は 4 など。 y[-1] は 64、y[-2] は 16 など。 y = 1, 4, 16, 64 タプルの場合、構文上の解釈に問題がない箇所では、丸括弧で囲まない書き方も可能 y[1] = 3 タプルは書き換えできないのでエラーになる。 xx = [4] * 6 同一要素を連続して指定個数持つリストの定義。 xx は [4, 4, 4, 4, 4, 4] となる。 append(要素) 要素をリストの末尾に追加するメソッド x.append(4) x は [1, 3, 8, 7, 6, 4] となる。 y.append(256) タプルには追加できないのでエラーになる。 リスト += 別リストまたはタプル 別リストまたはタプルの各要素をリストの末尾に追加する x += (5, 2) x は [1, 3, 8, 7, 6, 4, 5, 2] となる。 insert(位置, 要素) 要素をリストの指定位置に追加するメソッド。 位置を 0 とするとリスト先頭に追加される。 x.insert(0, 9) x は [9, 1, 3, 8, 7, 6, 4, 5, 2] となる。 len(リストまたはタプル) リスト (タプル) の要素数を求める関数 c = len(x) x が上記リストの場合、c は 9 となる。 d = len(y) y が上記タプルの場合、d は 4 となる。
print関数を使う。複数のパラメータを指定してまとめて表示できる。
print( 値1, 値2, 値3, ... )
複数パラメータは sep (デフォルトは空白) で指定される文字列で区切られる。
区切りを入れないときは sep='' とする。
print( 値1, 値2, ..., sep='')
出力の最後に end (デフォルトは '\n') で指定される文字列が出力される。すなわち、デフォルトでは出力の後改行される。
最後に改行を入れないときは end='' とする。
print( 値1, ..., end='')
C言語のprintfのような書式付出力には数通りの方法がある。古い順に並べて以下に示す。
新しいPython用に書くなら f文字列 を使えばいい。
下記に簡単な例を示す。詳しくは、自分で調べて入れる。
aInt = 15
bFloat = 3.141592
print(f'a ={aInt:4}')
# (出力)
# a = 15
# 幅4字を指定したので前にスペースが2個ついて全体4字で表示される
print(f'b ={bFloat:6.3f}')
# (出力)
# b = 3.142
# 幅6字, 小数点以下3桁の数値を指定したので前にスペースが1個ついて全体6字・小数点以下3桁で表示される
print(f'a ={aInt:3} b ={bFloat:5.2f}')
# (出力)
# a = 15 b = 3.14
# aIntは幅3字, bFloatは全体5字・小数点以下2桁で表示される
if 条件式1:
処理1
elif 条件式2:
処理2
else:
処理z
「条件式1」が成り立つとき「処理1」を、そうでなくて「条件式2」が成り立つとき「処理2」を実行する。「条件式1」も「条件式2」も成り立たないときは「処理z」を実行する。elif や else はなくてもよい
if c == 2:
print("abcd")
elif c == 5:
print("wxyz")
else:
print("1234")
真を表す定数として True、偽を表す定数として False が用意されている。なお、数値として扱う場合は True は 1、False は 0 として扱われる。
Pythonでは、下表にあるものは偽とみなされる。
False |
None (何も存在しないことを表す) |
整数 0 |
浮動小数点 0.0 と -0.0 |
複素数 0j または complex(0.0,-0.0) 等 |
空の文字列 '' または "" |
空のリスト [] |
空のタプル () |
空のrangeオブジェクト range(0) 等 |
空の辞書 {} |
空の集合 set() |
上表にないものは、独自に真偽を定義されたオブジェクトを除き、真とみなされる。
論理式を組み合わせて複雑な条件を表すとき、C言語等では
| && | 論理積 |
|---|---|
| || | 論理和 |
| ! | 論理否定 |
という記号(列)を演算子として使用するが、Pythonでは英単語をそのまま演算子として使って
| and | 論理積 | A, B を論理式として A and B の形で使用 |
|---|---|---|
| or | 論理和 | A, B を論理式として A or B の形で使用 |
| not | 論理否定 | A を論理式として not A の形で使用 |
となる。
Python 3では、range関数 (正確には、range型オブジェクトのコンストラクタ) で連番を生成するオブジェクトを作ることができる。
※【注意】リストやタプルを返すわけではない。リストが欲しい場合はrange型オブジェクトに対し list 関数を使って変換する。同様に、タプルが欲しい場合はrange型オブジェクトに対し tuple 関数を使って変換する。
Python 2 では、range 関数は連番のリストを返す。他に、連番を生成するオブジェクトを得る xrange 関数が用意されていた。
range(上限値) の形で、0 から「上限値」未満の連番を生成する。
range(10)
range(初期値, 上限値) の形で、「初期値」から「上限値」未満の連番を生成する。
range(2, 5)
range(初期値, 上限値または下限値, ステップ) の形で、「初期値」から、「ステップ」ずつ値を変化させ、「上限値」未満または「下限値」+ 1 以上の連番を生成する。
range(3, 12, 3)
range(10, 1, -3)
while 条件式:
処理
...
「条件」が成り立っている間、繰り返し「処理」を実行する
n = 3
print( 'n =', n )
while n != 1:
if n % 2 == 0:
n //= 2
else:
n = 3 * n + 1
print( n )
for 変数 in イテラブルオブジェクト(リストや連番など):
処理
...
リスト、タプルや連番などのイテラブルオブジェクトから要素を順に「変数」として取り出し、繰り返し「処理」を実行する。
for で使われた変数は for の繰り返し処理が終わった外部においても有効であることに注意する。
for i in y:
print( i*10 )
for i, p in enumerate(y):
print( '2**', 2*i, ' = ', p, sep='' )
2**0 = 1 2**2 = 4 2**4 = 16 2**6 = 64
for e in reversed(x):
print( e )
2 5 4 6 7 8 3 1 9
Pythonには、スライス (slice) という、シーケンス (リスト、タプル、string、rangeなど) から新しいシーケンスを生成する機能がある。元のリストから [::-1] というスライスを取りだすと逆順のシーケンスが生成できるので、上の for の行は下のように記述することもできる。
for e in x[::-1]:
for e in sorted(x, reverse=True):
print( e )
9 8 7 6 5 4 3 2 1
for i in range(5, 11):
if i % 2 > 0:
print( i )
Pythonでは、関数は def を使って定義する。
関数の本体はインデントを1レベル深くする。
戻り値がある場合は return で指定する。return で値を返さない関数では、戻り値は None となる。
関数のパラメータおよび内部で定義された変数は、関数内部でのみ有効となる。外部と関数内部に同じ名前の変数がある場合、関数の中では内部の変数が優先される。
def 関数名 ( パラメータのコンマ区切りの並び ):
関数の本体
…
return 戻り値 # 返す値がない場合は不要
def calc(a, b, c):
m = a
m += b
return m ** c # ** はべき乗演算子
print(m) # 外部で m が定義されていない場合、エラーになる
print(a) # 外部で a が定義されていない場合、エラーになる
a = calc(3, 2, 3)
print(a)
print(calc(4, 3, 2))
Python 2では旧スタイルと新スタイルの2種類の記述方法があり、それぞれのスタイルにより振る舞いが異なっていた。Python 3では旧スタイルは廃止されて、新スタイルのみとなった。
クラスは class キーワードを使って定義する。クラスの内部はインデントを1レベル深くして記述する。クラスの中で定義される関数はメソッド (method)といわれる。
一般的には下のようになる。
class クラス名(): # Python 3では クラス名: あるいは クラス名(object): あるいは クラス名(): で始める # クラス変数 (static変数相当) の定義 変数名 = 値 ... # 初期化用メソッド (オブジェクト生成直後に呼ばれる。コンストラクタ相当) def __init__(self, パラメータ...): ... # インスタンスメソッド def メソッド名(self, パラメータ...): ... # staticメソッド @staticmethod def メソッド名(パラメータ...): ... # classメソッド @classmethod def メソッド名(cls, パラメータ...): ...
Pythonでは、オブジェクト自身 (すなわちC++やJavaにおける this) を self と記すのが慣例で、初期化用メソッドやインスタンスメソッドでは self が暗黙の第一パラメータとなっている。呼び出しにおいてメソッドパラメータとしては書かないが、暗黙でオブジェクト自身が第一パラメータとなる。
Pythonでは、クラスに対するメソッドとして、staticメソッドとclassメソッドの2種類がある。
staticメソッドはクラスに結び付けられているだけで、実体は普通の関数と変わらない。classメソッドは、呼び出しにおいてメソッドパラメータとしては書かないが、クラスを表す暗黙の第一パラメータがあり、cls と記すのが慣例である。
C++やJavaのクラスにおける static メソッドは、Python ではクラスの static メソッドまたは class メソッドに変換すればよい。
インスタンス変数はオブジェクトの属性 (attribute)として定義する。属性は、
オブジェクト.属性名の形の記法でオブジェクトに結び付いたデータあるいはメソッド(関数)を表す。
インスタンス変数は、クラスの内部においては、self をオブジェクト自身として、その属性
self.変数名の形で表現しなければならない。クラスの外部で使うときは
インスタンス変数名.変数名のような形で参照する。
同様に、インスタンスメソッドもオブジェクトの属性として利用する。
インスタンスメソッドは、クラスの内部においては、self をオブジェクト自身として
self.メソッド名の形で表現しなければならない。クラスの外部で使うときは
インスタンス変数名.メソッド名のような形で参照する。
static変数は、クラスの内部でも外部でも、クラスの属性、すなわち
クラス名.変数名の形で表現しなければならない。
同様に、staticメソッドおよびclassメソッドは、クラスの内部でも外部でも
クラス名.メソッド名の形で表現しなければならない。
(例) Tensuクラスの抜粋した書き方例
class Tensu:
# static変数(相当)
MAXT = 100 # クラスで定数扱いとする変数もここで定義すればよい
ninzuu_ = 0
# 初期化用メソッド (コンストラクタ相当) の書き方
# 第一パラメータは self (Java等の this に相当)
def __init__(self, eigo, kokugo, sugaku):
self.eigo_ = eigo
self.kokugo_ = kokugo
Tensu.ninzuu_ += 1
# インスタンスメソッドの書き方
# 第一パラメータは self (Java等の this に相当)
def eigo(self):
return self.eigo_
# staticメソッドの書き方
# 当然 self パラメータは無い
@staticmethod
def ninzuu():
return Tensu.ninzuu_
クラスのインスタンスは、クラスを関数のように呼び出すことによって生成する。その際、初期化用メソッド __init__ の self 以外のパラメータを指定する。
t = Tensu(50, 20, 70)
u = (Tensu(50, 20, 70), Tensu(60, 40, 80), Tensu(30, 80, 10))