Pythonを勉強するために本を買ったけど,積読してる.
繰り返し文を学んでるけど,while文とfor文の違いがよくわからない.
図とかがあれば,理解しやすいのに.
そんな方が,繰り返し処理(while文やfor文)を理解するための記事です.
本記事の内容
前回の「if文」から引き続き,複合文を解説しています.if文は上から下に分岐して処理が進んでいましたが,同じことを2回以上行いたいこともあるでしょう.今回は,そのような時に使うループ(繰り返し)のwhile文,for文です.まずは,while文,for文を解説し,それに付随して内包表記やその他の制御構文について解説します.これまでの記事と同様に,コードを打ちながら学んで行きましょう.余力のある方は,部分的にコードを変更して実験してみましょう.
while文
条件式が成立する場合(Trueの間は)のみ,(False となるまで),与えられたブロックの処理を繰り返します.
while文の書き方
whileに続いて半角スペースを挟んで,条件式の後にコロンをつけます.次のブロックに,繰り返す処理を記述します.
繰り返す処理
while文の使用例
number = 1 # 変数numberに1を代入 while number <= 10: # numberと10を比較し,10以下であれば,次のブロックを繰り返す. print("No.", number) # No.の後にnumberを置いて出力する. number += 1 # numberに1を加える.再び,numberと10を比較する.
No. 2
No. 3
No. 4
No. 5
No. 6
No. 7
No. 8
No. 9
No. 10
number = 1 # 変数numberに1を代入 result = 0 # 変数resultに0を代入 while number <= 10: # numberと10を比較し,10以下であれば,次のブロックを繰り返す. result += number # resultにnumberを加える. number += 1 # numberに1を加える. print("最終的なnumberは", number, "1~10を足した合計は", result)
全角の中点 "・・・・" をパスワードとして,ログインするプログラムです.パスワードを間違える(ここでは初めに"Python"と入力しています)と,繰り返し入力を要求されます.
pw = "" # pw に初期値として "" を設定する. while pw != "・・・・": # pw が ・・・・ではない間,処理を繰り返す. pw = input("パスワードを入力してください:") # pw に文字を入力する. print(pw, "と入力されました。") print("ログインしました")
Python と入力されました。
・・・・ と入力されました。
ログインしました!
無限ループとその脱出,またはスキップ
- break
- continue
break
while文の繰り返しが無限ループしているときに,途中でループを止めるために使用します.
前述の1つ目のWhileの使用例で示したコードについて,number += 1を記述し忘れると,無限ループとなります.実行しないでください!
number = 1 while number <= 10: print("No.", number) # number += 1を記述しなかったり,インデントを忘れてしまうと,1がループします.
実行してしまった場合は,以下を入力して,中断してください.
Windowsの場合は Ctrl + C
Macの場合control + C
あえて無限ループを実行する場合もあります.
例えば,ある条件が成立するまでループを継続したいが,いつ成立するか分からない場合です.
その場合は,繰り返し処理の中で if 文をブロック内に記述して「特定の条件を満たすときに繰り返し処理を終了」となります.
ちなみに,もし条件を記述しなければ,「No. 1」以上の無限ループとなります.
number = 1 while True: if number == 8: break print('No.', number) number += 1
No. 2
No. 3
No. 4
No. 5
No. 6
No. 7
19の倍数がいくつで551になるか確認するプログラムです.
x = 19 number = 1 while x <= 551: if x == 551: break print(x) number += 1 x = x * number print(number,"で551がある時")
38
114
456
29 で551がある時
continue
while 文の繰り返しのブロックの残りの部分をスキップして次の繰り返しに移ります.
xが10以下の場合,奇数ならスキップし,偶数なら出力するプログラムです.
x = 0 while x <= 10: x += 1 if (x % 2) == 1: # xを2で割った余りが1のとき continue print(x) # 値を出力
4
6
8
10
while True: text = input("IDを入力してください") if text != "・・・・": continue pw = input("パスワードを入力してください") if pw == "・・・・": break print("ログインしました!")
パスワードを入力してください
・・・・
ログインしました!
for文
シーケンス (文字列、タプルまたはリスト) や、その他の反復可能なオブジェクト (iterable object) 内の要素に渡ってを順に取り出して,与えられたブロックの処理を繰り返します.
for文の書き方
forに続いて半角スペースを挟んで,変数 in 繰り返しのオブジェクト,コロンをつけます.次のブロックに,繰り返す処理を記述します.与えられたオブジェクトが,順次,変数に代入され,繰り返し処理が実行されます.
繰り返す処理
in以下でイテラブルなものを受け取り,「イテレータ」という「ひとつずつ値を取り出せる仕組み」を生成してforループで回しています.
データそのものだけではなく、データの並びを生成できるものも入れられます.
for文の使用例
反復可能なオブジェクトとして,文字列,リスト,辞書について使用例を列挙してみます.
文字列
shelf_py = "棚からPython" for x in shelf_py: print(x)
か
ら
P
y
t
h
o
n
もし,while文で記述した場合,下記のようになります.
shelf_py = "棚からPython" offset = 0 # オフセット値の初期値0として変数offsetに代入 while offset < len(shelf_py): # オフセット値 がshelf_pyの間、ループを繰り返す. print(shelf_py[offset]) offset += 1
か
ら
P
y
t
h
o
n
間違いではないですが,前者の方が”パイソニック”なコードですよね.
リスト
list_num=[0, 1, 2, 3, 4, 5, 6, 7, 8] for x in list_num: print(x * x)
1
4
9
16
25
36
49
64
breakやcontinueを使用することもできます.
life = ["family", "health", "hobby", "money", "work"] for x in life: if x == "work": break print(x)
health
hobby
money
辞書
辞書を反復処理すると,キーが1つずつ取り出されます.
dict_ex1_1 = {"one": 1, "two": 2, "three": 3, "four":4, "five": 5} for key in dict_ex1_1: # 変数keyに代入 print(key)
two
three
four
five
キーではなく,バリューを反復処理させたいときは,value()メソッドを使います.
dict_ex1_1 = {"one": 1, "two": 2, "three": 3, "four":4, "five": 5} for value in dict_ex1_1.values(): # value()メソッドを記述したオブジェクトを,変数valueに代入 print(value)
2
3
4
5
キーとバリューを同時に反復処理させたいときは,items()メソッドを使います.
dict_ex1_1 = {"one": 1, "two": 2, "three": 3, "four":4, "five": 5} for item in dict_ex1_1.items(): #value()メソッドを記述したオブジェクトを,変数valueに代入 print(item)
('two', 2)
('three', 3)
('four', 4)
('five', 5)
items()メソッドの戻り値は,異なる二つの変数に代入できます.
dict_ex1_1 = {"one": 1, "two": 2, "three": 3, "four":4, "five": 5} for key, value in dict_ex1_1.items(): # value()メソッドを記述したオブジェクトを,変数valueに代入 print(key, value)
two 2
three 3
four 4
five 5
"range型"による数値シーケンスの生成
組み込み関数であるrangeは,一定間隔での数値の並びを生成します.一般にforループにおいて特定の回数のループに使われます.正確にはrangeはクラスの1つであり,range関数で生成されるものはrangeオブジェクトです.
range(停止値) → 0から停止値の1つ前までの整数を生成
range(11)
停止位置のみ引数として,実行した場合,開始値と停止値が引数となったrangeが出力されます.
list(range(11))
rangeをlistに変換すると,停止値の1つ前までの整数のリストが出力されます.
range(開始値, 停止値) → 開始値から停止値の1つ前までの整数を生成
range(1, 11)
list(range(1, 11))
range(開始値, 停止値, 間隔) → 開始値から停止値の1つ前までの整数を,指定した間隔ごとに生成
list(range(1, 11, 2))
list(range(0, -11, -1))
for文で繰り返すと,前述の文字列やlistのように,後ろに続くrangeから数値を1個ずつ取り出して i に格納します.
for i in range(11): print(i)
1
2
3
4
5
6
7
8
9
10
内包表記
リストや辞書,集合の記事では,括弧で囲んだり,関数を用いて作成していましたね.内包表記は,各要素に関数を適用し,新しいオブジェクトを取得する表記方法です.
リスト内包表記
list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8] list_x = [x * x for x in list_num] # list_numから要素を1つずつ取り出してxに代入し,x*xを計算.そのリストをlist_xとして出力 list_x
さらに条件式を追加することもできます.
list_num = [0, 1, 2, 3, 4, 5, 6, 7, 8] list_x = [x * x for x in list_num if x % 2 == 0] # もしxが2で割り切れる値(偶数)だった場合,list_numの要素をxに代入し,x*xを繰り返す.そのリストをlist_xとして出力 list_x
その他の文
例外処理のtry-except文,ファイルを開いて処理を実行後,終了時に自動的に閉じるwith文,2021にPython10.1からリリースしたmatch文があります.
繰り返しについて,基本を学べましたでしょうか?
次は自作関数について学びましょう!
最後まで読んでくださり,ありがとうございます☺️