TL;DR
Python には for 文 と while 文 の 2 種類のループがある。ループとは処理の繰り返しである。for 文は、リストなどのオブジェクトを対象に、要素の数だけ処理を繰り返す。
Python はイテレータを頻繁に使う。イテレータとは、リストや辞書などから要素を一つずつ取り出して返すものである。
for 文 のポイント
for 変数 in 文字列・リスト・辞書 :
実行文
- リストなどのオブジェクトを対象に、要素の数だけ処理を繰り返す
- for のループの中に break 文を入れると、ループを中止する
- for には、正常終了したかチェックする else がある
- 特定の回数の繰り返し処理が必要なときは、range 関数を用いる
- enumerate()を使うと、要素と一緒にカウントも繰り返す
- for 文は、変数のスコープをブロック内に限定しない
文字列の挙動
文字列はイテラブル(繰り返し可能)なオブジェクトなので、for 文で文字列を使えば、1 文字ずつ str 型(文字列を扱う型)の要素が渡されることが分かる。
for i in 'hello':
print(i)
# h
# e
# l
# l
# o
break
for のループの中に break 文を入れると、ループを中止する。数値や文字列でも中止される。
n = [1,2,3,4,5]
for hoge in n:
print(hoge)
if hoge == 3:
break
# 1
# 2
# 3
w = 'hellowold'
for i in w:
if i == 'o':
break
print(i)
# h
# e
# l
# l
continue
for ループに continue を入れると、ループの次のイテレーションにジャンプする。
n = [1,2,3,4,5]
for hoge in n:
if hoge % 2 == 0: # 偶数の時
continue # スキップする
print(hoge)
# 1
# 3
# 5
break と else
for には、正常終了したかチェックする else がある。break が呼び出されなければ、else 文が実行される。
次に示すコードは、文字列の中に特定の単語が含まれているときに break によって処理を中止し、見つからないときに else 文を実行するものである。
指定した文字を発見すると、break で中止されるが、
w = 'abcde'
for i in w:
if i == 'c':
print(f"{i} 感知しました!")
break
print(i)
else:
print("問題ありません")
# a
# b
# c 感知しました!
以下に示すコードでは、break が呼び出されないので else 文が実行されている。
w = 'abcde'
for i in w:
if i == 'z':
print(f"{i} 感知しました!")
break
print(i)
else:
print("問題ありません")
# a
# b
# c
# d
# e
# 問題ありません
このように、処理が最後まで実行されたことを確認したい場合などに使うと便利である。
range()
特定の回数の繰り返し処理が必要なときは、range 関数を用いる。range() はイテラブル(繰り返し可能)なオブジェクトを返すので、戻り値は for in で反復処理をする。
あらかじめ大きなデータ構造を作らなくても、指定した範囲の数値のシーケンス(list, tuple, range)を返すことができる。処理を ○ 回繰り返したいという場合に役立つ。
for value in range(5):
print('Hi!')
# Hi!
# Hi!
# Hi!
# Hi!
# Hi!
range(n) の n に整数を渡すと、0 から n-1 までのオブジェクトを順に返す。次に示すコードの n には、0〜4 までが格納されている。
for n in range(5):
print(n)
# 0
# 1
# 2
# 3
# 4
range() は range(start, stop, step) で使う。start を省略すると 0 が先頭になる。stop は必須である。step のデフォルト値は 1 になる。
for i in range(0, 5):
print(i)
# 0
# 1
# 2
# 3
# 4
2 から 10 までの偶数を返す。
for i in range(2, 11, 2):
print(i)
# 2
# 4
# 6
# 8
# 10
1 から 9 までの奇数の総和を計算
s = 0
for i in range(1, 10, 2):
s = s + i
s
# 25
変数のスコープ
for 文の中で定義した変数は、ブロック外で上書きされる。
for i in range(2):
pass
i # 1
for i in range(5):
pass
i # 4
enumerate()
組み込み関数 enumerate()は、要素と一緒にカウントも繰り返す。1 から開始したい場合は、第二引数に start=1 を指定する。
chars = 'word'
for count, char in enumerate(chars):
print(f'{count}番目の文字は{char}')
# 0番目の文字はw
# 1番目の文字はo
# 2番目の文字はr
# 3番目の文字はd
lang = set(('Python', 'Go', 'Rust', 'Java', 'Python'))
for count, i in enumerate(lang, start=1):
print(f'言語{count}:{i}')
# 言語1:Rust
# 言語2:Go
# 言語3:Java
# 言語4:Python
len()
文字列内の文字数を数えることができる len() との組み合わせ。
words = ['one', 'two', 'three']
for w in words:
print(w, len(w))
# one 3
# two 3
# three 5