Pythonの複合文
Publish date: 2021-03-02
Last updated: 2021-03-02
Last updated: 2021-03-02
Pythonのif 、while 、forといった複合文 (compound statement)について説明します。
if elif else文
if x < 0:
print('x is less than zero')
elif x == 0:
print('x is zero')
else:
print('x is greater than zero')
for for-else文
for文はリスト等のシークエンス型の繰り返しを行う。
numbers = ['one', 'two', 'theree']
for number in numbers:
print(number)
#=> one two three
特定回数、あるいは、数列を元にした繰り返しは、range()
関数を使って行える。使い方は以下の通り。
range(終了する数値)
0から終了する数値-1までの整数を出力するrange(開始数値, 終了する数値)
開始数値から終了する数値-1までの整数を出力するrange(開始数値, 終了する数値, ステップ)
開始数値から終了する数値-1までの整数をステップ数刻みで出力する
for i in range(5):
print(i)
#=> 0 1 2 3 4
for i in range(2, 12):
print(i)
#=> 2 3 4 5 6 7 8 9 10 11
for i in range(2, 12, 4):
print(i)
#=> 2 6 10
for-else文でループ終了時の処理を記述できます。
numbers = ['one', 'two', 'theree']
for i in range(len(numbers)):
print(i, numbers[i])
else:
print(3, 'last')
#=> 0 one 1 two 2 theree 3 last
リストをインデックスで回すには以下のようにする。
numbers = ['one', 'two', 'theree']
for i in range(len(numbers)):
print(i, numbers[i])
#=> 0 one 1 two 2 theree
while while-else文
x = 3
while 0 < x:
print(x)
x = x - 1
#=> 3 2 1
while-else文でループ終了時の処理を記述できます。
x = 3
while 0 < x:
print(x)
x = x - 1
else :
print(0)
#=> 3 2 1 0
try-finally, try-except-else-finally文
例外処理はtryで行える。例外発生時は、一致したexcept節が実行される。 elseは例外が発生しなかった場合に実行される。
finallyは常に最後に処理が行われる。
try:
number = 10 / 0
#""/ 2
except ZeroDivisionError as e:
print(e)
except TypeError as e :
print(e)
except Exception as e:
print(e)
else:
print("else")
finally:
print("finally")
with文
ブロックの実行の開始と終了で定義された処理を自動で行う事ができる構文です。
例えば、ファイルの読み書きやDBへの接続を行った場合、終了のメソッドを呼び出す必要があります。
filereader = open("sample.txt", "r")
print(filereader.read())
filereader.close()
例外を考慮するなら、これをtry-finally文で記載しなければなりません。 with文を使うと同じようなことをシンプルに表現できます。
with open("sample.txt", "r") as filereader:
print(filereader.read())
with文の開始時に__enter__()
、終了または例外発生時に__exit__()
メソッドが呼ばれるようになっています。
class WithSample:
def __init__(self):
print("init")
def read(self):
print("read")
return "......"
def __enter__(self):
print("enter")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("exit")
print(exc_type, exc_value, traceback)
return True
def create():
return WithSample()
with WithSample() as ws:
print("with begin")
print(1/0)
print(ws.read())
print("with end")
# =>
# init
# enter
# with begin
# exit
# <class 'ZeroDivisionError'> division by zero <traceback object at 0x00000217B6C31E48>
withの処理は以下と同じです。 (c.f. the-with-statement)
manager = WithSample()
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False
try:
TARGET = value
print("with begin")
print(1/0)
print(TARGET.read())
print("with end")
except:
hit_except = True
if not exit(manager, *sys.exc_info()):
raise
finally:
if not hit_except:
exit(manager, None, None, None)
withは複数要素の指定が可能です。
with A() as a, B() as b:
pass