Python入門 - 制御構文

トップ > Python入門 > 制御構文

もし~ならば(if, else, elsif)

文法
if expression:
    suite...
[elif expr:
    suite...]
[else:
    suite...]

if は「もし」を意味します。式が真であれば、インデントされたブロックを実行します。下記の例では、num の値が 10より大きければ BIG を3回表示します。

if num > 10:
    print "BIG"
    print "BIG"
    print "BIG"

else は「さもなくば」を意味します。下記の例では、num が 10より大きければ BIG を、さもなくば SMALL を表示します。

if num > 10:
    print "BIG"
else:
    print "SMALL"

elif は「さもなくばもし」を意味します。下記の例では、num が 10より大きければ BIG を、10と等しければ NORMAL を、さもなくば SMALL を表示します。

if num > 10:
    print "BIG"
elif num == 10:
    print "NORMAL"
else:
    print "SMALL"

if文では、False、数値の 0 や 0.0、空文字("")、空リスト([])、空タプル(())、空辞書({})などを偽とみなし、それ以外を真とみなします。

~のあいだ(while, else)

文法
while expression:
    suite...
[else:
    suite...]

while は「~のあいだ」を意味します。下記の例では、i の値が 10よりも小さい間 i の値を表示します。

n = 0
while n < 10:
    print n
    n += 1

else がある場合は、ループの最後に else節を実行します。

n = 0
while n < 10:
    print n
    n += 1
else:
    print 'END'

~のあいだ(for, in)

文法
for var in expression:
    suite...
[else:
    suite...]

for はリスト、タプルの各要素、辞書のキー、文字列の各文字、ファイルの各行などに対して処理を繰り返します。

for n in [1, 2, 3]:
    print n                  #=> 1, 2, 3
for n in (1, 2, 3):
    print n                  #=> 1, 2, 3
for k in {'one': 1, 'two': 2, 'three': 3}:
    print k                  #=> one, two, three
for c in "123":
    print c                  #=> 1, 2, 3
for line in open("sample.txt"):
    print line               # 1行ずつ表示

処理を10回繰り返したい場合は range() を用います。

for n in range(10):
    print n

文字列に指定した場合は、それぞれの文字に対して実行します。

for c in u'あいうえお':
    print c                  # あ, い, う, え, お

else がある場合は、ループの最後に else節を実行します。

for n in [1, 2, 3]:
    print n
else:
    print 'END'

ループを抜ける(break)

break は最も内側の while, for などのループ処理を抜けます。下記の例では n が 5の時に forループを抜けます。

for n in range(10):
    if n == 5:
        break
    print n                  # 0, 1, 2, 3, 4

ループを繰り返す(continue)

continue は最も内側の while, for などのループ処理を繰り返します。下記の例では n が 5の時に forループの先頭に戻ります。

for n in range(10):
    if n == 5:
        continue
    print n                  # 0, 1, 2, 3, 4, 6, 7, 8, 9

例外処理(try, except, else, finally, raise)

文法
try:
    suite...
[except [expression]:
    suite...]
[else:
    suite...]
[finally:
    suite...]

try, except, else, finally は例外を扱います。

str = 'ABC'
try:
    c = str[5]                    # 5番目の文字が無いので、IndexError例外が発生します
except IOError:
    print 'IOError'               # IOError例外の場合、このブロックが実行されます
except IndexError:
    print 'IndexError'            # IndexError例外の場合、このブロックが実行されます
except:
    print 'Unknown'               # 上記以外の例外の場合、このブロックが実行されます
else:
    print 'Other'                 # 例外が発生しなかった場合、このブロックが実行されます
finally:
    print 'Finally'               # 常に、このブロックが実行されます

raise は例外を発生させます。下記の例は、直近に発生した例外を再発生させます。例外が発生していない場合は TypeError例外を発生させます。

try:
    ...
except:
    raise

下記の例は、SystemErrorクラスのインスタンスを生成し、これを引数に例外を発生させます。

try:
    raise SystemError('Error message')
except SystemError as e:
    print "SystemError"
    print e

下記の例は、'Error message' を引数に SystemError のコンストラクタを呼び出し、生成したインスタンスを引数に例外を発生させます。

try:
    raise SystemError, 'Error message'
except SystemError as e:
    print "SystemError"
    print e

下記の例では自作した例外に引数を与え、生成したインスタンスを引数に例外を発生させています。

class MyException(Exception):
    def __init__(self, file, lineno):
        self.file = file
        self.lineno = lineno

try:
    raise MyException("test.txt", 1163)
except MyException as e:
    print "MyException"
    print e.file
    print e.lineno

with構文(with)

文法
with expression [as target] [, expression [as target]]... :
    suite...

with を用いると、withブロックが終了した際に、オブジェクトの終了処理が自動的に呼ばれます。例えば、open() で返却される file オブジェクトは、終了処理として、close() が自動的に呼び出されます。下記の例で、with を用いた書き方では、withブロックが終了した際に f.close() が自動的に呼び出されます。

# withを用いない書き方
f = open("test.txt")
print f.read()
f.close()

# withを用いた書き方1
with open("test.txt") as f:
    print f.read()

# withを用いた書き方2
f = open("test.txt")
with f:
    print f.read()

アサーション文(assert)

assert はテストの際に値が期待通りに設定されているかを確認するための仕組みです。__debug__ が True の時のみ動作し、式を評価して偽であれば、AssertionError例外を発生させます。python を -O オプション付きで起動することで、__debug__ の値は False になります。

f = func()
assert f == 5              # f の値が期待通り 5になっていることを確認する

assert expression は、下記と等価です。

if __debug__:
    if not expression: raise AssertionError

assert expression1, expression2 は、下記と等価です。

if __debug__:
    if not expression1: raise AssertionError(expression2)

パス文(pass)

pass は何もしない文です。中身の無い関数やクラスを作成する際に使用されます。

def myfunc():
    pass

class MyClass:
    pass

デリート文(del)

del はオブジェクトを削除します。

x = 5
y = [1, 2, 3]
z = MyClass()
del x, y, z

print文(print)

print は変数やオブジェクトを標準出力に出力します。Python 3 では実装が変わっているので、ここでは、Python 2 の print文について説明します。

print 3                    #=> 3
print [1, 2, 3]            #=> [1, 2, 3]
print (1, 2, 3)            #=> (1, 2, 3)
print {'k1':10, 'k2':20}   #=> {'k2': 20, 'k1': 10}

引数をカンマ(,)で複数指定すると、ひとつのスペースで区切って複数の値を表示します。

print "AAA", "BBB"          #=> AAA BBB

通常は、最後に改行(\n)を書き出します。最後の引数の後ろにカンマ(,)をつけると、改行しません。

print "AAA",                # 改行しない
print "BBB"                 # 改行する

下記の様に、フォーマットを指定することもできます。

print "My name is %s." % "Tanaka"
print "%s is %d years old." % ("Tanaka", 28)
print "%(name)s is %(age)d years old." % {'name': "Tanaka", 'age': 28}

標準出力以外に出力するには、>> を用います。

f = open("test.txt", "w")
print >> f, "Hello world!"
f.close()

print文で複数の値を出力すると半角スペースで区切られますが、半角スペースを入れたくない場合は、sys.stdout.write() を使用します。

import sys
sys.stdout.write("Hello")
sys.stdout.write("World")

exec文(exec)

exec文(exec)は、引数の文字列を Python のスクリプトとして実行します。

文法
exec statements [as global [, local]]

サンプルを下記に示します。

exec "print 'Hello'"

globallocal には、グローバル変数、ローカル変数を辞書形式で渡します。ローカル変数を省略した場合は、global が両方に適用されます。

exec "print global_x, local_y" in {'global_x': 100}, {'local_y': 200}

statements にはオープンしたファイルや、コンパイルしたコードオブジェクトを渡すこともできます。

f = open("sample.py")
exec f

code = compile("print 'Hello'", "<string>", "exec");
exec code

Copyright(C) 2014 杜甫々
初版:2014年12月30日、最終更新:2014年12月30日
http://www.tohoho-web.com/python/control.html