pythonのfor/while/ifとbreakとcontinueとpassとか

#　はじめに
pythonの基礎として、for文/while文/if文について記載します。

#　環境
python3.6
anaconda1.8.7
macOS

#　for文

任意のシーケンス型 (リストまたは文字列) において,シーケンス中に要素が現れる順番でイテレーション(反復)を行います。

```python
>>> a = [0,1,2,3,4,5]
>>> for i in a:
...     print(i)
... 
0
1
2
3
4
5
```
組み込み関数range()で使うことで、数列にわたって反復を行うことができます。

```python
>>> for i in range(0,6):
...     print(i) 
... 
0
1
2
3
4
5
```

```python
>>> for i in range(0,6):
...     b = i*2
...     print(b)
... 
0
2
4
6
8
10
```

いろんな型も大丈夫。

```python
>>> c = ["chiba",1985, 78.8, True]
>>> for i in c:
...     print(i)
... 
chiba
1985
78.8
True
```

反復で文章を作ることもできる。

```python
>>> cities = ["chiba","saitama","kanagawa"]
>>> for city in cities:
...     phrase = "I live in " + city
...     print(phrase)
... 
I live in chiba
I live in saitama
I live in kanagawa
```

```python
>>> for i in range(1,10):
...     print("The inverse of",i, "is", 1.0/i)
... 
The inverse of 1 is 1.0
The inverse of 2 is 0.5
The inverse of 3 is 0.3333333333333333
The inverse of 4 is 0.25
The inverse of 5 is 0.2
The inverse of 6 is 0.16666666666666666
The inverse of 7 is 0.14285714285714285
The inverse of 8 is 0.125
The inverse of 9 is 0.1111111111111111
```
reversed()を使えば逆順にすることも可能です。

```python
>>> for i in reversed(range(1,10)):
...     print("The inverse of",i, "is", 1.0/i)
... 
The inverse of 9 is 0.1111111111111111
The inverse of 8 is 0.125
The inverse of 7 is 0.14285714285714285
The inverse of 6 is 0.16666666666666666
The inverse of 5 is 0.2
The inverse of 4 is 0.25
The inverse of 3 is 0.3333333333333333
The inverse of 2 is 0.5
The inverse of 1 is 1.0
```

一文字ごと反復することもできます。

```python
>>> for letter in "hello":
...     print(letter)
... 
h
e
l
l
o
```
以下のようなこともできます。

```python
>>> a = ["tokyo", "chiba", "saitama", "kanagawa", "okinawa"]
>>> for i in range(len(a)):
...     print(i, a[i])
... 
0 tokyo
1 chiba
2 saitama
3 kanagawa
4 okinawa
```
enumerateを使うとインデックスと要素を同時に取得できます。

```python
>>> for i, v in enumerate(["tokyo", "chiba", "saitama", "kanagawa", "okinawa"]):
...     print(i, v)
... 
0 tokyo
1 chiba
2 saitama
3 kanagawa
4 okinawa
```
sorted()を使うことで、元の配列を変更せ図に、ソート済みの新たな配列を返すことができます。

```
>>> areas = ["tokyo", "chiba", "saitama", "kanagawa", "okinawa"]
>>> for area in sorted(areas):
...     print(area)
... 
chiba
kanagawa
okinawa
saitama
tokyo
```

また辞書型をイテレーターとする時に、 items()を使うとキーとそれに対応する値を同時に取得することができます。

```python
>>> my_info = {'age': 33, 'weight': 78, 'height': 175}
>>> for k, v in my_info.items():
...     print(k, v)
... 
age 33
weight 78
height 175
```

### 慣れないうちのfor文を作る時の考え方。
例えば名前のリストを反復するfor文。

`①最終的に表現したいものを書き出す。`

```python
print(names[0]+"さん")
print(names[1]+"さん")
print(names[2]+"さん")
print(names[3]+"さん")
```

`②汎用性を持たせるためにfor文に入れてみる`

```python
for i in range(4):
    print(names[i]+"さん")
```

悪くはないけれど、これだと数が増えた時に作り直すしかない。
`③機械的に数を数えてくれるものを反復に入れる`

```python
#ステップ3
for i in range(len(names)):
    print(names[i]+"さん")
```

これで汎用性は高くなるが、可読性が低いので
`④インデックス指定ではなく、文字シーケンスをそのまま反復の対象にする。`

```python
for name in names:
    print(name+"さん")
```
これでスッキリ。


#　while文

forと違うのは、`条件が真である限り実行を繰り返すところです。`

```python
>>> while a < 10:
...     print(a)
...     a,b = b,a+b
... 
0
1
1
2
3
5
8
>>> 
```

※複数同時の代入(multiple assignment) を使っています。

```python
>>> a = 0
>>> while a < 5:
...     print(a)
...     a+=1
... 
0
1
2
3
4
```
符号の書き方で、同じ処理ができる

```python
>>> b = 0
>>> while b != 5:
...     print(b)
...     b+=1 
... 
0
1
2
3
4
>>> 
```

#　if文

最もおなじみの文型は if 文。elif(else ifの略)、elseをつける。

```python
>>> a =5
>>> if a==5:
...     print("hello")
... else:
...     print("hi")
... 
hello
```

```python
>>> b = 4
>>> if b < 3:
...     print("chiba")
... elif b < 5:
...     print("saitama")
... else:
...     print("kanagawa")
... 
saitama
```
複数の条件をandで付けられる。

```python
>>> time = 17
>>> if time>5 and time<12:
...     print("おはよう")
... elif time>=12 and time<18:
...     print("こんにちは")
... else:
...     print("こんばんは")
... 
こんにちは
```

#　組み合わせ

```python
>>> a = range(0,100)
>>> b = []
>>> for i in a:
...     if i%2 == 0:
...         b.append(i)
... 
>>> b
[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]
```
range()で作った数列をaに代入し、aの中の数値を一つずつiに入れて、もしその数値が2で割り切れたら、空のbのリストにappend(i)で追加していく。

```python
cities = ["chiba","saitama","kanagawa"]
for city in cities:
    if city == "chiba":
        print("narita")
    elif city =="saitama":
        print ("omiya")
    else:
        print("enoshima")
```

#　補足:range()

引数を(start,until,step)で指定できます。

```python
>>> list(range(5, 10))
[5, 6, 7, 8, 9]
>>> list(range(0, 10, 3))
[0, 3, 6, 9]
>>> list(range(-10, -100, -30))
[-10, -40, -70]
```
>参考
range() が返すオブジェクトは、いろいろな点でリストであるかのように振る舞いますが、本当はリストではありません。これは、イテレートした時に望んだ数列の連続した要素を返すオブジェクトです。しかし実際にリストを作るわけではないので、スペースの節約になります。
このようなオブジェクトは イテラブル (iterable) と呼ばれます。これらは関数やコンストラクタのターゲットとして、あるだけの項目を逐次与えるのに適しています。 for 文がそのような イテレータ であることはすでに見てきました。関数 list() もまた一つの例です。これはイテラブルからリストを生成します

#　break、continueについて

continueは以下のように使えます。処理をスキップします。

```python
>>> for x in range(5):
...     if x == 3:
...         continue
...     print(x)
... 
0
1
2
4
```
breakをすることで処理が止まる

```python
>>> for x in range(5):
...     if x == 3:
...         break
...     print(x)
... 
0
1
2
```

breakとcontinueは一緒に使われることもある

```python
>>> for i in range(10):
...     if i == 7:
...         print("Break!")
...         break
...     if i == 3:
...         continue
...     print(i)
... 
0
1
2
4
5
6
Break!
```

```python
breakはループの外で使おうとするとエラーになる
>>> break
  File "<stdin>", line 1
SyntaxError: 'break' outside loop
```

elseを使用すると、for文、あるいはwhile文の処理中でbreak文を使用しなかった時に、else節のブロックを実行します。
以下はfor文でbreakしない場合

```python
>>> for x in range(5):
...     print(x)
... else:
...     print('else')
... 
0
1
2
3
4
else
```

for文でbreakする場合

```python
>>> for x in range(5):
...     if x == 2:
...         break
...     print(x)
... else:
...     print('else')
... 
0
1
```

continueと似ているものでpassがありますが、
違いは明確。「passは何もしない」「continueはループ先頭に戻る」

以下continue。後ろのprint()は流れることなく、先頭に戻ります。

```python
>>> for i in range(5):
...     print(i)
...     if i == 3:
...         continue
...         print("Hello")
... 
0
1
2
3
4
```

以下pass。後ろのprint()が処理されて、passは何もしていません。

```python
>>> for i in range(5):
...     print(i)
...     if i == 3:
...         pass
...         print("Hello")
... 
0
1
2
3
Hello
4
```
pass文は
・関数を作る際に、関数名やクラス名は決まったけども実装ができていない時
・ループの際に何も動作を行わない時
のような時に使います。
つまり**「何もしない」ということを明示的に書き記す**ことが出来ます。

# 参考

[部屋とYシャツとイテレータとジェネレータと私](http://note.crohaco.net/2016/python-iterator-generator-and-tshirt-me/)
#　終わり