IT

Pythonのコードの書き方の基本

いよいよ、Pythonでプログラムを書いていきたいと思います。ここでは以下の目次にそって説明していきます。

Pythonの記述の基本

ここではPythonのコードを書く際の基本的なルールなどを紹介します。

記述のルール

Pythonはシンプルで可読性の高いプログラミングであるため、いくつかルールがあります。

コードブロックはインデントをそろえる

Pythonには括弧やbegin-endなどの単語でコードブロックは区切りません。その代わり、インデントをそろえてコードブロックを明示する必要があります。慣習的にはスペース4つ分です。


x = 1
if (x==1):
    print('x=1')
else:
    print('other')

 

基本的には1コード1行で記述する

Pythonには行末にセミコロン(;)などを記載する必要はないため、基本的には1コード1行で書きます。しかし、複数行にまたがってコードを書く必要がある場合は以下のように「\」を記述することによってできます。

print('Hello \
World')

 

プライベート変数にはアンダースコアをつける

Pythonにはプライベート変数はありません。プライベートな変数を表すために、明示的に変数の前にアンダースコアをつける慣習になっています。


int _privatehensu

コメント

Pythonではコメントを「#」で書きます。「#」以降の文字列がコメント扱いとなります。


# コメントはここに書きます

また、日本語を使いたい場合はファイルの先頭に以下のコードを記載します。


# coding: utf-8

もしくは、


# coding=utf-8

この記述なしに日本語を書くとシンタックスエラーで実行できません。

変数

変数の定義は「変数名 = 値」と記述します。Pythonでは型の宣言をする必要はなく、異なる方を自由に入れることが可能です。


>>> x = 1
>>> x
1
>>> x ='a'
>>> x
'a'
>>>

演算子

Pythonで使う一般的な演算子は以下の通りです。

足し算 +
引き算
掛け算 *
割り算(※1) /
割り算(※2) //
剰余 %
べき乗 **
論理和 or
論理積 and
否定 not
ビット和 |
ビット積 &
排他的ビット和 ^
ビットシフト <<
ビット反転

※1:演算結果が浮動小数点となります。
※2:演算結果が整数となり、小数点以下は切り捨てです。

上記の演算子を使った演算結果は以下の通りです。


>>> 1+1
2
>>> 1-1
0
>>> 1*1
1
>>> 1/1
1
>>> 12%2
0
>>> 2**8
256
>>> True or False
True
>>> True and False
False
>>> not True
False
>>> 1|2
3
>>> 1&2
0
>>> 1^2
3
>>> 2<<6 128 >>> -3
-3
>>>

異なる型の計算は自動的に変換するため、考慮する必要がありません。例えば、整数と浮動小数の計算をする場合は、自動で整数を浮動小数に変換して演算をします。なお、明示的に「型名(対象)」で変換することは出来ます。

条件分岐(if文)

ここでは条件分岐のコードに関わることを紹介します。

if文

Pythonにも他のプログラミングと同様にif文があるので、それについて書き方を紹介します。

最初に注意したいのが、Pythonではコードブロックとしてインデントを合わせることになっています。そのため、同じコードブロックはインデントを合わせる必要があります。さらに、条件分岐のifなどのキーワードのあとには「:」を必ずつけます。キーワードは、ifとelifとelseがあります。特に一般的な「ELSE IF」をpythonでは「elif」と書くので注意しましょう。


x = 1
if (x==1):
    print('x=1')
elif(x==2):
    print('x=2')
else:
    print('other')

また、単一行として以下のように表記することも可能です。


x = 1
if (x==1):print('x=1')
elif(x==2):print('x=2')
else:print('other')

 

pass文

pass文は何もしない処理を表します。pythonでは、インデントした行は必ず何か処理をしなければならないという制約があります。そのため、何もしない処理をするということです。


x = 3
if (x==1):
    print('x=1')
elif(x==2):
    print('x=2')
else:
    pass

 

繰り返し文(for文とwhile文)

ここではPythonの繰り返し文について紹介します。

for文

for文は連続的にある処理を繰り返すために使います。pythonでは以下のように記述します。


i = 0
for i in range(5):
    print(i)

forの後に変数を書き、inの後に連続数を書きます。最後にif文と同様にキーワードの終わりに「:」を記述します。なお、ここではrange関数という括弧内の数値を0から順番にn-1だけ返す関数を使用しています。

結果は以下のようになります。


0
1
2
3
4

 

また、値と同時にカウントしたい場合にはよく『enumerate(イテレータ)』が使われます。これは、引数で指定したオブジェクトの値とそのカウントを同時に出力する関数です。そのため、出力された戻り値を受け取る変数が必要となります。以下のコードでは、iにカウント、enumに値を格納しています。


>>> a = ['java','VB','python']
>>> for i,enum in enumerate(a):
...     print('{0}:{1}'.format(i,enum))
...
0:java
1:VB
2:python

format関数を使って画面出力をしています。{n1}と「.format(n1,n2)」が対応します。

while文

while文もfor文と同様に連続的にとある処理を繰り返す文です。whileの後に継続条件(Trueとなる条件)を書き、文の最後には「:」を記述します。while文はTrueの間、ずっと繰り返し処理をするため、終了条件が必要です。終了条件を満たす場合にwhile文から出る必要があり、その時に使用するのが「break文」です。(while文の最も内側のみを抜けます。それ以上のwhile文を抜けるにはさらにbreak文が必要です。)


count = 0
while True:
    if count ==10 :
        print('count = 10')
        break
    else:
        count = count + 1

 

break文の他に、『continue文』があります。break文が「それ以降の処理をしないでループを脱する」のに対して、continue文は「それ以降の処理をしないでループの先頭に戻る」です。


>>> for i in range(5):
...     if i % 2:
...         continue
...     else:
...         print(i)
...
0
2
4

これは余剰の結果が「0」以外、すなわち奇数であればループの先頭に戻ります。「0」は「False」、「それ以外の数値」は「True」として認識されます。

 

その他に特殊なものとして「else節」があります。これは、ループ内でbreak文が実行されず、完遂した場合のみ処理をする節です。

>>> for i in range(5):
...     if i == 6:
...         break
...     else:
...         pass
... else:
...     print('No Break')
...
No Break

 

例外処理

プログラムでは予期しないエラーが発生し、システムがダウンすることがあります。例えば、割り算の計算時には数値を0で割るとエラーが発生します。こういった場合に、予めエラーが発生した場合の異常処理を行うことが重要となり、その際に使うのが例外処理です。以下に例外処理について説明します。

例外処理の基本(try~except文)

pythonの例外処理の書き方は以下の通りです。tryの中に例外が発生する処理を書き、例外が発生した場合の処理をexceptに書きます。それぞれのキーワードの後には「:」を書きます。


try:
    x = 1/0
except:
   print('Error!')

サンプルではexcept節は一つだけですが、複数記述することが可能です。

正常処理(else節)

例外が発生しなかった場合のみ、処理を行うelse節』があります。


#coding:utf-8

x = 1
try:
    x = 1/x
except ZeroDivisionError:
    print('数字を0で割らないでください')
else:
    print('正常に処理が行われました。結果は{0}です'.format(x))

結果は以下の通りです。
正常に処理が行われました。結果は1です

最後に必ず実行する処理(finally節)

例外処理が発生したかどうかに関わらずに最後に必ず実行する処理をするには『finally節』を使います。エラーの発生有無にかかわらず、ファイルをクローズする際に使ったりします。


#coding:utf-8

x = 0
try:
    x = 1/x
except ZeroDivisionError:
    print('数字を0で割らないでください')
else:
    print('正常に処理が行われました。結果は{0}です'.format(x))
finally:
    print('おわり')

結果は以下の通りです。
数字を0で割らないでください
おわり

例外を発生させる(raise文)

プログラムを書く上で、場合によっては例外を意図的に発生させる必要があります。その際は、『raise文』を使います。


#coding:utf-8

#分母
x = 0
#分子
y = 1
if x <= 0:
    raise ZeroDivisionError('分母に0を指定しないでください。')

結果は以下の通りです。
Traceback (most recent call last):
  File "test12101.py", line 8, in 
    raise ZeroDivisionError('分母に0を指定しないでください。')
ZeroDivisionError: 分母に0を指定しないでください。

例外の種類

ここではいくつか例外の種類をご紹介します。

Exception 例外の元となる例外
StopIteration イテレータを進めたものの値がなくなった場合の例外
IOError ファイル等のI/Oで発生するエラー
IndexError リストなどでインデックスを指定したが、範囲外だった場合の例外
ValueError 不当な値の場合に発生する例外

関数

ここでは関数の定義と呼び出し方について紹介します。関数は基本参照渡しのため、引数を使った関数内の処理は関数外でも値が変わります。

関数の定義(def 関数名(引数))

関数の定義をするには、『def 関数名(引数)』を使います。キーワードの最後には「:」が必要です。また、関数を呼び出すには『関数名(引数)』を指定します。

>>> def func(tar):
...     print(tar)
...
>>> func('Hello')
Hello

関数定義時の引数に『def 関数(tar = ‘default’)』と指定すると、関数呼び出し時に引数を指定しなかったときに呼び出される値となります。


>>> def func(tar = 'default'):
...     print(tar)
...
>>> func()
default

戻り値は『return』文を使います。このとき、複数の戻り値を返す場合は、下記コードのように「アンパック代入」を使うと便利です。


>>> def func(x,y):
...     return x[1]-x[0],y[1]-y[0]
>>> x,y = func((3,4),(1,2))
>>> print(x,y)
(1, 1)

引数に変更可能オブジェクトを指定する

引数を可変長とする場合は、シーケンス型か辞書かで記述方法が異なります。

シーケンス型の場合

シーケンス型の場合は、『def 関数(*引数)』を使います。


>>> def func(*tar):
...     print(' '.join(tar))
...
>>> func('a','b')
a b
辞書の場合

辞書の場合は、『def 関数(**引数)』を使います。


>>> def func(**tar):
...     if tar.get('name') == 'Jhon':
...         print('Jhon')
...
>>> func(**{'name':'Jhon'})
Jhon

デコレーター

デコレータとは関数を修飾して新たな関数を作り出す仕組みです。主に複数の関数に共通する補助機能を書くときに便利です。主な用途は関数の処理時間計測や引数の型チェック、共通するアクセス制御や初期化・後処理に使われます。文法は『@デコレーター名(引数)』を使います。

デコレーターに引数を指定しない場合

サンプルを以下に挙げます。ここには、値を1加算して画面出力するdecorate関数(修飾する関数)と値1を出力するfunc関数(修飾される関数)があります。func関数を@decoretateすることによって1+1の処理がされ、2を画面出力する結果になります。


def decorate(f):
    def new_func(*args,**kwads):
        result = f(*args,**kwads)
        print(result + 1)
    return new_func

@decorate
def func():
    return 1

func()

処理の流れ
1. 最終行でfunc関数を呼び出す
2. そのfunc関数がデコレーターによってdecorate関数の引数に渡される
3. decorate関数内で処理される

デコレーター関数内で定義した関数の戻り値は必ず記述してください。

デコレーターに引数を指定する場合

デコレーター関数に引数を指定する場合のサンプルを以下に挙げました。ここには、画面に関数の引数に指定した値分を乗算して画面出力するdecorate関数と値1を返すfunc関数があります。func関数を@decorateにすることによって1*3の処理がされ、画面に3が出力されます。


def decorate(x):
    def _decorate(f):
        def new_func(*args,**kwads):
            result = f(*args,**kwads)
            print(result * x)
        return new_func
    return _decorate

@decorate(3)
def func():
    return 1

func()

処理の流れ
1. 最終行でfunc関数を呼び出す
2. decorate関数に引数が渡される
2. func関数がデコレーターによって_decorate関数の引数に渡される
3. decorate関数内で処理される

デコレーター関数に引数を指定するともう一つ関数定義が増えます。(_decorate関数)また、デコレーター関数に引数を指定しない場合と同様に戻り値は必ず指定してください。

参考までに関数の処理時間を計測するコードを書きます。


def gettime(f):
    import time
    def new_f(*args,**kwads):
        t = time.time()
        result = f(*args,**kwads)
        print('{0}:{1}'.format(f.func_name,time.time() - t))
    return new_f

@gettime
def func():
    for i in range(1000):
        pass

func()

関数内外の変数の扱い方(global 変数名)

変数には関数外でも使えるグローバル変数と関数内でしか使えないローカル変数があります。関数外からローカル変数を操作することはできませんが、関数内からグローバル変数を操作することは可能です。その際は、関数内でグローバル変数を明示的に指定する必要があり、『global 変数名』を指定します。


x = 0
print(x)
def func():
    global x
    x= 1
func()
print(x)

結果
0
1

クラス

クラスとは、オブジェクト指向型プログラミングで使用される概念で、あるまとまった種類・意味をもつかたまりを1クラスとして定義します。ここではPythonにおけるクラスに関わる文法について説明します。

クラス定義(class クラス名(継承元クラス))

クラス定義は、『class クラス名(継承元クラス)』で記述します。全てのクラスはobjectクラスを継承元としているため、基本的にはobjectを指定します。キーワードのあとに「:」をつけることを忘れないように注意してください。


class Test(object):
    pass

 

インスタンス(インスタンス名 = クラス名())

定義したクラスを使うためには、インスタンスを生成する必要があります。それには、『インスタンス名 = クラス名()』を記述します。生成したインスタンスごとに属性が持つ情報は分かれます。例えば、クラスTestからtest1とtest2の2つのインスタンスを生成した場合、test1の属性を変更してもtest2には影響はありません。ただし、クラスTestの属性を変更すると全てのインスタンスの属性に影響があります。


class Test(object):
    pass

test = Test()

 

メソッド(def メソッド名(self,変数1,変数2・・・))

メソッドとは、クラス内で定義した関数の事です。クラス内で『def メソッド名(self,変数1,変数2・・・):』と記述します。selfは省略することは出来ません。
アクセスするには、『インスタンス名.属性』を使います。


class Test(object):
    def plus1(self,var):   ・・・①
        self.var = var + 1  ・・・②

test = Test()         ・・・③
test.plus1(2)         ・・・④
print(test.var)        ・・・⑤

簡単に解説をします。①では引数varに指定した値に1を加算するメソッドを定義しています。②で値を1加算し、自身のインスタンスのvar属性に結果を格納します。ここまでがメソッド定義内容です。そして、③でインスタンスを作成し、④でインスタンス内のメソッドを呼び出し、⑤で値を参照しています。

コンストラクタ(def __init__(self,引数1,引数2,・・・))

メソッドの中でも特殊なものとしてコンストラクタがあります。これは、インスタンスを生成したときに必ず実行される関数の事で、いわば初期処理を行うメソッドです。定義は、『def __init__(self,引数1,引数2,・・・)』を使います。


class Test(object):
    def __init__(self,var):
        self.var = var

test = Test(1)
print(test.var)

 

プロパティ(プロパティ名 = property(getメソッド名,setメソッド名))

プロパティとはgetterとsetterを使ってデータを扱う概念です。pythonでは『プロパティ名 = property(getメソッド名,setメソッド名)』を使います。


class Test():
    def getvar(self):
        return self.var
    def setvar(self,var):
        self.var = var
    value = property(getvar,setvar)    ←プロパティを設定

test = Test() 
test.value = 1               ←varに1を格納
print(test.value)             ←varの1を出力

継承

クラスはあるクラスを親クラスとして属性を継承してあらたなクラスを定義することができます。親クラスは一つだけでなく、複数のクラスを継承することもできます。


class Test1(object):
    def __init__(self.var):
        self.var = var
    def func(self,var):
       self.var = self.var + var
       
class Test2(Test1):
    def func(self,var):
        self.var = self.var * var

test2 = Test2(2)
test2.func(3)
print(test2.var)

モジュール

プログラムを書いていくうちにだんだんソースコードが膨大になっていく場合があります。その場合は、プログラム内のクラスや関数を同じ意味合いでまとめることがあります。そのやってまとめたものをモジュールといいます。このモジュールは自作することも出来ますし、既に用意された標準モジュールを使うことも出来ます。ここではモジュールの使い方にについて説明します。

標準モジュールの読み込み

標準モジュールを読み込むには『import文』を使います。


import copy

自作モジュールの読み込み

自作モジュールを読み込みときも『import文』を使います。しかし、予めモジュールのパスを通す人用があります。


test1213.pyというモジュールを例に以降説明します。
class Test(object):
    def __init__(self):
        pass
    def ten(self):
        print(10)
モジュールのパスを通す(sys.path.append(フォルダパス))

モジュールを自作した直後は、モジュールがどのフォルダ内のなんのファイルかがシステム上分かりません。そのため、モジュールの格納パスを一管理している、『sysモジュール』の『sys.path』にモジュールの格納されているフォルダを追加する必要があります。その際には、『sys.path.append(フォルダパス)』を使います。


>>> import sys
>>> sys.path.append('/home/work/Python')
モジュール名を省略する(from モジュール名 import *)

先述したインポート文では、モジュール内の関数等を利用する際には、test1213.tenのようにモジュール名を付ける必要があります。いちいちつけるのも煩わしい場合は、『from モジュール名 import *』を使います。


>>> from test1213 import *
>>> test = Test()
>>> test.ten()
10

まとめ

pythonの書き方のきほん

・コードは基本的に1コード1行
・コードブロックの代わりにインデントをそろえる
・演算子は他のプログラミング言語と大体同じ
・キーワード文の行末には「:」をつける

お薦め書籍

Pythonに限らず、プログラミング書籍ではメジャーな独習シリーズ。最初の一冊目におススメです。