2021-03-10に投稿

Pythonの複合文

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")

# =&gt;
# init
# enter
# with begin
# exit
# &lt;class 'ZeroDivisionError'&gt; division by zero &lt;traceback object at 0x00000217B6C31E48&gt;

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
Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント