Pythonのお勉強～入門編3～

[前回](https://qiita.com/merito/items/dc47d5f0ab80736d7d69)からの続き。
[最初](https://qiita.com/merito/items/e46a506ae9a020555203)はここから始まりました。

#制御フローとコード構造
## if文
if文とかは{}で囲うんじゃなくてインデントで表現する。
これは違和感すごいけど慣れていかないとなぁ…

```python:実行
x = -10
if x < 0:
    print('0より小さいよ！')
elif x == 0:
    print('0だよ！！')
else:
    print("0より大きいよ！！")

a = 5
b = 10
if a > 0:
    print('aは0より大きいよ！！')
    if b > 0:
        print('bも0より大きいよ！！やったね！！')
```

```:結果
0より小さいよ！
aは0より大きいよ！！
bも0より大きいよ！！やったね！！
```

また、入れ子にする場合、インデントが揃っていないとエラーとなるので注意。

```python:実行
a = 5
b = 10

if a > 0:
    print('aは0より大きいよ！！')
    # ifの前に一つスペースを入れると、インデントが揃っていないのでエラー
     if b > 0:
        print('bも0より大きいよ！！やったね！！')
```

```:結果
  File "xxx/hoge.py", line 6
    if b > 0:
    ^
IndentationError: unexpected indent
```

## 論理演算子
大体同じなのでさすがに省略。

## InとNotの使いどころ
Inは比較するものが含まれているか、Notはそのまま否定形(いわゆる「!」)。

```python:実行
y = [1, 2, 3]
x = 1

# xの値がyの配列内に含まれているか
if x in y:
    print(f'x={x}はyに入っているよ！！！！')

# 100がyの配列内に含まれているか
if 100 not in y:
    print('100はyに入ってないよ！！！')

is_ok = True

# is_okがTrueではない
if not is_ok:
    print('Trueじゃないよ！！！')
else:
    print('Trueだよ！！！')
```

```:結果
x=1はyに入っているよ！！！！
100はyに入ってないよ！！！
Trueだよ！！！
```

## 値が入っていない判定をするテクニック
変数が0、空文字、空のリストなどの場合、if文でbooleanのように指定すると、falseと判定する。
1以上の数値、もしくは何かしら文字が入っている、リストに何かしら値が格納されているといった場合はTrueと判断する。
これを利用して、変数に値が入っていないか判定できる。

```python:実行
ok_num = 1
ok_str = 'test'
ok_list = [1, 2, 3]

if ok_num:
    print('OKKKKKKKKKKKKKKKKKK!!!!!!!!!')
else:
    print('NOOOOOOOOOOOOOOOOOO!!!!!!!!!')

if ok_str:
    print('OKKKKKKKKKKKKKKKKKK!!!!!!!!!')
else:
    print('NOOOOOOOOOOOOOOOOOO!!!!!!!!!')

if ok_list:
    print('OKKKKKKKKKKKKKKKKKK!!!!!!!!!')
else:
    print('NOOOOOOOOOOOOOOOOOO!!!!!!!!!')

no_num = 0
no_str = ''
# (), {}, set()も同様
no_list = []

if no_num:
    print('OKKKKKKKKKKKKKKKKKK!!!!!!!!!')
else:
    print('NOOOOOOOOOOOOOOOOOO!!!!!!!!!')

if no_str:
    print('OKKKKKKKKKKKKKKKKKK!!!!!!!!!')
else:
    print('NOOOOOOOOOOOOOOOOOO!!!!!!!!!')

if no_list:
    print('OKKKKKKKKKKKKKKKKKK!!!!!!!!!')
else:
    print('NOOOOOOOOOOOOOOOOOO!!!!!!!!!')
```

```:結果
OKKKKKKKKKKKKKKKKKK!!!!!!!!!
OKKKKKKKKKKKKKKKKKK!!!!!!!!!
OKKKKKKKKKKKKKKKKKK!!!!!!!!!
NOOOOOOOOOOOOOOOOOO!!!!!!!!!
NOOOOOOOOOOOOOOOOOO!!!!!!!!!
NOOOOOOOOOOOOOOOOOO!!!!!!!!!
```

仕様だとは思いつつ、数値も0っていう値入っているじゃないと思って少し調べたら公式ドキュメントにFalseとみなすものが書いてある。
[4.1. 真理値判定](https://docs.python.jp/3/library/stdtypes.html#truth-value-testing)

##Noneを判定する場合
pythonではnullを「None」で表現する。
変数がNoneかどうかを判定する場合は「is」を使用する。

```python:実行
is_empyty = None
if is_empyty is None:
    print('Noneだよ!!!!!!!!!!!')
```

```:結果
Noneだよ!!!!!!!!!!!
```

## while文
特筆することは多分なし。

```python:実行
count = 0
while True:
    if count >= 5:
        break
    if count == 3:
        print('3だけアホになります')
        count += 1
        continue
    print(count)
    count += 1
```

```:結果
0
1
2
3だけアホになります
4
```

## while else文
whileを抜けると最後にelseの処理をする。

```python:実行
count = 0
while count < 5:
    print(count)
    count += 1
else:
    print('done')
```

```:結果
0
1
2
3
4
done
```

ただし、breakでwhileを抜けた場合はelseの処理は行われない。

```python:実行
count = 0

while count < 5:
    if count == 2:
        break
    print(count)
    count += 1
else:
    print('done')
```

```:結果
0
1
```

## input関数
コマンドラインから入力した値を受け取るあれ。

```python:実行
while True:
    word = input('川：')
    if word == '谷':
        print('YES!')
        break
    print('NO!')
```

```:結果
川：海
NO!
川：谷
YES!
```

## for文
こちらも特筆することは多分なし。

```python:実行
some_list = [1, 2, 3, 4, 5]
for i in some_list:
    print(i)

word = 'abcdefg'
for s in word:
    if s == 'd':
        continue
    if s == 'f':
        break
    print(s)
```

```:結果
1
2
3
4
5
a
b
c
e
```

## for else文
while else文と同じ。

```python:実行
fruits = ['apple', 'banana', 'orange']
for fruit in fruits:
    print(fruit)
else:
    print('全部食べました!!!!!')
```

```:結果
apple
banana
orange
全部食べました!!!!!
```

## range関数
指定した長さのリストを生成する。
for文でよく使われるらしい。

```python:実行
# 0～9まで
for i in range(10):
    print(i)

# 5～9まで
for i in range(5, 10):
    print(i)

# 3個飛ばしで2～9まで
for i in range(2, 10, 3):
    print(i)
```

```:結果
0
1
2
3
4
5
6
7
8
9
5
6
7
8
9
2
5
8
```

使わない値は「_」に入れるというお約束?があるらしい。
コーディング規約とかであるのかな?これも後日調べてみる。

```python:実行
for _ in range(5):
    # iなんて使わないぜ
    print('hoge')
```

```:結果
hoge
hoge
hoge
hoge
hoge
```

## enumerate関数
要素のインデックスと値を同時に取り出せる。
これもよく使われるらしい。

```python:実行
fruits = ['apple', 'banana', 'orange']
for i, fruit in enumerate(fruits):
    print(i, fruit)
```

```:実行
0 apple
1 banana
2 orange
```

## zip関数
複数のリストをまとめて取得できる。

```python:実行
days = ['Mon', 'Tue', 'Wen']
fruits = ['apple', 'banana', 'orange']
drinks = ['coffee', 'tea', 'beer']

for day, fruit, drink in zip(days, fruits, drinks):
    print(day, fruit, drink)
```

```:実行
Mon apple coffee
Tue banana tea
Wen orange beer
```

## 辞書をforで処理する
items()を使うとkeyとvalueが取れる。

```python:実行
d = {'x': 100, 'y': 200}
for k, v in d.items():
    print(k, ':',  v)
```

```:結果
x : 100
y : 200
```

items()は辞書の中身をタプルのリストで返してくれる。
文章にするt(ry

```python:実行
d = {'x': 100, 'y': 200}
print(d.items())
```

```:結果
dict_items([('x', 100), ('y', 200)])
```

制御フローとコード構造のセクションちょっと長いのでいったんここで区切ることにする。
続きはまた後日。