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

組み込み関数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シャツとイテレータとジェネレータと私

 終わり

hiroyuki_mrp
主にPythonに関する記事を投稿しています。
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした