【データサイエンティスト入門】Pythonの基礎♬条件分岐とループ

[昨夜の続き](https://qiita.com/MuAuan/items/f5006ebf836e3741e21a)です。
【注意】
[「東京大学のデータサイエンティスト育成講座」](https://www.amazon.co.jp/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E8%82%B2%E6%88%90%E8%AC%9B%E5%BA%A7-Python%E3%81%A7%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%E3%83%87%E2%80%95%E3%82%BF%E5%88%86%E6%9E%90-%E5%A1%9A%E6%9C%AC%E9%82%A6%E5%B0%8A/dp/4839965250/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)を読んで、ちょっと疑問を持ったところや有用だと感じた部分をまとめて行こうと思う。
したがって、あらすじはまんまになると思うが内容は本書とは関係ないと思って読んでいただきたい。
###Chapter1-2 Pythonの基礎
演算子と演算が参考にまとめられている。
【参考】
[とほほのPython入門 - 演算子](http://www.tohoho-web.com/python/operators.html)
####1-2-4　条件分岐とループ
Pythonコードは、上から下に向けて実行される。その流れを変えて、条件分岐や繰り返しの処理をするための構文
#####1-2-4-1　比較演算子と真偽判定
```py
print(1 == 1)
print(1 == 2)
print(1 != 2)
print(1 > 0)
print(1 > 2)
print((1 > 0) and (10 > 5))
print((1 < 0) or (10 > 5))
print(not (1 < 0))
print(not (1 < 0))
print(not (1 < 0) and (10 > 5))
print(not (1 < 0) and not (10 > 5))
print(5 >= 50 or 5 < 20 and 5 == 5)
print((5 >= 50 or 5 < 20) and 5 == 5)
```
結果

```
True
False
True
True
False
True
True
True
True
False
True
True
```

【参考】
[図解！Pythonのif文でand、orによる複数条件の指定方法を徹底解説！](https://ai-inter1.com/python-if-andor/)
参考によれば以下のコードは「Falseです。」

```py
x = 5
y = 5
if x >= 50 or x < 20 and y == 5:
   print("Trueです。")
else:
   print("Falseです。")
```
理由；andとorではandが優先される
とありますが、現在のPython3でのOperator precedenceは、orがandに優先し、Trueになります。
【参考】
[6.17. Operator precedence](https://docs.python.org/3/reference/expressions.html#operator-precedence)
(一部引用)

|Operator|Description|
|:-:|:-:|
|:=|Assignment expression|
|lambda|Lambda expression|
|if – else|Conditional expression|
|or|Boolean OR|
|and|Boolean AND|
|not x|Boolean NOT|
|in, not in, is, is not, <, <=, >, >=, !=, ==|Comparisons, including membership tests and identity tests|
|||Bitwise OR|
|^|Bitwise XOR|
|&|Bitwise AND|
|...|...|

#####1-2-4-2　if文
基本

```py
if 条件式1:
    `条件式1がTrueのときに行う処理`
elif 条件式2:
    `条件式1がFalseで条件式2がTrueのときに行う処理`
elif 条件式3:
    `条件式1, 2がFalseで条件式3がTrueのときに行う処理`
...
else:
    `すべての条件式がFalseのときに行う処理`　
```

```
Pythonのif文の条件式において、偽Falseとみなされるのは以下のオブジェクト。
・bool型のFalse
・None
・数値（int型やfloat型）の0, 0.0
・空の文字列''
・空のコンテナ（リスト、タプル、辞書など）[], (), {}

これ以外はすべて真Trueとみなされる。
```
ここまでは、以下の参考より引用
【参考】
[Pythonのif文による条件分岐の書き方](https://note.nkmk.me/python-if-elif-else/)

```py
data_list = [1,2,3,4,5,6,7] 
findvalue = 8
if findvalue in data_list:
    print('{}は入っています'.format(findvalue))
else:
    print('{}は入っていません'.format(findvalue))
print('findvalueは{}でした'.format(findvalue))
```
結果
最後のprint行はif文の外で必ず表示される。

```
8は入っていません
findvalueは8でした
```
#####format記法
【参考】
[【Python入門】format関数で文字列の書き方](http://programming-study.com/technology/python-format/)
参考を見つつ、面白そうな記法を試してみます。

```py
apple  = 50
orange = 100
total = apple + orange

print('りんご：{0}円 みかん：{1}円 合計：{2}円'.format(apple, orange, total))
print('りんご：{}円 みかん：{}円 合計：{}円'.format(apple, orange, total))

list1 = [apple, orange]  #リストの作成
list2 = [total]
print('りんご：{0[0]}円 みかん：{0[1]}円 合計：{1[0]}円'.format(list1,list2))
print('りんご：{0[0]}円 みかん：{0[1]}円 合計：{1}円'.format(list1,list2[0]))
print('りんご：{}円 みかん：{}円 合計：{}円'.format(list1[0],list1[1],list2[0]))
```

```
りんご：50円 みかん：100円 合計：150円
りんご：50円 みかん：100円 合計：150円
りんご：50円 みかん：100円 合計：150円
みかん：100円 りんご：50円 合計：150円
りんご：50円 みかん：100円 合計：150円
```
浮動小数点の場合の記法はよく使うので、以下参照
【参考】
[Pythonの文字列フォーマット（formatメソッドの使い方）](https://gammasoft.jp/blog/python-string-format/)

```py
line = "{0}さんの身長は{1:.0f}cm、体重は{2:.1f}kgです。".format("山田", 190, 105.3)
print(line)
line = "{1}さんの身長は{2:^10,.5f}mm、体重は{3:.0f}kgです。".format("山田","山", 1900, 105.3)
print(line)
```
結果

```
山田さんの身長は190cm、体重は105.3kgです。
山さんの身長は1,900.00000mm、体重は105kgです。
```

|{2:^10,.5f}|1,900.00000|
|:-:|:-:|
|2|index|
|:|書式開始|
|^|出力位置|
|10|出力幅|
|,|千の所に,|
|.5|小数点以下5桁表示|
|f|浮動小数点数|
#####1-2-4-3　for文
for文はよく使うのは以下の三種類（数値、list型, 辞書型）
######1-2-4-4　数値
以下は普通に0~10まで回す。
演算は、足し合わせ。都度出力しています。
range(0,11,1)；range(初期値,最終値+1,間隔)

```py
s=0
for i in range(0,11,1):
    s += i
    print(s)
```
結果

```
0
1
3
6
10
15
21
28
36
45
55
```
######list型

```py
s=0
list1 = [0,1,2,3,4,5,6,7,8,9,10]    
for i in list1:
    s += i
    print(s)
```
結果

```
0
1
3
6
10
15
21
28
36
45
55
```
#####辞書型

```py
dict_data = {'apple':100,'banana':100,'orange':300,'mango':400,'melon':500}
for dict_key in dict_data:
    print(dict_key,dict_data[dict_key])
```
結果

```py
apple 100
banana 100
orange 300
mango 400
melon 500
```
辞書型から、dict_data.items()でkey, valueを取得して出力

```py
dict_data = {'apple':100,'banana':100,'orange':300,'mango':400,'melon':500}
for key, value in dict_data.items():
    print(key,value)
```
結果

```
apple 100
banana 100
orange 300
mango 400
melon 500
```
#####1-2-4-5　内包表記
```py
data_list = [1,2,3,4,5,6,7,8,9]
data_list1 = []
data_list1 = [i*2 for i in data_list]
print(data_list1)
```
結果

```
[2, 4, 6, 8, 10, 12, 14, 16, 18]
```
i%2==0（iを2で割った時の余りが0）の時だけ出力する

```py
print([i*2 for i in data_list if i%2==0])
```

```
[4, 8, 12, 16]
```
#####1-2-4-6 zip関数
以下のように二つのリストがあるとき、それぞれから順番に要素を取り出せる。

```py
list1 = ['apple','banana','orange','mango','melon']
list2 = [100, 100, 300, 400, 500]
for one, two in zip(list1, list2):
    print(one, two)
```
結果
因みに、要素数が不一致な場合は頭から少ない方に合わせて出力する。

```
apple 100
banana 100
orange 300
mango 400
melon 500
```
#####zip関数で二つのリストから辞書型データ作成
```py
dict_new = {}
list1 = ['apple','banana','orange','mango','melon','pinapple']
list2 = [100, 100, 300, 400, 500]
for one, two in zip(list1, list2):
    dict_new.update({one: two})
print(dict_new)
print(type(dict_new))
```
結果

```
{'apple': 100, 'banana': 100, 'orange': 300, 'mango': 400, 'melon': 500}
<class 'dict'>
```
######enumerate関数
```py
list1 = ['apple','banana','orange','mango','melon','pinapple']
list2 = [100, 100, 300, 400, 500]
for i, name in enumerate(list1):
    print(i, name)
```
結果

```
0 apple
1 banana
2 orange
3 mango
4 melon
5 pinapple
```
開始のindex指定

```py
for i, name in enumerate(list1, 3):
    print(i, name)
```
結果

```
3 apple
4 banana
5 orange
6 mango
7 melon
8 pinapple
```
list1とlist2をzipして、indexも付ける。

```py
for i, name in enumerate(zip(list1, list2)):
    print(i, name)
```
結果

```
0 ('apple', 100)
1 ('banana', 100)
2 ('orange', 300)
3 ('mango', 400)
4 ('melon', 500)
```
#####1-2-4-7 while文を使った繰り返し処理
```py
num = 0
s = 0
while num <= 10:
    s += num
    print(s)
    num += 1
```
結果

```
0
1
3
6
10
15
21
28
36
45
55
```
######continueとbreak
以下のコードの結果は上記と同じですが、while 1:は常にTrueであり、処理の継続cotinueと処理の中断breakの役割を説明しています。

```py
num = 0
s = 0
while 1:
    if num <= 10:
        s += num
        print(s)
        num += 1
        continue
    break
```
因みに、continueが無いと0で終わってしまうし、breakが無いと処理が終了しません。また、両方ない場合も処理が終了しません。
###まとめ
・条件分岐とルール
・if文, for文, 内包表記, zip関数,enumerate関数, while文をまとめた

基本に立ち返って、並べてみると分かり易い。