復習　Python　tutorial #4 if,else,内包表記

# if,elif,elseによる比較
今度はデータ構造について話していきたいと思う。
##Trueについて
TrueとみなされるものはいくつもあるのでFalseとみなされるものを見ていこう
![スクリーンショット 2021-03-01 18.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146127/e99a8ca3-17da-ab89-f558-aafd101bffc5.png)
(Python入門から引用)

##if,else
```python
true_or_false = True
if true_or_false:
    print('True')
else:
    print('False')
#実行結果
True
```
このように変数に対してTrueかFalseしかないので、そのことを考慮するとifでTrueの時の値を考え、elseの時(true_or_falseがFalseの時)Falseという結果になる。この時elseを使っているのはTrueかFalseの値しか返されないからである。複数ある場合はelifを用いるとできる。また二つともTrueかFalseかによって判断をきめることも可能である。

```python
#そのお茶が何茶かを考える。
iis_it_green = True
does_it_have_cafein = True
if is_it_green:
    if does_it_have_cafein:
        print('Green Tea')
    else:
        print('No Match')
else:
    if does_it_have_cafein:
        print('Tea')
    else:
        print('barley Tea')
#実行結果
Green Tea
```
##if,elif
```python
what_do_you_need_in_the_college = 'Computer Science'

if what_do_you_need_in_the_college == 'Computer Science':
    print('You Should Go To A University')
elif what_do_you_need_in_the_college == 'English':
    print('You Should Go To B University')
elif what_do_you_need_in_the_college == 'Economiy':
    print('You Should Go To C University')
#実行結果
You Should Go To A University
```
このように同じ値をとると言った時に'=='とすることに注意しよう。
'==':等しい
'!=':等しくない
'<':よりちいさい
'>':より大きい
'in':要素になっている。

#Whileによる反復処理
if,else,elifは上から下に進んでいく感じに処理が進む。しかし同じ処理をいくつか行わないといけない時がある。例えば下限が1000円の時毎回100円ずつオークション形式のようなもので増加していくと考えた時、1000円にいくまでFalseという値を返すのようなものに使われる。

```python
now_auction_cost = 100
while 1000 >= now_auction_cost:
    print('まだ下限を満たしておりません')
    now_auction_cost += 100
    if 1000 == now_auction_cost:
        print('オークション開始')
        break
#実行結果
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
まだ下限を満たしておりません
オークション開始
```
1000円より小さいまでは’まだ下限を満たしておりません’が表示され超えると(ifで表している。)オークション開始となる。この時にこの動作を注視させるためにbreakを用いる。
#Continueによる次のイテレーションの開始
何らかの理由からループを抜け出してしまうものではなく次のイテレーション（反復処理の一回分）を直ちに始めたいという時がある。簡潔に言えば、奇数と偶数について考える時に偶数だった場合は何もせず奇数に関しては何らかの作業をするとしEが押された瞬間に作業を終了するとする。この時に偶数の時は何もしないことでbreakをコードに打ち込めばいい話であるが、そうするとEで止めるのとbreakで止める二つのbreakが発生してしまう。それを防ぐためにcontinueを用いて作業を続くようにする。

```python
while True:
    value = input("You put any number:" )
    if value == 'E': #Eで終わる
        break
    number = int(value)
    if number % 2 == 0:
        continue
    print('You can convert ', number, 'to the square:', number*number)
#実行結果
You put any number:３
You can convert  3 to the square: 9
You put any number:４
You put any number:２
You put any number:７
You can convert  7 to the square: 49
You put any number:９
You can convert  9 to the square: 81
You put any number:E

Process finished with exit code 0
```
##elseによるbreakのチェック
Whileループが正常終了したら(breakせずに終了)制御はelse文に引き継がれる。よってbreakができてない時にはelse文が働きだすのでそのために用いる。

```python
numbers = [1, 3, 5]
position = 0
while position < len(numbers):
#これがないとwhile文を始めるきっかけがなくなる。
    number = numbers[position]
    if number %2 == 0: #ここでnumberには偶数がないことからbreakができない状態にある。
        print('Found even number')
        break
    position +=1 
else:
    print('No even number')
#実行結果
No even number
```
##forによる反復処理
Pythonはイテレータというこれから紹介するfor文のように要素を一つずつ取り出すというものをよく用いる。イテレータを使えば一つずつのの処理をするからデータがどれくらいの数なのかがわかるようになっている。for文はwhile文と似ているがイテレータかどうかが異なる点である。今から同じ処理をするものをfor文とwhile両方で作っていく。

```python
flouts = ['orange', 'apple', 'lemon']
zero = 0
# while文でやってみた
while zero < len(flouts):
    flout = flouts[zero]
    print(flout)
    zero += 1
print('###')
# for文のでやってみた
for flout in flouts:
    print(flout)
```
whileと似ていることからforにもbreakというものが存在する。

```python
classmates = {'Daichi', 'Kaito', 'Keisuke','Kouta'}
#breakの例
for classmate in classmates:
    print(classmate, 'is my classmate')
    break
else:
    print("You don't have classmate")
#実行結果
Daichi is my classmate
#breakを通り越してelseをする場合
classmates = {}
for classmate in classmates:
    print(classmate, 'is my classmate')
    break
else:
    print("You don't have classmate")
#実行結果
You don't have classmate
```
ここで一ついうと集合は値がランダムに返ってくる。この場合クラスメートを任意から選ぶことができる。これがもしリストだと'Daichi'という値しか返ってこない。

##zip()を用いた複数のシーケンスの反復処理
forループにはzip()を用いれば並列的に反復処理をできる。

```python
days = ['Monday', 'Tuesday', 'Wednesday']
fruits = ['banana', 'orange', 'peach']
drinks = ['coffee', 'tea', 'beer']
desserts = ['tiramisu', 'ice cream', 'pie', 'pudding']
for day, fruit, drink, dessert in zip(days, fruits, drinks, desserts):
    print("Your reservation's day is ", day, "\neat ", fruit, "\ndrink ", drink, "\ndessert ", dessert)
    print('####################')
#実行結果
Your reservation's day is  Monday 
eat  banana 
drink  coffee 
dessert  tiramisu
####################
Your reservation's day is  Tuesday 
eat  orange 
drink  tea 
dessert  ice cream
####################
Your reservation's day is  Wednesday 
eat  peach 
drink  beer 
dessert  pie
####################
```

このようにして一度に複数のシーケンスを一度に変数化して並列的に反復処理することができるのである。zip()は他にもあるリスト同士をペアにすることも可能である。

##range()による数値のシーケンスの作成
例えば0から100までの数の偶数をシーケンスに変換する時はいちいち0から100をリスト化して考えるのは大変である。その時にrange()を用いることによって可能になる。

```python
for x in range(1, 100, 2):
    print(x)
#実行結果
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
```
#内包表記
一つ以上のイテレータからPythonのデータ構造をコンパクトに作れる形式である。内包表記を使えばループや条件テストを簡単に結合することができる。今から同じ処理をするコードを書いていこうと思う。
##リスト内包表記
```python
#内包表記なし1
numbers = []
numbers.append(0)
numbers.append(1)
numbers.append(2)
numbers.append(3)
numbers.append(4)
numbers.append(5)
print(numbers)

#内包表記なし2
numbers = []
for number in range(1, 6):
    numbers.append(number)
print(numbers)
#内包表記あり
numbers = [number for number in range(0, 6)]
print(numbers)
```
numberについてfor文で述べているからforの前にあるnumberは必須である。

このように内包表記あるなしでは全然違う。このようなことが可能になるのはPythonがじゅんばんにコードを処理していくからである。これがもし同時に処理するようなコードを使っていたらnumbersは空集合になるであろう。そういうことがPythonが便利な理由である。この内包表記はif文とも組み合わせることが可能である。例えば奇数のものを使う時に

```python
odd_numbers = [odd_number for odd_number in range(0, 6) if odd_number % 2==1]
print(odd_numbers)
#実行結果
[1, 3, 5]
```
このようにして考える。あくまでこれはifを使いたいからやっている。そうでなければこうするのが適切であろう。

```python
odd_numbers = [odd_number for odd_number in range(1, 6, 2)]
print(odd_numbers)
```
これが一番いいであろう。複数のシーケンスに対して考えるのも可能である。

```python
alphabets = ['a', 'b', 'c', 'd']
numbers = [1, 2, 3, 4]
alp_and_num = [ (number, alphabet) for number in numbers for alphabet in alphabets]
print(alp_and_num)
#実行結果
[(1, 'a'), (1, 'b'), (1, 'c'), (1, 'd'), (2, 'a'), (2, 'b'), (2, 'c'), (2, 'd'), (3, 'a'), (3, 'b'), (3, 'c'), (3, 'd'), (4, 'a'), (4, 'b'), (4, 'c'), (4, 'd')]
```
このようになるこの時注意することは内包表記では一つずつfor文を立てていくということである。そうしないとSyntaxエラーが出てしまう。
##辞書内包表記
辞書にも内包表記は存在する。それについてみてみよう

```python
word = 'letters'
letter_count = {letter: word.count(letter) for letter in word}
print(letter_count)
#実行結果
{'l': 1, 'e': 2, 't': 2, 'r': 1, 's': 1}
```
count関数はその中にあるものの数をカウントする関数である。letterはwordから一文字ずつ取っていって考えるものである。それをletterというものに入れて行っていく。辞書内包表記は辞書をif文を介していろいろやっていくものである。


##集合内包表記
辞書と同じような考え方である。
##ジェネレーター内包表記
タプルには内包表記は存在しない。しかし()をつけて動作させてみると作動する。それはなぜかというとその()で結んだものをジェネレーター内包表記というものに該当するからである。

```python
number_thing = (number for number in range(1, 6))
print(type(number_thing))
#実行結果
<class 'generator'>
```
これをリスト化するにはlist()を呼び出しラップすればリスト内包表記として表すことができる。