Pythonの基礎

目次

1  書き方の基本

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 となる。

一般に、変数は型を付けずに利用する。変数にはいろいろな型のオブジェクトを代入できる。

2  リストとタプル

素の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, 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 となる。

3  表示

print関数を使う。複数のパラメータを指定してまとめて表示できる。

print( 値1, 値2, 値3, ... )

複数パラメータは sep (デフォルトは空白) で指定される文字列で区切られる。
区切りを入れないときは sep='' とする。

print( 値1, 値2, ..., sep='')

出力の最後に end (デフォルトは '\n') で指定される文字列が出力される。すなわち、デフォルトでは出力の後改行される。
最後に改行を入れないときは end='' とする。

print( 値1, ..., end='')

3.1 書式付出力

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桁で表示される

4  条件分岐

if 条件式1:
    処理1
elif 条件式2:
    処理2
else:
    処理z

「条件式1」が成り立つとき「処理1」を、そうでなくて「条件式2」が成り立つとき「処理2」を実行する。「条件式1」も「条件式2」も成り立たないときは「処理z」を実行する。
elifelse はなくてもよい

(例) c は上で定義した変数とする。
if c == 2:
    print("abcd")
elif c == 5:
    print("wxyz")
else:
    print("1234")
c は 9 なので、if および elif のチェックが成り立たず、1234 が改行付きで表示される。

4.1 真偽値の扱い

真を表す定数として True、偽を表す定数として False が用意されている。なお、数値として扱う場合は True は 1、False は 0 として扱われる。

Pythonでは、下表にあるものは偽とみなされる。

Pythonで偽とみなされるもの
False
None (何も存在しないことを表す)
整数 0
浮動小数点 0.0-0.0
複素数 0j または complex(0.0,-0.0)
空の文字列 '' または ""
空のリスト []
空のタプル ()
空のrangeオブジェクト range(0)
空の辞書 {}
空の集合 set()

上表にないものは、独自に真偽を定義されたオブジェクトを除き、真とみなされる。

4.2 論理演算子

論理式を組み合わせて複雑な条件を表すとき、C言語等では

&&論理積
||論理和
!論理否定

という記号(列)を演算子として使用するが、Pythonでは英単語をそのまま演算子として使って

and論理積A, B を論理式として A and B の形で使用
or論理和A, B を論理式として A or B の形で使用
not論理否定A を論理式として not A の形で使用

となる。

5  連番の生成

Python 3では、range関数 (正確には、range型オブジェクトのコンストラクタ) で連番を生成するオブジェクトを作ることができる。

※【注意】リストを返すわけではないので、リストが欲しい場合はrange型オブジェクトに対し list 関数を使って変換する必要がある。
Python 2 では、range 関数は連番のリストを返す。他に、連番を生成するオブジェクトを得る xrange 関数が用意されていた。

range(上限値) の形で、0 から「上限値」未満の連番を生成する。

range(10)
0, 1, 2, ..., 9 が順に生成される。

range(初期値, 上限値) の形で、「初期値」から「上限値」未満の連番を生成する。

range(2, 5)
2, 3, 4 が順に生成される。

range(初期値, 上限値または下限値, ステップ) の形で、「初期値」から、「ステップ」ずつ値を変化させ、「上限値」未満または「下限値」+ 1 以上の連番を生成する。

range(3, 12, 3)
3, 6, 9 が順に生成される。
range(10, 1, -3)
10, 7, 4 が順に生成される。

6  繰り返し

while  条件式:
    処理
    ...

「条件」が成り立っている間、繰り返し「処理」を実行する

(例) コラッツ数列の一例
n = 3
print( 'n =', n )
while n != 1:
    if n % 2 == 0:
        n //= 2
    else:
        n = 3 * n + 1
    print( n )
順に n = 3, 10, 5, 16, 8, 4, 2, 1 が改行付きで表示される。なお、// は商の整数部分を求める除算の演算子で、//= はその累算代入演算子である。
for 変数 in イテラブルオブジェクト(リストや連番など):
    処理
    ...

リスト、タプルや連番などのイテラブルオブジェクトから要素を順に「変数」として取り出し、繰り返し「処理」を実行する。
for で使われた変数は for の繰り返し処理が終わった外部においても有効であることに注意する。

(例1) 要素で繰り返し。y は上で定義したタプルとする。
for i in y:
    print( i*10 )
タプル y の要素 1, 4, 16, 64 が順に変数 i に入って繰り返され、順に 10, 40, 160, 640 が改行付きで表示される。

(例2) enumerate関数を使って、ループ変数と要素で繰り返し
for i, p in enumerate(y):
    print( '2**', 2*i, ' = ', p, sep='' )
enumerate関数で使われるループ変数は、0 で始まり繰り返しごとに 1 ずつ増加していく。すなわち、ループ変数はリストやタプルの要素のインデックスを表している。なお、enumerate関数の第二パラメータ (start) で開始値を指定すると、ループ変数は指定された開始値から始まり 1 ずつ増加していく。
上記コードでは、タプル y に対して、0, 1, 2, 3 が順にループ変数 i に、要素 1, 4, 16, 64 が順に変数 p に入って繰り返され、以下のように表示される。
2**0 = 1
2**2 = 4
2**4 = 16
2**6 = 64

(例3) reversed関数で、要素を逆順に取り出し繰り返し
for e in reversed(x):
    print( e )
reversed関数は、シーケンス (リスト、タプル、string、rangeなど) をパラメータとして受け取り、要素を逆順に取り出すイテレータを返す。
上記コードでは、x は 先の例で使用した [9, 1, 3, 8, 7, 6, 4, 5, 2] なので、逆順に変数 e に取り出され、以下のように表示される。
2
5
4
6
7
8
3
1
9

Pythonには、スライス (slice) という、シーケンス (リスト、タプル、string、rangeなど) から新しいシーケンスを生成する機能がある。元のリストから [::-1] というスライスを取りだすと逆順のシーケンスが生成できるので、上の for の行は下のように記述することもできる。

for e in x[::-1]:

(例4) sorted関数で、要素をソートして取り出し繰り返し
for e in sorted(x, reverse=True):
    print( e )
sorted関数は、イテラブルをパラメータとして受け取り、要素がソートされたリストを返す。数値データの場合は昇順ソート、文字列データの場合はアルファベット順のソートとなる。ただし、reverseオプションを True で指定すると逆順のソートをさせることができる。
上記コードでは、x は 先の例で使用した [9, 1, 3, 8, 7, 6, 4, 5, 2] なので、降順にソートされた順序で変数 e に取り出され、以下のように表示される。
9
8
7
6
5
4
3
2
1
(例5) 連番による繰り返し
for i in range(5, 11):
    if i % 2 > 0:
        print( i )
連番は 5, 6, 7, 8, 9, 10 で繰り返されるが、条件付きの実行により、順に 5, 7, 9 が改行付きで表示される。

7  関数

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))
最初の calc 関数の呼び出しの結果を代入することで、変数 a が 125 になり、改行付きで表示される。
次の例では、関数呼び出しをして帰ってきた値を直接表示しており、49 が改行付きで表示される。

8  クラスの使い方

8.1 クラスの定義

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_

8.2 クラスのインスタンス生成

クラスのインスタンスは、クラスを関数のように呼び出すことによって生成する。その際、初期化用メソッド __init__ の self 以外のパラメータを指定する。

上記例の Tensu クラスでは、初期化用メソッドの self 以外のパラメータとして eigo, kokugo, sugaku の3つがあるので、インスタンス化では、例えば、
    t = Tensu(50, 20, 70)
のようにして Tensu クラスのインスタンスを生成し変数 t にセットすることができる。
また、
    u = (Tensu(50, 20, 70), Tensu(60, 40, 80), Tensu(30, 80, 10))
とすれば、Tensu クラスのインスタンスの入ったタプルを変数 u にセットすることができる。

9  メインの書き方

ソースファイルのトップレベル (関数やクラスの外) で、以下のコードで、メインモジュールのときだけ実行させる。


if __name__ == '__main__':
    コード
    ...