# はじめに
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文は
・関数を作る際に、関数名やクラス名は決まったけども実装ができていない時
・ループの際に何も動作を行わない時
のような時に使います。
つまり**「何もしない」ということを明示的に書き記す**ことが出来ます。
参考
部屋とYシャツとイテレータとジェネレータと私
# 終わり