Robert GourleyによるPixabayからの画像
こんにちは。倉内です。
プログラミングの基本である、ループ処理。単純に見えて、組み合わせて使ったり、複雑な条件下でコードを書こうと思うと、初心者の方には難しく感じる場合もあります。
検索すればサンプルコードはたくさん出てきますが、しっかり理解しておけば応用も利きますし、この先の学習もスムーズに取り組めます。
そこで今回は、paizaラーニングで無料公開している動画講座「Python3入門編」と練習問題集を利用して、プログラミング初学者の方に、ループ処理を基本から解説したいと思います!
プログラミングの基本を理解すると、ただいま実施している抽選でAmazonギフト券がもらえるキャンペーン問題にも挑戦できますのでぜひチャレンジしてみてください!キャンペーン詳細はこちら
- 前置き:利用教材について
- forを使ったループ処理:for inの基本形
- forを使ったループ処理:応用
- whileを使ったループ処理
- ループ処理を使って問題を解いてみよう
- まとめ
- Amazonギフト券が当たる!キャンペーン実施中
前置き:利用教材について
paizaラーニングは、Webブラウザとインターネット環境があればどなたでもご利用いただけます。
動画はプロの声優さんによる解説つきで、学習した内容をすぐ演習課題で復習できるのが特徴です。
練習問題として利用するのは、さまざまな難易度・内容のプログラミング問題を集めた「レベルアップ問題集」です。
問題を解いたあとコードをテストするための全入力ケースが閲覧でき、一部問題は解答コード・解説もついています*1。
以降はサンプルコードも提示しますので、よければオンライン実行環境のpaiza.IOで自分で試しながら進めてみてください。
forを使ったループ処理:for inの基本形
「ループ処理」とは、同じ手順を繰り返す処理のことです。「反復処理」や「繰り返し処理」とも言われます。これだけでは分かりづらいので具体例で見てみましょう。
問題:
「Hello paiza!」という文字列を10回表示してください。
ループ処理を使わない場合
以下のようにprint関数を10個並べて表示させることができます。
print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!") print("Hello paiza!")
ただ、同じものを10回書くのは無駄な気がしますよね。
しかも問題が10回ならいいですが、100回にしてください、1000回にしてください…となるとかなり大変そうです。
そこでループ処理の登場です。
ループ処理を使った場合
ループ処理の基本形、for inを使います。以下のとおり短いコードで10回表示させることが可能です。
for i in range(10): print("Hello paiza!")
forとinのあいだにあるiは「カウンタ変数」と言って、何回出力したかを数えるための変数です。iやjを使うことが多いですが、決まりはありません。
上記のような書き方の場合、iは0からカウントをスタートします。そのためカウントが10になる(0、1、2、3……9)まで「Hello paiza!」を出力します。
for カウンタ変数 in 繰り返す範囲:
繰り返す処理
forを使えば、繰り返す回数が変わっても柔軟に対応できます。
繰り返す範囲(繰り返したい回数)を指定するrange関数については次で説明します。
range関数
range関数を使って繰り返し回数を制御することができます。
例1:
range(10)と記述すると、0から9まで10回繰り返す。
for i in range(10): print("Hello paiza!")
以下のように記述することで、開始・終了の値を指定することも可能です。
例2:
range(6, 11)と記述すると、6から10まで繰り返す。
for i in range(6, 11): print("Hello paiza!")
このコードを実行すると、以下のとおり「Hello paiza!」は5回出力されます。
出力結果:
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
ここまでの内容は以下の動画講座で学ぶことができます。演習問題もありますので、学習内容が身についたかのチェックとしても利用してみてください。
forを使ったループ処理:応用
ifとの組み合わせ
for文はif文と組み合わせて利用することで、「○○であれば、●●を繰り返す。○○でなければ、終了」といった少し複雑な処理を実現することができます。
ここではよく使う2つの基本的な制御文も合わせて紹介します。
なお、条件分岐については、こちらの記事で詳しく説明しているので、事前に学習しておくとよいでしょう。
break
breakを使うと、「条件に一致したら、for文の途中で処理を終了する」という処理ができます。
たとえば以下のコードでは、iの値が5になったら「Stop!」を出力して処理を終了しています。
例1:
for i in range(10): if i == 5: print("Stop!") break print("Hello paiza!")
この使い方ではbreakの意義が分かりにくいので、もうひとつ別の例を示します。
以下のコードでは、リスト内に指定した単語(paiza)が存在したら処理を終了します。「目的の値があったら処理を終了」はなんとなく使う場面がありそうですよね。
例2:
word_list = ["pizza", "park", "paiza", "pasta"] for word in word_list: if word == "paiza": print(word) break print("Searching...")
例2の出力結果:
Searching...
Searching...
paiza
なお、Pythonの「リストの基礎」は以下の動画講座で解説しています。リスト操作は非常によく利用するので、使いこなせると非常に便利です。
continue
次にcontinueを使って、「条件に一致したら、その処理をスキップする(ループ処理は続く)」という処理を書いてみます。
以下のコードでは、iが5のときだけ「Hello paiza!」の出力をスキップしてiを進めて、6以降はまた出力する処理になっています。
例:
for i in range(10): if i == 5: print("Skip!") continue print("Hello paiza!")
出力結果:
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
Skip!
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
else
for文で指定した範囲の繰り返し処理が正常に終わったあとにさせたい処理をfor...elseの形で指示することができます。
たとえば、「Hello paiza!」と5回出力したあと、「Welcome!」と出力してみましょう。
例:
for i in range(5): print("Hello paiza!") else: print("Welcome!")
出力結果:
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
Hello paiza!
Welcome!
ちなみに、さきほど示したbreakやcontinueとの組み合わせで使うこともできるので、さきほどbreakの例で示した目的の単語を探すプログラムを少し改変してみます。
breakとelse:
word_list = ["pizza", "park", "paiza", "pasta"] for word in word_list: if word == "paiza": print(word) break print("Searching...") else: print("learning!")
このコードではbreakで抜けてしまうので、出力結果は以下のとおりです。
Searching...
Searching...
paiza
continueとelse:
word_list = ["pizza", "park", "paiza", "pasta"] for word in word_list: if word == "paiza": print(word) continue print("Searching...") else: print("Welcome!!")
この場合はpaizaが見つかったときだけ「paiza」を出力し、「Searching...」は出力しません。そしてリストの最後まで処理を繰り返すため、以下のような出力結果になります。
Searching...
Searching...
paiza
Searching...
Welcome!!
whileを使ったループ処理
つづいてwhileを使ったループ処理を理解しましょう。
i = 0 while i < 10: print(i) i = i + 1
forと異なるのは、はじめにカウンタ変数iの初期化が必要、print関数のあとにiをインクリメント(+1して更新)するという点ですね。
出力結果:
0
1
2
3
4
5
6
7
8
9
カウンタ変数を初期化
while 条件式:
繰り返し処理
カウンタ変数を更新
ちなみに、forで同じ出力結果を求めたいときは以下のようなプログラムになります。
for i in range(10): print(i)
使い分けですが、for文は繰り返し回数を指定したいとき、while文は特定条件下でずっと同じ処理をさせたいときと考えるとよいかもしれません。
whileについては以下の2つの動画講座で詳しく解説していますので、ぜひごらんください。
ループ処理を使って問題を解いてみよう
ループ処理が理解できたところで、プログラム問題集の中でも比較的取り組みやすい問題を集めてある「Dランク早解きセット」で実際に問題を解いてみましょう。
与えられた値を取得する標準入力については、動画講座「#05:データの読み込み(標準入力)」でも説明していますのでぜひ参考にしてみてください。
【1】アンダーライン
問題:
入力した文字列にアンダーラインをするプログラムを作成することにしました。
しかし、テキスト上でアンダーラインを追加することはできないので、アンダーラインの代わりに文字列の下に、文字列の長さの分だけ「^」を追加することでアンダーラインを再現することにしました。
入力された文字列に「^」によるアンダーラインを追加して出力してください。
入力される値:
入力は以下のフォーマットで与えられます。
ssは任意の半角文字列
期待する出力:
任意の文字列 zzzzz が入力されたとき、
zzzzz
^^^^^
を表示してください。(ただし、^ の個数は入力された文字列の長さと同じにすること。)
条件:
すべてのテストケースにおいて、以下の条件を満たします。
1 ≤ (sの長さ) ≤ 20
「与えられた文字列の長さ分 ^ を出力」というところでループ処理が使えそうですね。ほとんど上で説明した基本形のまま書けるので、さっそく解答例を見てみます。
解答コードの例
s = input() print(s) for i in range(len(s)): print("^", end="")
与えられた文字列を s に入れて、len(s)で文字列sの長さ分forの処理を繰り返しています。
このコードを提出してみるとテストケースにすべて通過し100点が得られました!
【2】アルファベットの穴の数
問題:
大文字のアルファベットには、囲われた部分があるものと、そうでないものがあります。
例えば、
・Aは上部の三角形の部分が囲われており、囲われた部分が1つ存在します。
・Bは上部と下部がそれぞれ囲われており、囲われた部分が2つ存在します。
・Cには囲われた部分は存在しません。入力として、大文字のアルファベットが与えられるので、その文字にある囲われた部分の数を出力してください。
ただし、囲われた部分の数は以下であるとします。
・0個 : C, E, F, G, H, I, J, K, L, M, N, S, T, U, V, W, X, Y, Z
・1個 : A, D, O, P, Q, R
・2個 : B
入力される値:
入力は以下のフォーマットで与えられます。
ssは大文字アルファベット1文字
期待する出力:
入力されたアルファベットの囲われた部分の数を出力し、最後に改行して出力してください。
条件:
すべてのテストケースにおいて、以下の条件をみたします。
s は A ~ Z のいずれかの1文字
さきほどの問題よりは複雑ですが、要は与えられたアルファベットが0、1、2のいずれに該当するかを判定できればよいので、forとifの組み合わせで解くことができます。
以下のプログラムは、コードとしてはあまりスマートではありませんが、初心者の方も理解しやすいと思いますのでコメント含めて一度眺めてみてください。
解答コードの例
# 囲われた部分の数ごとにリストを作成 list_circle_0 = ["C", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "S", "T", "U", "V", "W", "X", "Y", "Z"] list_circle_1 = ["A", "D", "O", "P", "Q", "R"] # 与えられるアルファベットを取得 Alphabet = input() # 「2」になるのは「B」だけなので先に処理 if(Alphabet == "B"): print(2) # Alphabetが「0」のリストにあるか先頭から繰り返して探す for word in list_circle_0: if word == Alphabet: print(0) break # Alphabetが「1」のリストにあるか先頭から繰り返して探す for word in list_circle_1: if word == Alphabet: print(1) break
このコードでテストケースを通過し100点を取ることができます。
冗長なので改善の余地はありますが、forとifを組み合わせた処理をだいぶ理解できたのではないでしょうか。
問題集には他にもいろいろな種類・難易度のプログラミング問題をご用意していますので、ぜひたくさん解いてコードを書く力をつけていってください!
まとめ
for分・while文を使ったループ処理について解説してきました。
学習した内容は実際にプログラミング問題を解いてみないと自分で書けるようになったか分からないので、途中で紹介していた動画講座も活用しながら「問題を解く」「分からなかったら講座に戻る」を繰り返してみましょう。
なお、レベルアップ問題集で出てきた「Dランク」というのは、プログラミング問題を時間制限ありで解答して、プログラミングスキルを測る「スキルチェック」でのランク表記です。力がついてきたなと思った方はぜひチャレンジしてみてください。詳細はこちら
Amazonギフト券が当たる!キャンペーン実施中
冒頭でご紹介したキャンペーンは、スキルチェック問題を解くことで参加できます!
キャンペーン期間:
2020年12月10日(木) 12:00~2020年12月23日(水) 11:59
参加条件とプレゼント内容:
・2問ずつ2週連続で出題される合計4問のスキルチェック問題に2問以上挑戦で、抽選で15名様にAmazonギフト券1,000円分
・さらに受験後の結果画面から「#paizaのクリスマス」をつけてツイートするとWチャンスとして抽選で30名様にAmazonギフト券500円分
キャンペーン規約など詳細はこちら
「paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。
詳しくはこちら
また、paizaが運営する「EN:TRY」では、若手・未経験者の方を対象とした、開発経験がない人・少ない人でも応募できる若手チャレンジ求人を中心に掲載しています。スキルチェック問題を解いて、スコアが一定基準を超えれば、事前の書類選考なしで複数求人へ応募できます。
詳しくはこちら
*1:無料会員の場合、閲覧にはpaizaへログインすると獲得できるチケット(最大6枚蓄積可能)の消費が必要です。