【プログラミング】pythonで繰り返し処理を実行するプログラムの書き方

python

pythonの「繰り返し処理」は、主にwhileforを使ったコードで書きます。

特定の条件のある限り繰り返す、特定の条件まで繰り返す、または繰り返しの回数を指定することも可能です。

繰り返しは、条件分岐と同様にpythonに関わらず、プログラミングにおいて凄く重要な部分となります。

繰り返し処理と条件分岐が使えるようになることで、単純作業の自動化プログラムの開発や、作業の一部だけを自動化することも出来るようになるため、事務作業でのデータ入力などの実践的なプログラムも書くことができるようになってきます。

文字出力や変数コレクションを用いたデータ、IF文を用いた条件分岐の扱い方は他の記事で紹介しています。

pythonで繰り返しの処理をするためにはwhile文かfor文をつかう

while文もしくはfor文を使う

while文

while 条件式:
条件が成立した際の処理(whileブロック)

以下、サンプルコードは変数aが10になるまで繰り返す

入力内容

a = 0
while a < 10:
print(a)
a = a + 1

実行結果 aという変数が10より小さい間は繰り返す(条件指定)

0 
1 
2 
3 
4 
5 
6 
7 
8 
9

for文

for 変数 in range(x):
繰り返し処理

xに回数を指定した数値を書く

以下、サンプルコードは10回繰り返す

入力内容

for a in range(10):
    print(a)
    a = a + 1

実行結果 0から9までの10回を繰り返す(回数指定)

0
1 
2 
3 
4 
5 
6 
7 
8 
9

while文、for文それぞれの詳細を確認していきます。
本記事も「スッキリわかるPython入門」に掲載されている内容を参考に解説します。

繰り返しの基本構造

while文

入力内容

x = int(input('数値を入力してください>>'))
count = 1

while count < 10:
    ans = x * count
    print(f'{x}×{count}のこたえは{ans}です。')
    count += 1

※1行目のinput関数の処理で入力した値は文字列認識される為、int型に変換することで整数とみなされる。

while 条件式:
条件が成立した際の処理(whileブロック)


whileの中で繰り返し処理したい内容をインデント(字下げ)して記載します。ジュピターラボや一部のエディターでは、Tabキーを使う事でインデントが可能です。

[ポイント]
このコードでは2行目で変数countに1が代入されますので、while文の条件式にある「変数count < 10」に従い変数countの値が1~9の場合に繰り返し処理を実行することになります。

実行結果

数値を入力してください>> 2
2×1のこたえは2です。
2×2のこたえは4です。
2×3のこたえは6です。
2×4のこたえは8です。
2×5のこたえは10です。
2×6のこたえは12です。
2×7のこたえは14です。
2×8のこたえは16です。
2×9のこたえは18です。
<strong>Deviko</strong>
Deviko

入力した数値に1~9を掛けた答えを返してくれている処理と言うことなのね。

[繰り返しをつかうメリット]

例えば、0と値をもった変数に1を足すプログラムがあるとします。

それを10,000回繰り返すコードを1行ずつ書くことも物理的には可能ですが、あまり現実的な方法ではありません。

プログラムはコード量が増えれば増えるほど、誤りも発生しやすく、間違った箇所を見つけにくくなる傾向があります。

while文:状態による繰り返し

入力内容

is_woman = False
count = 0

while is_woman == False:
    count += 1
    print(f'本日は女性限定イベント日です。あなたは{count}人目の来館者です。')
    key = input('あなたは女性ですか?(y/n)>>')
    if key == 'y':
        is_woman = True
print('ようこそいらっしゃいました、ご入館くださいませ。')

[解説]
上記のコードは、女性の場合はその後のメッセージを表示するプログラムとなります。

そのため、入力内容の値(来館者)が男性の場合は、whileブロックを繰り返し実行するプログラムとなります。

[ポイント]
変数is_woman の判定式がFalseの間はずっと同じ問いを繰り返すというプログラムとなります。


男性と女性の2択の分岐処理で、入力での回答が 「 y 」であれば女性となりTrueを、回答が 「 n 」 であればFalseが代入され判定することになります。

実行結果

本日は女性限定イベント日です。あなたは1人目の来館者です。
あなたは女性ですか?(y/n)>> n
本日は女性限定イベント日です。あなたは2人目の来館者です。
あなたは女性ですか?(y/n)>> n
本日は女性限定イベント日です。あなたは3人目の来館者です。
あなたは女性ですか?(y/n)>> n
本日は女性限定イベント日です。あなたは4人目の来館者です。
あなたは女性ですか?(y/n)>> n
本日は女性限定イベント日です。あなたは5人目の来館者です。
あなたは女性ですか?(y/n)>> y
ようこそいらっしゃいました、ご入館くださいませ。
来館者の数となる変数countは繰り返し回数分だけ現在値に+1をしていきます。
正誤や2択でよく使うbool型の値を代入する変数にはis_〇〇〇のような変数名にすることがよくあります。

while文:繰り返しによるリスト作成

入力内容

count = 0 #カウンタ変数
pokemon_num = int(input('ポケモンの数を入力してください。>>'))#ポケモンの数を入力
score_list = list()#空のリストを作成するコード

while count < pokemon_num:#2行目で入力した数分繰り返す条件式
    count += 1
    score = int(input(f'{count}匹目のポケモンの可愛さポイントを入力 >>'))
    score_list.append(score)
print(score_list)
total = sum(score_list)
print(f'可愛さポイントの合計点は{total}点です。')
print(f'可愛さポイントの平均点は{total//pokemon_num}点です。')

[解説]
このプログラムでは、ポケモンの数分だけ可愛さポイントを入力し、可愛さポイントの合計点平均点を出力するプログラムとなります。


score_list = list()
で作ったリストは空の状態で作成しています。


繰り返し処理内のインプット関数で可愛さポイントを代入していくことなりますが、リスト作成時点では()を書き、値は何も代入されていません。

<strong>komori</strong>
komori

リスト内に値を代入する場合、繰り返しで実行すると非常に便利です。

実行結果

ポケモンの数を入力してください。>> 5
1匹目のポケモンの可愛さポイントを入力 >> 10
2匹目のポケモンの可愛さポイントを入力 >> 20
3匹目のポケモンの可愛さポイントを入力 >> 30
4匹目のポケモンの可愛さポイントを入力 >> 40
5匹目のポケモンの可愛さポイントを入力 >> 50
[10, 20, 30, 40, 50]
可愛さポイントの合計点は150点です。
可愛さポイントの平均点は30点です。

[解説]
実行結果の場合、ポケモンの数を5と入力したので、1~5までのポケモンの可愛さポイントを入力するプログラムが繰り返し実行されます。

サンプルでは、10、20、30…50と入力した値が順番にリストに代入されていきます。

最後にリスト内の値の合計点と平均点が出力しています。

<strong>Deviko</strong>
Deviko

リストは、データの順序関係があって重複データの代入も出来たのよね。

while文:繰り返しによるリスト要素の利用

入力内容

scores = [10,20,30,40,50]
count = 0
while count < len(scores):
    if scores[count] >= 25:
        print(f'{count + 1}匹目のポケモンの可愛さは合格です。')
    else:
        print(f'{count + 1}匹目のポケモンの可愛さは不合格です。')
    count += 1

[解説]
リスト内の値はまとめて代入しています。
リスト内の値を順に判定し、25以上であれば「合格」の案内文、25未満であれば「不合格」の案内文を表示する動作を繰り返すプログラムとなっています。

繰り返す回数については、 count < len(scores)となりますが、これはリスト内の要素数の数となりますが、1行目でリスト内の要素数は5つとなっていますので、変数であるcountの値が5よりも小さい値の間は繰り返すことになり、0 → 1 → 2 → 3 → 4 の計5回の繰り返しが発生します。

[ポイント]
繰り返しを利用してリストの要素を参照する

カウンタ変数 = 0
while カウンタ変数 < len(リスト):
リスト[カウンタ変数]を使った処理
  カウンタ変数 += 1

<strong>komori</strong>
komori

リストの中の要素数を返すlen関数を用いて、5回繰り返すことになっていることが分かりますね。

実行結果

1匹目のポケモンの可愛さは不合格です。
2匹目のポケモンの可愛さは不合格です。
3匹目のポケモンの可愛さは合格です。
4匹目のポケモンの可愛さは合格です。
5匹目のポケモンの可愛さは合格です。
<strong>Deviko</strong>
Deviko

変数のcountは + 1をしないと、0~4匹目のポケモンというメッセージが返ってくるので注意よね。

for文

続いてfor文での繰り返し処理を紹介します。
こちらの方が一般的なコードの書き方となるので、繰り返し処理と言えばfor文を使うとイメージです。


冒頭にも記載しましたが、プログラムは条件分岐と繰り返し処理が多く使われます。
そのため、繰り返しはプログラミングを学習する上で外せない重要な点となります。

for文:基本の繰り返し

入力内容

scores = [20,30,15,50,60]

for data in scores:
    if data >= 25:
        print(f'{scores.index(data)+1}匹目のポケモンの可愛さは合格です。')
    else:
        print(f'{scores.index(data)+1}匹目のポケモンの可愛さは不合格です。')
※for文で使われているdataは変数となります。

for文もwhile文と同様に繰り返しおこないたい処理をインデントして記載します。
上記コードでリストscoresは5つの要素があるので、for文で5回繰り返すことになります。

【for文の基本的な書き方】

for 変数 in リスト:
繰り返し処理

<strong>Deviko</strong>
Deviko

print関数で文字を表示するコードも、スッキリした書き方に変えたのね。

比較できるように、本記事のwhile文と同じ処理になるようにfor文でも書いています。
scores.index(data)を使ってリストのscoresの何番目の値であるかを返す処理をしていますが、注意すべき点としてscoresの要素は0~4番となることから最後に+1をしている点です。


実行結果

1匹目のポケモンの可愛さは不合格です。
2匹目のポケモンの可愛さは合格です。
3匹目のポケモンの可愛さは不合格です。
4匹目のポケモンの可愛さは合格です。
5匹目のポケモンの可愛さは合格です。

for文:決まった回数の繰り返し

入力内容

for num in range(3):
    print('ポケモンはみんなかわいい。')

決まった回数がある場合のfor文で繰り返し処理のコードです。range関数を用いて繰り返す回数を指定します。

for 変数 in range(n):
繰り返し処理

※nは繰り返す回数を入力する。

実行結果

ポケモンはみんなかわいい。
ポケモンはみんなかわいい。
ポケモンはみんなかわいい。

繰り返し(ループ)処理におけるwhile文とfor文を区別する考え方

while文とfor文の使い分けについては、下記のような場合と考えておきましょう。

・繰り返しの回数の目処が立たない時:while文

・繰り返しの回数の目処が立つ時:for文

例えば、サイコロを振って出目が6になるまで繰り返す場合はwhile文を使ってコードを書き、3回サイコロを振って出目の合計を返すプログラムの場合は、for文でコードを書く方といったイメージです。

入力内容

#サイコロの出目が6になるまで処理を繰り返す
import random#ランダム関数を使うための準備コード
is_dice = True

while is_dice == True:#Trueの間繰り返す
    num = random.randint(1,6)#数値1~6をランダムで生成するコード
    print(f'サイコロの目は{num}です。')
    if num == 6:
        is_dice = False
print(f'{num}がでましたので処理を終了します。')

実行結果

サイコロの目は3です。
サイコロの目は2です。
サイコロの目は1です。
サイコロの目は2です。
サイコロの目は1です。
サイコロの目は4です。
サイコロの目は5です。
サイコロの目は5です。
サイコロの目は6です。
6がでましたので処理を終了します。
<strong>Deviko</strong>
Deviko

サイコロの出目が6になる回数は目処が立たないから、while文を使って書いてるってわけね。

入力内容

#サイコロを3回振り、出目と合計を計算し表示する。
import random#ランダム関数を使うための準備
total = 0

for count in range(3):
    count += 1
    num = random.randint(1,6)#数値1~6をランダムで生成する
    total = total + num
    print(f'サイコロは{count}回目の出目は{num}でこれまでの合計は{total}です。')

実行結果

サイコロは1回目の出目は4でこれまでの合計は4です。
サイコロは2回目の出目は6でこれまでの合計は10です。
サイコロは3回目の出目は2でこれまでの合計は12です。

繰り返し処理の制御

break文:繰り返しの強制終了

繰り返しを強制終了するコードはbreak文を使います。
break文は繰り返し処理自体を終了します。

入力内容

scores = [10,20,30,40,50,60,70,80,90,100]#リスト
n = 5 #抽出数
samples = list()#スコアを格納するリスト

for data in scores:
    if 20 <= data < 80:
        samples.append(data)
        if len(samples) == n:
            break#強制終了する際のコード
print(f'抽出されたリスト内の値は{samples}です。')   

[解説]
変数nの5は、リストsamplesの要素の抽出数を条件として指定しています。つまり、1行目のリストscoresから5つの値を取り出したかを判定し、Trueであれば終了します。

更に、if 20 <= data < 80:の条件判定で20以上80未満の数値を取り出す指定をしているため、リストscoresの値から範囲内に当てはまる値を5つ取り出し、リストsmplesに格納するプログラムとなります。

実行結果

抽出されたリスト内の値は[20, 30, 40, 50, 60]です。
<strong>komori</strong>
komori

リストsamplesに取り出せる条件1の20以上80未満にでは、20,30,40,50,60,70の6つの値を取り出すことになります。
しかし、条件2のリストsamplesの要素数が5になるとbreak文が実行されるため、70は除外されています。

continue文:繰り返しのスキップ

繰り返しをスキップするコードはcontinue文を使います。
continue文は現在の回数のみ中断して、次の回の処理に進みます。

入力内容

scores = [10,20,'返事がない',40,50,'言いたくない',70,80,90,100]#リスト
samples = list()#スコアから抜き出した値を格納する空のリスト

for data in scores:
    if not isinstance(data, int):#整数型の値以外は除外する条件
        continue#スキップする際のコード
    if data < 20 or data >= 90:#20未満は除外または、90以上は除外の条件
        continue#スキップする際のコード
    samples.append(data)
print(f'抽出されたリスト内の値は{samples}です。')

[入力したコードで使った関数]

isinstance(データ,データ型)
※データとデータ型が一致するとTrueが返る。
※データ型はint型、str型、bool型などが使用可能。

[解説]
リストscoresから特定の値を抜き出し、リストsumplesに代入していく処理ですが、条件として値が整数型で無かった場合は処理がスキップされることになります。


また、整数型であったとして20未満と90以上の値であった場合もスキップとなります。

実行結果

抽出されたリスト内の値は[20, 40, 50, 70, 80]です。

「繰り返し(ループ)処理の基本の書き方」まとめ

繰り返し(ループ)処理を書く時のポイント

繰り返し

・while文は、条件に従ってwhileブロック内の処理を繰り返し実行することができる。
・while文は、回数の目処が立たない繰り返しの処理のコードとして適している。
・for文は、コレクションが持つ要素数の回数だけ処理をすることができる。
・for文は、データの集まりを順に参照する繰り返し、一定回数の繰り返しに適している

繰り返しの終了とスキップ

・break文は、繰り返しのを強制的に終了する。
・continue文はその回のループを終了し、次の回を継続する。

繰り返しをおこなう時のポイント

・条件の指定方法によっては繰り返しが永久に続く無限ループが発生しないようにする。
・range関数で定数回の繰り返し処理を指定することができる。
・繰り返し処理によるコレクション操作はプログラムとしてよく使われる。
・繰り返しと分岐の組み合わせで、実践的なコードを記述することができる

さいごに

最後までお読み頂きありがとうございました。

今回説明した繰り返し(ループ)処理は、条件分岐処理とともに、どのプログラミング言語においても重要な箇所であると断言できます。
これらを使えるようになることで、日常の事務作業などを省力化、自動化することもできるようになります。

ちょっとブレイク:繰り返しと条件分岐で簡単なアプリを作る

作成するアプリは、コンピュータと3回じゃんけんをするアプリです。
ものすごく単純でシンプルですが、これも立派なアプリケーションと繰り返しと条件分岐が使えれば作成可能なアプリケーションとなります。

まずは、以下アプリを作る上で必要な要件をざっくりと洗い出してみます。

  • 結果を出力するためのprint関数を使う
  • ユーザーにじゃんけんをしてもらうためinput関数を使う
  • コンピュータが出す手についてはrandom関数を使う
  • グー、チョキ、パーの文字列と数値データを組みとして扱うためディクショナリを使う
  • 勝敗によっての条件分岐で次の処理を変えるためif文を使う
  • 3回繰り返しをするためfor文を使う
  • ユーザーからの入力が不正であった場合は繰り返し終了としてのbreak文を使う

要件をもとにコード書いていきます。

入力内容

#コンピュータとじゃんけん3回勝負アプリ
import random#ランダム関数

dic2 = {1:'グー',2:'チョキ',3:'パー'}

print('これからじゃんけんでコンピュータと3回勝負をしていきます。')
for count in range(3):#3回繰り返すコード
    dkeys = random.randint(1,3)#ランダム関数で1~3の数値を生成するコード
    cpu = dic2[dkeys]#ランダム数値要素と紐づく値をdicより参照
    user = input('数字で入力(1:グー,2:チョキ,3:パー)>>')

    if user.isdigit():
        if 0 < int(user) <= 3:#3以下の数値の場合の処理
            user2 = dic2[int(user)]
            print(f'あなたは{user2}で、コンピュータは{cpu}です。')
        else:
            print('無効な値が入力されました。最初からやり直してください。')
            break
    else:
        print('無効な値が入力されました。最初からやり直してください。')
        break

[解説]
まずは、グー、チョキ、パーをコレクションのディクショナリdic2で定義しています。
コンピュータとユーザーの出す手を、それぞれ下記のように処理して生成しています。

繰り返しについては「for count in range(3)」で3回繰り返すと指定しています。

コンピュータ

・ランダム関数を用いて、変数dkeysに1~3の数値をランダムに代入する。
・cpu = dic2[dkeys]で辞書のdic2からアイテムを参照するキーとして使用する変数cpuに代入する
・じゃんけんの結果として変数cpuはグー・チョキ・パーを出力する

ユーザ(プレーヤー)

・input関数で選択した数値を変数userに代入
input関数にて取得した数値を変数userに代入し、if文で条件判定処理を実行する。

・判定式1:if user.isdigit():
入力された値(user)が整数であるかを判定をし、True or False で返ってきます。

・判定式2:if 0 < int(user) <= 3:
入力された値(user)が1~3の範囲内であるか判定しています。※input関数で入力した値は文字列として返ってくるのでint関数を使って整数に変換した後に0より大きく3以下であるかを判定しています。

判定式1と2ともにTrueとなる場合は、じゃんけんの結果を出力します。ユーザーからの入力が整数でない、または1~3の範囲ではない場合は無効な値として繰り返しは終了します。

実行結果1

これからじゃんけんでコンピュータと3回勝負をしていきます。
数字で入力(1:グー,2:チョキ,3:パー)>> 1
あなたはグーで、コンピュータはパーです。
数字で入力(1:グー,2:チョキ,3:パー)>> 2
あなたはチョキで、コンピュータはチョキです。
数字で入力(1:グー,2:チョキ,3:パー)>> 3
あなたはパーで、コンピュータはパーです。

ユーザーが入力した値に問題がなく、正常終了した場合の実行結果。

実行結果2

これからじゃんけんでコンピュータと3回勝負をしていきます。
数字で入力(1:グー,2:チョキ,3:パー)>> 2
あなたはチョキで、コンピュータはパーです。
数字で入力(1:グー,2:チョキ,3:パー)>> グー
無効な値が入力されました。最初からやり直してください。

2回目のユーザー入力で数値ではなく、文字列”グー”と入力された場合のエラー終了。

<strong>Deviko</strong>
Deviko

数値の入力ではなくて、文字を入力してしまった場合の事も想定しているのね。

次の関数の基本的な書き方についてまとめた記事はこちら

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村
PVアクセスランキング にほんブログ村コダマのもりブログ - にほんブログ村

コメント

タイトルとURLをコピーしました