本記事ではPythonのfor文の使い方についてまとめていきます。
記事の最後にはfor文の使い方について理解できているかの確認のために簡単な問題を載せています。
for文の基本的な使い方
for文はイテラブルオブジェクト(リスト、タプル、辞書、文字列など)から要素をひとつずつ取り出して処理することができます。
for文の書き方は、
for 変数名 in イテラブルオブジェクト:
取り出した要素に何かする
sample = ['ウ', 'ホ', 'ウ', 'ホ']
for element in sample:
print(element)
"""結果
ウ
ホ
ウ
ホ
"""
sample = ('ウ', 'ウ')
for element in sample:
print(element, end="ホ")
print()
"""結果
ウホウホ
"""
sample = {'1': 'python', '2': 'python', '3': 'python'}
for key, value in sample.items():
print("{}位は{}です".format(key, value))
"""結果
1位はpythonです
2位はpythonです
3位はpythonです
"""
sample = "今度の日曜日は彼女とディズニーランドに行くことにしよう。あ、彼女いないんだった。"
for character in sample:
print(character)
"""結果
悲しい事実だから省略
"""
range, zip, enumerate
for文はrange関数, zip関数, enumerate関数などと組み合わせることで便利な使い方ができます。
range関数
range関数はrange(start, end, step)という形式になっており、指定した範囲の値を取得できる。startとstepは省略できるがendは必ず指定する必要がある。
for i in range(3):
print(i)
"""結果
0
1
2
"""
startを省略すると0から始まり、end-1までの値を取得できる。
stepはデフォルトで1になっていて、この値をいじることにより偶数のみの値を取得したり逆順で取り出したりできる。
for i in range(0, 5, 2):
print(i, end=" ")
print()
"""結果
0 2 4
"""
逆順で取り出すにはstepに負の値を渡す。
for i in range(3, 0, -1):
print(i)
"""結果
3
2
1
"""
zip関数
zip関数を使うと複数のイテラブルオブジェクトを並列的に処理することができる。
students_name = ["Bob", "John", "Gorilla"]
students_id = ["s1200001", "s1200002", "s1200003"]
for name, id in zip(students_name, students_id):
print("{} {:>7s}".format(id, name))
"""結果
s1200001 Bob
s1200002 John
s1200003 Gorilla
"""
なお、長さが異なるイテラブルオブジェクトをzip関数に渡した場合、その中で一番サイズが小さいイテラブルオブジェクトを処理し終えたときにzip関数は終了する。
students_name = ["Bob", "John"]
students_id = ["s1200001", "s1200002", "s1200003"]
for name, id in zip(students_name, students_id):
print("{} {:>7s}".format(id, name))
"""結果
s1200001 Bob
s1200002 John
"""
enumerate関数
enumerate関数にイテラブルオブジェクトを渡してfor文を使うと、イテラブルオブジェクトの要素とそのインデックスを取得することができます。
for文の一つ目に書かれたi
がインデックスが入り、二つ目に書かれたname
にリストの要素が入っている。
team = ["巨人", "阪神", "中日", "近鉄", "ヤクルト", "広島"]
for i, name in enumerate(team):
print("{}位: {}".format(i+1, name))
"""結果
1位: 巨人
2位: 阪神
3位: 中日
4位: 近鉄
5位: ヤクルト
6位: 広島
"""
enumerate関数はrange関数と同様に0から始まりイテラブルオブジェクトのサイズー1までの値を取得でき、さらに開始インデックスも指定できます。
japanese = ["蓮〇", "〇舫"]
for i, name in enumerate(japanese, 2):
print("{}: 「{}位じゃだめなんですか?」".format(name, i))
else:
print("だめです。")
"""結果
蓮〇: 「2位じゃだめなんですか?」
〇舫: 「3位じゃだめなんですか?」
だめです。
"""
breakとcontinue
ある条件を満たしたときにループを終了させたいときは、break
文を使います。
x = [2, 3, 61, -1, 13]
for v in x:
if v == -1:
break
print(v)
"""結果
2
3
61
"""
ある条件を満たしたときに、そのステップの残りの処理をせずに次のステップの処理に移りたい場合はcontinue
を使う。
x = [2, 3, 61, -1, 13]
for v in x:
if v == -1:
continue
print(v)
"""結果
2
3
61
13
"""
for else文
for文が終了したときに何らかの処理をしたいときはelse
文が使える。
japanese = ["蓮〇", "〇舫"]
for i, name in enumerate(japanese):
print("{}: 「{}位じゃだめなんですか?」".format(name, i+2))
else:
print("だめです。")
"""結果
蓮〇: 「2位じゃだめなんですか?」
〇舫: 「3位じゃだめなんですか?」
だめです。
"""
break
文を使ってfor文が途中で終了したときはelse
文が実行されない。
japanese = ["蓮〇", "〇舫"]
for i, name in enumerate(japanese):
print("{}: 「{}位じゃだめなんですか?」".format(name, i+2))
if i+2 == 2:
break
else:
print("だめです。")
"""結果
蓮〇: 「2位じゃだめなんですか?」
"""
リスト内包表記
リスト内包表記を使うとfor文をシンプルに書くことができ、次のように書きます。
[要素に何らかの処理 for 変数名 in イテラブルオブジェクト]
例えば、20以下の2の倍数が入ったリストを用意するにはふつうに書くと、
l = []
for v in range(2, 21, 2):
l.append(v)
print(*l)
"""結果
2 4 6 8 10 12 14 16 18 20
"""
リスト内包表記にすると
l = [v for v in range(2, 21, 2)]
print(*l)
"""結果
2 4 6 8 10 12 14 16 18 20
"""
与えられた要素を2倍したいときは、
l = [v*2 for v in range(2, 21, 2)]
print(*l)
"""結果
4 8 12 16 20 24 28 32 36 40
"""
10で割り切れる要素をリストに入れたくないときは、
l = [v*2 for v in range(2, 21, 2) if v%10]
print(*l)
"""結果
4 8 12 16 24 28 32 36
"""
ここでやっていることは、与えられた要素が10で割ったときに余りがあるものを2倍してリストに入れています。
10で割り切れるものは2倍、割り切れないものは3倍したいときは、
l = [v*2 if v%10 == 0 else v*3 for v in range(2, 21, 2)]
print(*l)
"""結果
6 12 18 24 20 36 42 48 54 40
"""
[if文がTrueのとき if 条件式 else if文がFalseのとき for 変数名 in イテラブルオブジェクト]
if文はfor文の後に書きましたが、if-else文はfor文の前に書きます。
二重リスト内包表記?
なんて呼ぶのかわからないけどこういうやつ。
l = [[1, 2, 3], [1, 2, 3]]
print(l)
"""結果
[[1, 2, 3], [1, 2, 3]]
"""
これをリスト内包表記を使って作るには、
l = [[i+1 for i in range(3)] for _ in range(2)]
print(l)
"""結果
[[1, 2, 3], [1, 2, 3]]
"""
問題
▶をクリックすればヒントや解答例が見れるようになっています。
(例)ここをクリックすると中身が見れます。
(^^
問題①
- 次のような2つのリストx, yが与えられたとき、for文を使って私はゴリラです。と最後に改行を入れて1行で出力してください。
x = ['私', 'ゴ', 'ラ', 'す']
y = ['は', 'リ', 'で', '。']
ヒント①
zip()を使う。
ヒント②
print関数の引数endをどうすればいい? print関数についての記事はこちら。
解答例
x = ['私', 'ゴ', 'ラ', 'す']
y = ['は', 'リ', 'で', '。']
for cx, cy in zip(x, y):
print(cx + cy, end='')
else:
print()
出力結果
> python question1.py
私はゴリラです。
>
問題②
- 次のようなリストが与えられたとき、for文を使って偶数のみを出力してください。このときif文を使うのは禁止です。
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ヒント①
range()を使う。
解答例
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in range(1, len(x), 2):
print(x[i])
出力結果
> python question2.py
2
4
6
8
10
>