100日後にエンジニアになるキミ - 29日目 - Python - Python言語の基礎5

今回もPythonの基礎の続きになります。

前回はこちら
[100日後にエンジニアになるキミ - 28日目 - Python - Python言語の基礎4]
(https://qiita.com/otupy/items/f9324f682df276b44ed3)

# 制御文

前回の講義まではpythonの基本的なデータ型や
演算子の使い方などをお伝えしてきました。

pythonでは条件分岐や繰り返しなど
プログラムを制御するための文法が存在します。

それを制御文と呼んでいます。

制御文はプログラミングを行う上で
欠かせないもので
あらゆるところで出てきます。

書き方、使い方を押さえておきましょう。

## if文

[![表示されなかったらすみません](https://img.youtube.com/vi/Th9n_fOJDjA/0.jpg)](https://youtu.be/Th9n_fOJDjA)

if文は条件分岐を行うための構文です。

**if文の書き方**

```python
if 条件:
    処理
```

```python
if 条件:
    処理
else:
    処理
```

```python
if 条件:
    処理
elif 条件 :
    処理
    ・・・
```

まずはIF単独の場合

条件を書いて`:`セミコロンを末尾に書きます。

```python
# if文で条件に合致した場合printする
if 1<2:
    print('1より２の方がおっきい')
```
1より２の方がおっきい


その条件に合致した場合にだけif文の中の処理が実行できます。

なお注意として制御文を使う場合、処理を書くブロックは
`インデント(字下げ)`といって空白４つ分ずらしてあげないといけません。
また空白４つはタブボタンでも代用可能です。

```python
if 1<2:
print('1より２の方がおっきい')
```
IndentationError: expected an indented block

`インデント`を行わないとエラーになります。

```python
# 条件はTrue or False
hh = 8
if hh== 8:
    print(hh)
```
8


if文では条件は `bool型`、`真偽値`になるものを採用できます。

次に条件に合致しなかった場合は
if文のあとに `else:` と書いて
条件に合致しない場合の分岐処理も書くことができます。

```python
hh = 7
if hh== 8:
    print('{}時だよ、全員集合'.format(hh))
else:
    # 条件に合致しなければこちらが実行される。
    print('{}時だよ、全員解散'.format(hh))
```
7時だよ、全員解散


条件が複数ある場合
`elif 条件:`で条件を増やすことができます。

```python
hh = 9
if hh== 8:
    print('{}時だよ、全員集合'.format(hh))
elif hh==9:
    # 条件に合致すれば実行される。
    print('{}時だよ、全員遅刻'.format(hh))
else:
    # 条件に合致しなければこちらが実行される。
    print('{}時だよ、全員解散'.format(hh))
```
9時だよ、全員遅刻


if文では条件が合致したところだけ実行されます。
条件を分岐させたい時にだけ`else`や`elif`を使えば良いです。


条件が複数にまたがる場合
`ネスト`と言って、if文の階層を作ることができます。
その場合、if文の階層の分だけ`インデント`を行います。

```python
aa = 2
bb = 50
if aa == 2:
    if bb == 50:
        print('江頭{0}時{1}分'.format(aa,bb))
    else:
            print('江頭{0}時'.format(aa))
else:
        print('江頭')
```
江頭2時50分


`インデント`の位置で処理が変わってしまうので注意しましょう。

ネストを使うことでどんな条件でも
書き分けることができるようになります。

ただし、あまりネストを使いすぎると
わけわからなくなってきます。みるのも大変です。

あまり深い階層になってしまった場合は
そもそもの処理や条件などを見直した方が良いと思います。

またif文では何かしら処理を書かないとエラーになってしまいます。

```python
if 1<2:
```
SyntaxError: unexpected EOF while parsing

特に処理を思いつかない場合はとりあえず `pass`というのを書きます。

```python
if 1<2:
    pass
```

`pass`は何もしない処理を現します。
制御文だけを書いて、処理を書かずに実行すると
エラーになるので回避のために使えます。

pythonでは`インデント`で処理するブロックが変わってきます。

なのでif文の中の処理なのか、その前の処理になるのかで
全体の処理が大きく変わってくることがありますので
どういう処理をさせるのかを考えて`インデント`をしてください。



## for文

[![表示されなかったらすみません](https://img.youtube.com/vi/fhT7NukcNVo/0.jpg)](https://youtu.be/fhT7NukcNVo)



pythonで処理を`繰り返し`行う場合は `for`を使っていきます。

**forの書き方**

```python
for 任意の変数名 in イテラブルオブジェクト:
    処理
```

**イテラブルオブジェクトとは？**

`イテラブルオブジェクト`とは、繰り返しができるオジェクト
要は複数要素をもつオブジェクトの事のことです。

例えば変数に`文字列`を格納すると

```python
aaaa = 'abcde12345'
print(aaaa)
```
abcde12345

これは文字列の`オブジェクト`になります。

オブジェクト指向では`データ`を`オブジェクト`として扱うので
データを格納した`⁠変数`もまた`オブジェクト`と同じものだと言えます。

では`イテラブルオブジェクト`ってなんでしょうか？
これは繰り返しができるという意味で、
`複数要素をもつオブジェクト`のことになります。

要は`リスト型`や`辞書型`や`文字列型`のようなデータ構造のオブジェクトとなり
Python言語ではこのオブジェクトを用いて繰り返しを行います。

**簡単なfor文の例**

```python
# 5回繰り返し処理を行う
for i in [1,2,3,4,5]:
    print(i)
```
1
2
3
4
5

これが一番シンプルな繰り返しです。
`for`文の中の繰り返される処理の部分は`インデント(字下げ)`をしてください。

繰り返し行う回数というのが`in`のあとに書いた
`イテラブルオブジェクト`の要素数分だけ行われます。

`for`の後に書いた`i`という変数は
繰り返しの中で使うことのできる変数になります。

それぞれ1回目はこのリストの１つ目がこの`i`に代入される
2回目は2つ目・・・
という仕組みになっているので
このリストの要素数分だけ処理が実行されるという仕組みです。

リストは変数に代入しておいても同じように動きます。

```python
# リスト型の変数に6つの要素を格納する
sample_list =[ 1,2,3,4,5,6]

# 6回繰り返し処理を行う
for i in sample_list:
    print(i)
```
1
2
3
4
5
6

**回数を指定したい場合**

`range()`関数で回数分の値を生成する。

`for`に使用する回数部分は`イテラブルオブジェクト`でなければならないため
代わりに`range()`関数でオブジェクトを生成して代用をします。

`range()`関数では指定した個数のオブジェクトを作成できるので
for文の回数指定に代用できるという仕組みです。

**range関数の書き方**

`range(整数値)`
`range(開始,終了)`
`range(開始,終了,間隔)`

`range()`関数は引数に指定した整数値の分だけ
数値を生成してくれます。

引数を追加すると開始、終了の数値、間隔を調整する事もできます。

```python
# 10個の数値を持ったオブジェクトを生成
print(range(10))
```
range(0, 10)

`range関数`の結果は`range型`になります。
ただしこれは`リスト型`ではないので分かりづらいです。
`リスト型`に変換してみましょう。

```python
print(list(range(10)))
```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

これで`リスト型`になり中身がわかりやすくなります。

`range()`関数では0から始まって引数分だけ整数値を生成しますが
注意点としては0から始まるので終わりは指定した値にならないので注意してください。
指定した値 `-1`　になっています。

```python
for i in range(3):
    print(i)
```
0
1
2

```python
# range関数で4回だけ実行する場合
for i in range(4):
    print(i)
```
0
1
2
3


開始終了を指定する場合、第一引数から始まって、第二引数まで、となります。
この場合は`５`から`10`の１つ手前までの値を生成します。

```python
# 5から9まで
for i in range(5,10):
    print(i)
```
5
6
7
8
9

第三引数を指定すると、どれだけ加算するかを決められます。
マイナスを指定すると、引いていくこともできます。

```python
# 2から10手前までの偶数
for i in range(2,10,2):
    print(i)
```
2
4
6
8

```python
# 20から10手前までの3個飛ばしで
for i in range(20,10,-3):
    print(i)
```
20
17
14
11

**文字列での繰り返し**

繰り返しは基本、なんらかのオブジェクトを用いてその要素数だけ実行するか
`range()`関数を使って指定した回数だけ実行するか
ということになります。

文字列を指定すると、その文字数分だけ実行されます。

```python
# 文字列型の文字数だけ実行する場合
for i in 'apple':
    print(i)
```
a
p
p
l
e


**繰り返しの途中で抜ける場合(break)**

for文の中で処理を抜けたい場合は`break`を用います。
breakが実行されるとfor文のブロックを抜けることになります。

```python
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!BREAK!!')
        # ここで抜ける
        break
    # 2回目の処理は行われない
    print(name)
```
Alice
!!BREAK!!

この場合は繰り返しの２回目でif文の条件に引っかかり、
その中のプリント文と`break`が実行されます。

そうなると途中で抜けた場合は、抜けた後以降の処理は行われません。
結果として２回目のプリントの前に抜けた、ということになります。

for文でも`else`が使用できます。
`else`の部分は一番最後に実行されます。

```python
for i in  ['Alice', 'in', 'Chains']:
    print(i)
else:
    # for文の後に実行される
    print('処理終了')
```
Alice
in
Chains
処理終了


breakによって途中絵終了した場合には
`else`の処理は実行されません。

```python
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!BREAK!!')
        break
    print(name)
else:
    # break後は実行されない
    print('!!FINISH!!')
```
Alice
!!BREAK!!

**処理の途中で処理を飛ばす場合(continue)**

`break`は完全に処理を抜けてしまいますが
処理の一部だけを飛ばして、まだ処理を続けたい時は
`continue`を使います。

```python
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!continue!!')
        # ここで処理を飛ばす
        continue
    # continue後は実行されない
    print(name)
else:
    # 最後に実行される
    print('!!FINISH!!')
```
Alice
!!continue!!
Chains
!!FINISH!!

for文はプログラムの中でも高頻度で使われるもので
プログラムでは必須です。

どう処理を組み立てれば良いかを考えながら
for文を用いていきます。

特に２回以上行うような複雑な処理を2回以上書くよりは
for文１回で済ませてしまう方が楽になるので
使い方なども研究してみてください。




## while文

[![表示されなかったらすみません](https://img.youtube.com/vi/EwVHf3nVVWE/0.jpg)](https://youtu.be/EwVHf3nVVWE)

制御文の最後は while文です。

for文では繰り返しの回数が決まっていましたが
whileでは条件を満たすまで繰り返し続けます。

whileの書き方

```python
while 条件 :
    処理
```
処理を書くところは`インデント(字下げ)`が必要になります。


```python
while True:
```
しかしこう書いてしまうと、繰り返しがずっと行われてしまい
いつまでたっても終わりません。

jupyter notebook上で止めたい場合は
画面上部の`四角ボタン(停止)`を押して止めてください。

while文は条件を抜けるような処理を書いてあげないと
永久ループになってしまうので、注意が必要です。

while文の例：

```python
sample_int =1 
while sample_int <= 10:
    print(sample_int)
    sample_int = sample_int  + 1
```
1
2
3
4
5
6
7
8
9
10


このようにして、変数などを条件に用いてwhile文の中で
変数を条件に合致しないように変更すると
whileの繰り返しを抜けることができます。

あらかじめカウント用の変数を用意したり、
フラグ値を用いたりすることで`while文`を抜けるのが
一般的な使い方になります。

forと同じように`continue`や`break`も使えます。

```python
i=0
while i<5:
    if i ==2:
        i+=1
        continue
    print(i)
    i+=1
```
0
1
3
4

```python
i=0
while i<5:
    if i ==2:
        break
    print(i)
    i+=1
```
0
1


`continue`は条件が満たされ続ける限りは
繰り返しが実行され続けるので注意しましょう。



## まとめ


条件分岐や繰り返しなどの制御文は
プログラミングではどの言語でも存在する重要な部分です。

文法を把握して、正しくプログラムが実行されるように
コードが書けるようになりましょう。


君がエンジニアになるまであと71日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython