Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

# はじめに

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

python3.6
anaconda1.8.7
macOS

# for文

```>>> a = [0,1,2,3,4,5]
>>> for i in a:
...     print(i)
...
0
1
2
3
4
5
```

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

いろんな型も大丈夫。

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

```>>> 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
```
```>>> 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()を使えば逆順にすることも可能です。

```>>> 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
```

```>>> for letter in "hello":
...     print(letter)
...
h
e
l
l
o
```

```>>> 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を使うとインデックスと要素を同時に取得できます。

```>>> 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()を使うとキーとそれに対応する値を同時に取得することができます。

```>>> 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文を作る時の考え方。

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

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

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

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

`③機械的に数を数えてくれるものを反復に入れる`

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

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

```for name in names:
print(name+"さん")
```

これでスッキリ。

# while文

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

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

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

```>>> a = 0
>>> while a < 5:
...     print(a)
...     a+=1
...
0
1
2
3
4
```

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

# if文

```>>> a =5
>>> if a==5:
...     print("hello")
... else:
...     print("hi")
...
hello
```
```>>> b = 4
>>> if b < 3:
...     print("chiba")
... elif b < 5:
...     print("saitama")
... else:
...     print("kanagawa")
...
saitama
```

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

# 組み合わせ

```>>> 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)で追加していく。

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

# 補足:range()

```>>> 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は以下のように使えます。処理をスキップします。

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

breakをすることで処理が止まる

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

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

```>>> for i in range(10):
...     if i == 7:
...         print("Break!")
...         break
...     if i == 3:
...         continue
...     print(i)
...
0
1
2
4
5
6
Break!
```
```breakはループの外で使おうとするとエラーになる
>>> break
File "<stdin>", line 1
SyntaxError: 'break' outside loop
```

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

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

for文でbreakする場合

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

continueと似ているものでpassがありますが、

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

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

pass文は
・関数を作る際に、関数名やクラス名は決まったけども実装ができていない時
・ループの際に何も動作を行わない時
のような時に使います。
つまり「何もしない」ということを明示的に書き記すことが出来ます。

# 終わり

Why not register and get more from Qiita?
1. We will deliver articles that match you
By following users and tags, you can catch up information on technical fields that you are interested in as a whole
2. you can read useful information later efficiently
By "stocking" the articles you like, you can search right away