かゆい所に手が届く解説

初心者はこれでOK!Pythonのfor文をマスター!

プログラミングの学習で、最初につまづきやすいのが「if文」と「for文」です。

この記事では、Python初学者がfor文を使って繰り返しの処理をするとき、「これだけ使えればまずはOK!」という内容をまとめました。

実務で使うにはまだまだ足りないことも多いのですが、その最初のステップ「0⇒1」としてこれだけはマスターしましょう!

この記事の対象者はPythonでprint文が使えればOKです。
できるだけ詳しく丁寧に説明しますので、安心して読み進めてください。

for文とrange関数の基礎

Pythonでfor文を使うパターンはいくつかありますが、そのうちの一つに「range関数との組み合わせ」があります。

①繰り返しの回数を指定する

これが最も基本となります。

「同じ処理を10回繰り返す」のような場合の使い方です。

例として、「こんにちは を10回print文で出力する」という場合、

for i in range(10):
    print('こんにちは')

これだけでOKです。

このとき、変数 i は i である必要はなく、a とか count などなんでも良いです。

※すでにPythonで使われている予約語などはNGです。

他のプログラミング言語を学習したことがあると、簡単すぎてビックリしますよね。

こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは
こんにちは

range関数の(カッコ内)には、繰り返したい回数を入れるだけです。

上の例は「処理を10回繰り返す」という使い方ですが、「数値をインクリメント(加算)しながら繰り返す」のような処理では少し勝手が違います。

例えば、「あなたは1回目の訪問です」のように数字の部分をループのたびに増やしたい場合、

for i in range(10):
    print('あなたは' + str(i) + '回目の訪問です')

となるのですが、このとき変数 i は「0から始まる」という点に注意してください。

補足:上記で「str(i)」としているのは、型変換と言います。

良く分からないという方は、とりあえず「変数 i は数値だから文字に直している」という理解で進めてください。

これを実行すると、

あなたは0回目の訪問です
あなたは1回目の訪問です
あなたは2回目の訪問です
あなたは3回目の訪問です
あなたは4回目の訪問です
あなたは5回目の訪問です
あなたは6回目の訪問です
あなたは7回目の訪問です
あなたは8回目の訪問です
あなたは9回目の訪問です

となります。

最初のループは変数 i の値が0なので、「あなたは0回目の訪問です」となります。

変数の値はループを繰り返すたびに1ずつ増えるので、10回目の「9」まで処理が繰り返されるのです。

これでは困る、という場合、次の②の方法で対応できます。

②「○~○」のように引数を二つ指定する

次に、range関数の引数に2つの値を指定する方法について紹介します。

上の①最後で紹介した様に、「1回目~10回目」という出力をしたい場合、

for i in range(1, 11):
    # 繰り返したい処理を記述

のように、range関数に2つの引数を「1, 10」と指定することで、「変数 i の値を1~10まで繰り返す」という指定ができます。

書式の意味は、

range(start, end)

ですが、endの値から「-1」した数まで繰り返すことになる点に注意してください。

改めて、上記のrange関数を使ってfor文にprint文を入れると、

for i in range(1, 11):
    print('あなたは' + str(i) + '回目の訪問

を実行した時、変数 i の値は「1から始まって10になるまでインクリメント(1ずつ加算)」されます。

あなたは1回目の訪問です
あなたは2回目の訪問です
あなたは3回目の訪問です
あなたは4回目の訪問です
あなたは5回目の訪問です
あなたは6回目の訪問です
あなたは7回目の訪問です
あなたは8回目の訪問です
あなたは9回目の訪問です
あなたは10回目の訪問です

③特定の数ずつ飛ばしたい

個人的にはあまり使いませんが、一応紹介します。

例えば、「1~10のうち奇数だけ出力したい」という場合、

for i in range(1, 11, 2):
    # 繰り返したい処理を記述

のように、range関数に3つの引数を「1, 11, 2」と指定することで、「変数 i の値を1~10まで2ずつ飛ばして繰り返す」という指定ができます。

書式の意味は、

range(start, end, step)

ですが、endの値から「-1」した数まで繰り返すことになる点に注意してください。

また、stepの値には飛ばしたい数を指定します。

改めて、上記のrange関数を使ってfor文にprint文を入れると、

for i in range(1, 11, 2):
    print('あなたは' + str(i) + '回目の訪問

を実行した時、変数 i の値は「1から始まって10になるまでインクリメント(1ずつ加算)」されます。

あなたは1回目の訪問
あなたは3回目の訪問
あなたは5回目の訪問
あなたは7回目の訪問
あなたは9回目の訪問

初心者向けの補足となりますが、同じ処理をif文でもできますね。

その例として、次のbreakとcontinueを使って説明します。

breakとcontinueをマスター!

これができれば「脱!超初心者」といえるでしょう。

最初は混乱するかもしれませんが、繰り返しやってみると理解できるようになります。

①breakが必要な場面

for文でbreakを使うのは、「繰り返しの途中でfor文をやめる場合」です。

例を見てみましょう。

for文を使って1~10の値を出力するのですが、5以上の値を出力したくないとき。

つまり、出力する値が5になったらfor文をやめたいという状況です。

for i in range(1, 11):
    if i <= 5:
        print(i)
    else:
        break

これを実行すると、

1
2
3
4
5

というように、5の時点で出力が終わりました。

これは、ifの条件である「i <= 5」を満たさなくなったときにelseの処理であるbreakが実行されたためです。

このように、for文の途中で繰り返しをやめる場合はbreakを使います。

②continueを使った処理

for文でcontinueを使うのは、「その繰り返しをスキップする場合」です。

例を見てみましょう。

for文を使って1~10の値を出力するのですが、奇数の値を出力したくないとき。

つまり、出力する値が奇数の場合にその回だけスキップしたいという状況です。

for i in range(1, 11):
    if i % 2 == 0:
        print(i)
    else:
        continue

これを実行すると、

2
4
6
8
10

というように、奇数の時は変数 i が出力されません。

これは、ifの条件である「i % 2 == 0」、つまり「2で割って余りが0」という条件を満たさないときにelseの処理であるcontinueが実行されたためです。

このように、for文の中でその繰り返しだけスキップする場合はcontinueを使います。

リストとの組み合わせ

基礎ではあまり紹介されませんが、覚えておいて絶対に損はしない処理です。

そして、必ず使うことになりますので、今のうちに覚えておくと良いです。

なお、リストについて分からない方はこちらの記事をご覧ください。

①リストから抜き出す基本

これが使えると「脱初心者」の第一歩です。

例として、次のようなリストを用意します。

data = ['papa3', 'mama3', 'ane3', 'yome3', 'fuji3']

このリストから、一つずつ名前を取り出して挨拶してみましょう。

papa3さん、こんにちは!
mama3さん、こんにちは!
ane3さん、こんにちは!
yome3さん、こんにちは!
fuji3さん、こんにちは!

この場合、名前をリストdata から順番に取り出して、「さん、こんにちは!」を付ければ良いので、for文は次のようになります。

for name in data:
    print(name + 'さん、こんにちは!')

という感じです。

このとき、変数 name は別に i でも you でもなんでも良いです。

for 一時的な変数名 in リスト名:
    # 繰り返したい処理を記述

「一時的な変数名」はfor文内でしか使われないので、何でも良いのです。

②実用例:リスト内の数字を合計する

上の①では、説明用のありきたりな例題でした。

実際にどういうときに使うの!?という実例を一つご紹介します。

次のリストを用意し、リスト内の数字を一つずつ取り出して合計します。

point_list = [95, 82, 66, 79, 88]

上の①と同じように、for文で一つずつ取り出し、値を加算していけば良いので、

point_list = [95, 82, 66, 79, 88]
total = 0

for point in point_list:
    total += point

print(total)

これを実行すると

410

となります。

少し解説をすると、合計値を出力するために2行目で変数 totalを定義しました。

for文内では、リストpoint_list から一つずつ取り出し、変数 totalに加法代入(足し算しながら代入する)しています。

最後にprint文で結果を出力(表示)しています。

多重ループの基礎

ここまででもう「おなか一杯!」という方は1週間後に見てください。

初学者向け、というと少し大変なのは十分わかっていますが、やはりこれも「脱初学者」を目指してほしい気持ちで紹介します。

①二重ループの仕組み

二重ループは初めて、という方には少し難しいかもしれません。

良く言われる表現として、「外側のループ」と「内側のループ」という説明があります。

外側と内側について理解するため、例として次のスクリプトを用意しました。

range関数の引数は(1, 4)としているため、変数の値は「1~3」を繰り返します。

for i in range(1, 4):
    for j in range(1, 4):
        print('iの値は', i, ' ', 'jの値は', j)
    print()

この時、4行目の空のprint()を入れることによって、内側のループが終わったときに1行空白行を入れています。(見やすくするため。)

これを実行すると、

iの値は 1   jの値は 1
iの値は 1   jの値は 2
iの値は 1   jの値は 3

iの値は 2   jの値は 1
iの値は 2   jの値は 2
iの値は 2   jの値は 3

iの値は 3   jの値は 1
iの値は 3   jの値は 2
iの値は 3   jの値は 3

となります。

このとき、「外側のループ」とは「変数i」のことを言い、「内側のループ」とは「変数j」のことを言います。

もう少し分かりやすい日常に合わせた例もご紹介します。

②二重ループの例題

1年は12カ月あります。

そこで、「外側のループ」は2000年から2002年まで繰り返し、「内側のループ」は1月から12月まで繰り返すスクリプトを用意しました。

range関数の第二引数(2003)はマイナス1(2002)となるため、2000年から2002年まで繰り返すことなります。

for i in range(2000, 2003):
    for j in range(1, 13):
        print(i, '年', j, '月')
    print()

実行すると、このようになります。

2000 年 1 月
2000 年 2 月
2000 年 3 月
2000 年 4 月
2000 年 5 月
2000 年 6 月
2000 年 7 月
2000 年 8 月
2000 年 9 月
2000 年 10 月
2000 年 11 月
2000 年 12 月

2001 年 1 月
2001 年 2 月
2001 年 3 月
2001 年 4 月
2001 年 5 月
2001 年 6 月
2001 年 7 月
2001 年 8 月
2001 年 9 月
2001 年 10 月
2001 年 11 月
2001 年 12 月

2002 年 1 月
2002 年 2 月
2002 年 3 月
2002 年 4 月
2002 年 5 月
2002 年 6 月
2002 年 7 月
2002 年 8 月
2002 年 9 月
2002 年 10 月
2002 年 11 月
2002 年 12 月

③多重(3重)ループの例題

3重でも4重でもループの考え方は同じです。

年月日を3重ループで実現する場合、次の様にします。

なお、今回は結果を簡単にするため、2000年~2002年>1月~3月>1日~3日のみをループしています。

for year in range(2000, 2003):
    for month in range(1, 4):
        for day in range(1, 4):
            print(year, '年', month, '月', day, '日')
        print()

実行すると、

2000 年 1 月 1 日
2000 年 1 月 2 日
2000 年 1 月 3 日

2000 年 2 月 1 日
2000 年 2 月 2 日
2000 年 2 月 3 日

2000 年 3 月 1 日
2000 年 3 月 2 日
2000 年 3 月 3 日

2001 年 1 月 1 日
2001 年 1 月 2 日
2001 年 1 月 3 日

2001 年 2 月 1 日
2001 年 2 月 2 日
2001 年 2 月 3 日

2001 年 3 月 1 日
2001 年 3 月 2 日
2001 年 3 月 3 日

2002 年 1 月 1 日
2002 年 1 月 2 日
2002 年 1 月 3 日

2002 年 2 月 1 日
2002 年 2 月 2 日
2002 年 2 月 3 日

2002 年 3 月 1 日
2002 年 3 月 2 日
2002 年 3 月 3 日

となります。

多重ループの場合も、基本的に最も内側から順にループが行われ、外側のループが終わると全てのループが終了することになります。

for文を使った九九表の作成

今回紹介したfor文を使った九九表の作成について、こちらの記事で紹介しています。

for文について理解を深めたいという方はぜひご覧ください。

まとめ

今回はPython初心者向けに最低限覚えて欲しいfor文の使い方を解説しました。

初心者の方に向けて説明しているので、経験者の方には解説が長いと思われたかもしれませんね。

他にもやり方はありますが、ここで紹介した内容をベースとして、他の方法も試してみると良いでしょう。

Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。

それでは、ステキなPythonライフを!

ABOUT ME
papa3
某教育機関で現役の講師をしながら、ブログとYouTubeでプログラミングの情報を発信しています。個人でもウェブアプリケーション開発と運営をしながら本業収入<副業を目指しています!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です