# 初心者向けPython3勉強会:拡張スライス操作・制御フロー文
### 諸注意
* [前稿参照](https://hackmd.io/@-OC2goorRSOqnXW7jFqBQw/HJrwJX2gB)
## はじめに
# コンテナオブジェクト
前稿ではコンテナオブジェクトについて以下のような説明をしました
> `str`,`list`,`tuple`,`dict`は、**コンテナオブジェクト**と呼ばれ、複数のオブジェクトをまとめることができます
> Javaでいう配列やリストがこれにあたります。ただし、Javaの配列と違い、**動的確保**をすることができます
> `list`は`[]`、`tuple`は`()`、`dict`は`{}`、でそれぞれ定義できます
> > **動的確保** :配列などを宣言する際に、変数などを用いて宣言する方法です
> > 変数の値に応じて配列の大きさを設定できます
本稿では上記で説明されている動的確保に加え、**拡張スライス操作**、**制御フロー文**について説明をしていきます
<br>
## 拡張スライス操作
前稿でスライス操作について説明しましたが、それを復習しつつ拡張スライス操作について学んでいきましょう
まずおさらいです
> list型である`line`という変数に対し、`line[i:j]`と書くと`line`の`i`番目から`j-1`番目の要素を取り出すことができます
拡張スライス操作ではこれに加え、ステップ数を設定できます
変数が増えてきて`i`や`j`ではわかりづらいので、`i`を`start`,`j`を`goal`,ステップ数を`step`とします
先ほどの説明を拡張スライス操作を加味して言い換えると、
**list型である`line`という変数に対し`line[start:goal:step]`と書くと
`line`の`start`番目から`goal-1`番目の要素を`step-1`段飛ばしで取り出すことができます**
このようになります。ちょっと何言ってるのかよくわかんない
手を動かしましょう!
```python
line = list(range(10))
print(line[1:8])
# > [1,2,3,4,5,6,7]
print(line[1:8:2])
# > [1,3,5,7]
print(line[1:8:3])
# > [1,4,7]
```
`step`を定義することによって、listの値が飛び飛びになっていますよね
ちなみに、`start`も`goal`も`step`も省略することができます
省略した場合、それぞれ`0`,`-1`,`1`をとります
```python
line = [0,1,2,3,4,5,6,7,8,9]
print(line[1::2])
# > [1,3,5,7,9]
print(line[:7:3])
# > [0,3,6]
print(line[2:6:]) # line[2:6] と同じ
# > [2,3,4,5]
print(line[::3])
# > [0,3,6,9]
print(line[4::]) # line[4:] と同じ
# > [4,5,6,7,8,9]
print(line[:5:]) # line[:5] と同じ
# > [0,1,2,3,4]
print(line[::]) # line[:]と同じ
# > [0,1,2,3,4,5,6,7,8,9]
```
`step`が省略されている場合は、普通のスライス操作と同じなので2つ目の`:`は省略できますね
また、値が減っていくような数列は`step`で負の値を指定すれば実装できます
(`start`と`goal`だけでは実装できないことに注意してください)
<br>
# 制御フロー文
制御フロー文とは、条件式を基にプログラムの処理の流れを変えることができる文型です
Pythonでは`if`や`while`,`for`などが挙げられます。他言語を経験されている方は、`switch`,`do-while`などもご存知なのではないでしょうか
## if文
if文は、条件式によって処理の分岐を行う制御フロー文です
前稿で学んだブール演算、比較演算を利用して分岐命令が記述できます
```python
x = 10
if x > 5 :
print('xは5より大きい')
# > xは5より大きい
```
ここで前稿で触れた**オフサイドルール**がでてきます
> #### ブロックの記述方法
> Javaなどでは、if文やfor文といったブロックを、中括弧`{}`で囲んで記述していたかと思います
> Pythonでは中括弧は使わず、インデントを使用してブロックを記述します
> このように、インデントが構文規則定められている規則を **オフサイドルール** と言います
Pythonではインデントを使って、制御フロー文を記述します
上記のコードでは、`print`の前に半角スペース4文字分のインデントがあります
また、if文の最後尾にある`:`も忘れないでください。「ここから分岐しますよ」という意味になるので、忘れてしまうとエラーになります
次に、初めの条件式がFalseだった場合の処理を追加してみましょう
```python
x = 3
if x > 5 :
print('xは5より大きい')
elif x > 0:
print('xは0より大きく5以下である')
else :
print('xは0以下である')
# > xは0より大きく5以下である
```
`elif :`で追加の条件を付け加えることができます。前の条件式がFalseだった場合、実行されます
`else :`で`elif`を含めた全ての条件式がFalsだった場合の処理を記述できます
`elif`部は何個でも記述できますが、`else`部は最大で1個だけです
どちらも前述されているように、省略することができます
これらは他言語における`switch`文や`case`文と同じ記述ができます
<br>
## while文
while文は、条件式によって繰り返し処理を行う制御フロー文です
条件式がTrueの間、記述した処理を繰り返します
```python
x = 0
while(x < 10) :
print(x)
x = x + 1
# > 0
# > 1
# > 2
# > 3
# > 4
# > 5
# > 6
# > 7
# > 8
# > 9
```
上記の処理では`x < 10`より、xが10未満の間while文の処理が実行されるようになります
<br>
## for文
for文は、コンテナオブジェクトを利用する制御フロー文です
指定したコンテナオブジェクトから1つずつ要素を取り出して処理を行います
```python
for i in range(10) :
print(i)
# > 0
# > 1
# > 2
# > 3
# > 4
# > 5
# > 6
# > 7
# > 8
# > 9
```
## おわりに
拡張スライス操作、制御フロー文、いかがでしたでしょうか?
前稿と本稿を理解いただければ、Pythonの基礎の基礎は修了です、お疲れ様でした!
次稿から他の言語には(ほぼ)ないPython独自の記法について説明していきたいと思います
ご興味あれば、ぜひ一読よろしくお願いします!
また、本稿について不明点・修正点などございましたら、是非コメントの方によろしくお願いいたします
# 人生苦短我用Python!!