製薬企業研究者がPythonの制御文についてまとめてみた

# はじめに

ここでは、Python初心者向けに「制御文」について解説していきます。
Python3系の使用を想定しています。


# 条件分岐

条件によって処理を分けたい場合に使います。

## if文

`if`に続く条件式が`True`なら、処理が実行されます。
`if 条件式:`と書いた次の行は、半角スペース4つ分インデントして書き始めます。

```python:if_1.py
x = 2
y = 2

if x == y:
    print('xとyは等しい。')
```

この例では、`x == y`は`True`となるので、`xとyは等しい。`と出力されます。

また、`else`を入れると、`if`に続く条件式の判定が`True`でなかった場合の処理を記述できます。

```python:if_2.py
x = 2
y = 3

if x == y:
    print('xとyは等しい。')
else:
    print('xとyは等しくない。')
```


さらに、`elif`を入れると、それより上の条件式の判定が全て`False`で、`elif`に続く条件式が`True`だったときの処理を記述できます（`elif`は`else if`の略です）。

```python:if_3.py
x = 2
y = 3

if x == y:
    print('xとyは等しい。')
elif x == 2:
    print('xとyは等しくないが、xは2である。')
else:
    print('xとyは等しくなく、xは2ではない。')
    
if x == 2 and x != y: # 条件式にandを使うこともできる。
    print('xは2であり、xとyは等しくない。')
elif x == y or y == 4: # 条件式にorを使うこともできる。
    print('xとyは等しい、またはyは4である。')
else:
    print('それ以外。')

if x == 2:
    if y == 3: # 入れ子にすることもできるが、この例の場合は可読性が下がるので、非推奨。
        print('xは2であり、yは3である。')
    elif x == y:
        print('xとyは2である。')
    else:
        print('xは2であり、yは2でも3でもない。')
elif x == 3:
    print('xは3である。')
else:
    print('xは2でも3でもない。')
```


ちなみに、Pythonにはswitch文はありません。


# 反復処理

同じ処理を複数回繰り返す時に使います。

## for文

一定回数だけ同じ処理を繰り返す時に使います。
`for 変数 in イテラブル:`と書いた次の行は、半角スペース4つ分インデントして書き始めます。

```python:for_1.py
nums = [1, 2, 3, 4, 5]

for num in nums:
    print(num)

for i, num in enumerate(nums):
    print(i, num)

for i in range(len(nums)): # あまり使われない。
    print(nums[i])


dict_human = {'身長': 200, '体重': 100, 'BMI': 25}

for key in dict_human.keys(): # 辞書のキーを取り出す。
    print(key)
    
for value in dict_human.values(): # 辞書の値を取り出す。
    print(value)
    
for key, value in dict_human.items(): # 辞書とキーの値の組み合わせを取り出す。
    print(key, value)


for _ in range(10): # forの後の変数を処理の記述で使わない（実行回数のみ指定したい）場合は、'_'でも可。
    print('実行しました。')
```


`break`を使うと、反復処理を中止することができます。`if`と組み合わせて、特定の条件が成立した時に処理を中止するといったときに使うことが多いです。

```python:for_2.py
nums = [1, 2, 3, 4, 5]
for num in nums:
    if num == 3:
        break # numが3になった時点で処理は中止する（2までしか出力されない）。
    print(num)
```

`continue`を使うと、反復処理をスキップすることができます。こちらも`if`と組み合わせて使うことが多いです。

```python:for_3.py
nums = [1, 2, 3, 4, 5]
for num in nums:
    if num == 3:
        continue # numが3のときだけ出力処理をしない（3以外が出力される）。
    print(num)
```


`else`を使うと、for分の処理が最後まで中断せずに行われた時の処理を記述することができます。

```python:for_4.py
nums = [1, 2, 3, 4, 5]

for num in nums:
    print(num)
else:
    print('反復処理が最後まで終わりました。')
```

上のスクリプトは以下のように書いても同じです。

```python:for_5.py
nums = [1, 2, 3, 4, 5]

for num in nums:
    print(num)
print('反復処理が最後まで終わりました。')
```

`for`文の`else`は意味ないんじゃないか、と思われるかもしれませんが、確かに上のスクリプトのような使い方ではあまり意味はありません。

ではどういう時に`else`が使えるかというと、`break`と組み合わせた時です。
`break`で処理が中断されずに最後まで`for`文の処理が行われた時の処理を記述することができます。

```python:for_6.py
nums = [1, 2, 3, 4, 5]

for num in nums:
    if num == 3:
        break
    print(num)
else:
    print('反復処理が最後まで終わりました。') # 出力されない。
    
for num in nums:
    if num == 10:
        break
    print(num)
else:
    print('処理が最後まで終わりました。') # 出力される。
```

上のスクリプトは、以下のようにフラグを使って書き換えることもできますが、`else`を使った方がシンプルになります。

```python:for_7.py
nums = [1, 2, 3, 4, 5]
break_flg = False # 反復処理が中断したかどうかを示すフラグを設定。

for num in nums:
    if num == 3:
        break_flg = True
        break
    print(num)
    
if break_flg == False:
    print('反復処理が最後まで終わりました。')

    
break_flg = False
    
for num in nums:
    if num == 10:
        break_flg = True
        break
    print(num)
    
if break_flg == False:
    print('反復処理が最後まで終わりました。')
```

`continue`でスキップした場合は、最後まで処理が行われたとみなされるので、`else`節が実行されます。

```python:for_8.py
nums = [1, 2, 3, 4, 5]

for num in nums:
    if num == 3:
        continue
    print(num)
else:
    print('反復処理が最後まで終わりました。')
    
for num in nums:
    if num == 5:
        continue
    print(num)
else:
    print('反復処理が最後まで終わりました。')
```



## while文

ある条件が成立する間のみ反復処理をする場合に使います。
`while 条件式:`と書いた次の行は、半角スペース4つ分インデントして書き始めます。

```python:while_1.py
num = 1

while num < 5:
    print(num)
    num += 1


num = 1

while num < 5:
    num += 1
    print(num)
```

`while`の中も上から下へ順番に処理が実行されるため、書き方によって実行結果が変わる場合があります。

変数の値の更新を書き忘れると、処理が無限回数繰り返される（無限ループとなる）ので注意が必要です。

```python:while_2.py
num = 1

# while num < 5:
    # print(num)
    
# while True:
    # print(num)
```


反復回数が決まっている場合は`for`を、反復回数が決まっていない場合は`while`を使うようにすると良いです。


# まとめ

ここでは、Pythonの制御文として、条件分岐の「if」、反復処理の「for」および「while」を紹介しました。
プログラミングの中心とも言える構文なので、実際に使いながら身につけていくと良いでしょう。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)