はじめに
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
組み込み関数range()で使うことで、数列にわたって反復を行うことができます。
>>> 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文を作る時の考え方。
例えば名前のリストを反復する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文
最もおなじみの文型は if 文。elif(else ifの略)、elseをつける。
>>> 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
複数の条件をandで付けられる。
>>> 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()
引数を(start,until,step)で指定できます。
>>> 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文でbreakしない場合
>>> 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がありますが、
違いは明確。「passは何もしない」「continueはループ先頭に戻る」
以下continue。後ろのprint()は流れることなく、先頭に戻ります。
>>> for i in range(5):
...     print(i)
...     if i == 3:
...         continue
...         print("Hello")
... 
0
1
2
3
4
以下pass。後ろのprint()が処理されて、passは何もしていません。
>>> for i in range(5):
...     print(i)
...     if i == 3:
...         pass
...         print("Hello")
... 
0
1
2
3
Hello
4
pass文は
・関数を作る際に、関数名やクラス名は決まったけども実装ができていない時
・ループの際に何も動作を行わない時
のような時に使います。
つまり**「何もしない」ということを明示的に書き記す**ことが出来ます。