Python3入門|初心者対象!【第3回】for文・while文(制御構文②)


まえがき

前回(Python3入門|初心者対象!【第2回】if文(制御構文①))、前々回(Python3入門|初心者対象!【第1回】環境構築とはじめてのプログラミング)を通じて、Python3の基礎の基礎、if文を学んできました。

今回【第3回】ではwhile文、for文といった制御構文を学んでいきましょう!

今回も「わかりやすい解説」に全力を尽くして参りますので、どうぞよろしくお願いいたします。

筆者・鹿丸

while文をマスターしよう!

例えば1~9の各値の二乗を求めたい。という処理を書かなくてはいけないとき、以下のように書いていてはめんどうですよね。

このようなとき、制御構文の一種である「繰り返し処理」を使えばもっとスマートにプログラムを記述することができます。

この節では繰り返し処理の一種であるwhile文の使い方を学びましょう!

【while文の書式】

while(条件式):
        繰り返す処理

では実際にサンプルプログラムを通じてwhile文の使い方を学んでいきましょう。

【サンプルプログラム10-1】

まずはテキストエディタでこのサンプルプログラムを写しとり、実行してみて下さいね。

結果は、以下のようになります。

10
9
8
7
6
5
4
3
2
1

それでは1行ずつ解説していきますね。

cnt = 10この式は変数cntをカウンタ変数として利用するために予め定義している部分です。カウンタ変数の意味につては後述しますね!

while(cnt > 0):この部分がwhile文の本体です。(cnt > 0)という部分が「条件式」ですね!で、
この条件式がtrueの間、繰り返し処理を実行し続けるのです。

今回はこの条件式の内容は「変数cntが0より大きい値」となっていますので、もしここで、
cnt = cnt – 1という式を書き忘れてしまうとcntの値はずっと10のままなので無限ループになってしまいます!

ちなみに、ある変数にセットされている値を1減らすには次の二通りの書き方があります。

cnt = cnt – 1

cnt -= 1

逆にある変数にセットされている値を1増やすには次の2通りの書き方があります。

cnt = cnt + 1

cnt += 1

で、whileループが一周回る度に、変数cntの値は1ずつ減っていきますよね。この変数cntが1ずつ減っていく様子を可視化しているのが三行目のprint(cnt)という部分です。

で、変数cntが10⇒9⇒…⇒3⇒2⇒1と一周ごとに減っていき、⇒0となった時点で(cnt > 0)の評価がFalseになり、whileループは終了!となります。

cntのことをカウンタ変数と呼んだ理由は、このように、終了条件に関わる変数だからです。もっと言えばcntは繰り返し回数を制御してもいますよね。このような変数のことをプログラミングの世界ではよくカウンタ変数と呼びます。

while文は条件式が真である限りループを続ける!

While文で1~99の二乗を求めよう!

while文で1~99の各数値の二乗を求めるにはwhile文を99回ループさせればいいですよね。

そのためのサンプルプログラムを書いてみましたので、まずはお手元のテキストエディタへ写経し、実際に動かしてみて下さいね!

尚、万が一、無限ループにはまってしまった場合は[Ctrl]+[C]を押せば脱出できますよ!

【サンプルプログラム10-2】

《復習①》a ** bでaのb乗

《復習②》int型の数値をstr型に型変換するにはstr()関数を用いる

実行結果は長すぎてここにはちょっとコピペできませんので、各自でサンプルプログラム10-2を実行してみて確かめて下さいね。ちなみに1番最後の出力は99周目:99の二乗=9801になりましたか!?

それでは例によってサンプルプログラム10-2を一行ずつ解説していきましょう!

まずカウンタ変数cntの初期値に1を代入していますね。これは1~99までカウンタ変数を1ずつ増やしていき、1の二乗、2の二乗、…、99の二乗と表示していきたいからです。

2行目のwhile文の条件式はcntが100未満である限りループ処理を継続することを意味します。

3行目については少し詳しく解説する必要がありそうですね!

print(str(cnt) + “周目:”+ str(cnt) + “の二乗=” + str(cnt ** 2))

cntはint型の変数なので“周目:”といった文字列とそのままでは連結できません。型の不一致を起こしてしまいますからね。そこでstr()関数でcntをstr型の数値に型変換しています。

最後の方のstr(cnt ** 2)int型のcntを二乗した結果をstr()関数でstr型に型変換しているわけですね。

あとは書き忘れると無限ループになってしまうcnt = cnt + 1の部分ですね。ループが一周するたびにカウンタ変数cntに1ずつ加算していき、cntの値が100になった時点でwhile文の条件式がFalseになるのでループ終了です。

尚、cnt = cnt + 1cnt += 1と書いても同じ意味でしたね!

break文について

繰り返し処理の中にbreak文を書くと、ループを強制終了することができます。break文を利用してendと入力すると繰り返し処理が終わるプログラムを書いてみましょう。

今回のサンプルプログラムにはまだ解説していない事項も含まれますが、追って解説いたしますのでまずはサンプルプログラムを写し取り、動かしてみて下さいね。

尚、万が一、無限ループにはまってしまった場合は[Ctrl]+[C]を押せば脱出できますよ!

【サンプルプログラム10-3】

【サンプルプログラム10-3】はif文の復習も兼ねた簡易占いプログラムにしてみました。今日の運勢はいかがでしたか(笑)?

では一行ずつ解説していきますね!

import random

import(いんぽーと)文はPython3の特定の機能を使いたいときに、それをプログラム中で使うために読み込む構文です。今回は乱数を発生させたかったのでそのために必要なrandomという機能を読み込んでいます。

while(True):

while文は条件式がTrueの間、ずーっとループ処理をし続けるのですが、その条件式の部分にTrueをそのまま設定すると、break文で強制的にループを終了しない限りは延々にループし続ける、無限ループになります。ちなみに反対にwhile(False)と書くと、絶対にループが始まらないwhile文になります。ここではあえて無限ループにしています。

input(“あなたの今日の運勢を占います。Enterを押すと開始します。”)

このinput()関数はユーザーからの入力を受け取るために使っているのではなく、プログラムの流れを一度止めるために使っています。何も入力せずにEnterを押下すると占い結果が表示される仕組みです。一種の演出的なものですね。

rand_num = random.randint(1, 3)

最初の行でimportしたrandomを実際に使って、1~3の整数値をランダムに発生させ、そのいづれかの値を変数rand_numに代入しています。

random.randint(最小の整数, 最大の整数)と書くことで、最小の整数~最大の整数の幅の乱数を取得することができます。この機能を使うにはプログラムの冒頭でimport randomと書く必要があることを忘れないようにしましょう。

尚、Python3プログラミングに慣れてくるとimport文はしょっちゅう使うようになります!

次のif~elif~else文では取得した乱数が3の場合、2の場合、1の場合の処理をそれぞれ書いていますね。

exit = input(“もういちど占うにはそのままEnterを、終了するにはendと入力して下さい。”)

この部分では変数exitに“end”を代入してもらうか、もしくはスルーして何も入力せずにEnterを押下し、「もう一度占う」かをユーザーに求めています。

if(exit == “end”):
        print(“占いプログラムを終了しました。”)
        break

この部分が今回の肝ですね。break文が実行されると強制的にループを抜けるのでしたね。
変数exitの中身が文字列の“end”であれば、「占いプログラムは終了しました。」と画面に表示した後、breakによりwhileループを強制的に離脱し、プログラムを終了します。

ちょっと休憩!

ちょっと休憩して。四方山話でも!

Python3入門講座も3回目ですね!

3回目まで読んで下さり本当にありがとうございます。

まだまだ入口ではありますが、Python3に入門してみて、いかがでしたでしょうか。

if文とwhile文を覚えたことでだいぶプログラミングの幅が広がったという実感があるのではないでしょうか。

第1回の繰り返しになり、恐縮ですが、プログラミング上達のコツはとにかく手を動かすことです。サンプルプログラムを写すのも良い勉強になります。

またサンプルプログラムを写経するだけではなく、自分なりに簡単なアプリを作ってみるのも良い勉強になります。

例えばクイズアプリなんかであれば今の時点でも作れそうですよね。

筆者の四方山話なのでした!

for文で繰り返し処理を書こう!

for文でもwhile文と同様に「繰り返し処理」を実装することができます。

for文の基本的な使い方

【for文の書式】

for ループ変数 in 範囲:
        繰り返す処理

「範囲」の部分には様々な値を指定することができるのですが初心者のうちは「範囲」にはrange()関数を指定するものと思っておいて下さい。その他の値はおいおい説明していきます。

まずはfor文の仕組みを知るためにごく原始的なサンプルプログラムを入力してみて下さい。

以下のサンプルプログラムは3周ループします。

【サンプルプログラム11-1】

実行結果は以下のようになります。

0
1
2

それではサンプルプログラムの解説をしていきましょう!

範囲に指定したrange(3)という部分は繰り返し回数を意味します。iはループ変数です。何も指定しない場合、iは「0」から始まり「1」ずつ増加していきます。

{0, 1, 2}で確かに3周していますね。

またrange()関数に開始値と終了値を指定することで[終了値]-[開始値]回ループさせることも可能です。またその際のループ変数の値は0とは限らず、指定された開始値になります。例えば、range(1, 3)と範囲を指定すると何周ループするでしょうか?またループ変数の初期値は何になるでしょうか?

答えは(3-1)回、つまり2周ループすることになります。そしてループ変数の初期値は開始値である1になります。

では画面に1~3を表示するサンプルプログラムを見てみましょう。

【サンプルプログラム11-2】

range()関数の開始値が1、終了値が4なので、このforループは4-1で3周しますね。また開始値が1なので、ループ変数iは1から始まりますね。従って、実行結果は下記のようになります。

1
2
3

実はrange()関数には3つ目の値を指定できます。この値はループ変数をいくつずつ増加させるかを意味します。例えば下記のサンプルプログラムのように書けば、1~10の間にある奇数を取得することができます。

【サンプルプログラム11-3】

このサンプルプログラムのfor文は1から10の範囲内で2ずつ増加します。すなわち、
{1, 3, 5, 7, 9}となります。従って10周ではなく5周ループします。

range()関数の3つ目の値のことをステップと呼びます。ステップが1のときは、range(1, 11)と書けば10周しますが、range(1, 11, 2)のようにステップが2の場合は10÷2で5周する点に注意しましょう!

尚、range(1, 11)のようにステップに何も指定しない場合はステップは必ず1になります。

従ってこのサンプルプログラムの実行結果は以下のようになります。

1
3
5
7
9

さて、今まで紹介した利用法ではいまいちfor文を利用するメリットが感じられないのではないでしょうか。そこで簡単な文字列操作を利用して、for文の便利さを体感してみましょう。

そのためには、文字列操作の初歩の初歩を学習する必要があります。REPLかIDLE、どちらかお好きな方を開いて、文字列操作の練習をしてみましょう。

まずは文字列の長さを取得するlen()関数に慣れましょう。

REPL(またはIDLE)にlen(“apple”)と入力してみて下さい。

「5」という数値が返ってきましたよね。len()関数は指定した文字列の長さ(文字数)をint型で返す関数です。

次に以下の2行をREPL(またはIDLE)に入力してみて下さい。

str = “apple”
str[0]

「’a’」という値が返ってきましたよね?

文字列が格納されている変数を文字列変数と呼ぶことにしましょう。

そして文字列変数[数値]と書くことで、数値で指定した1文字を取得することができます。

文字の先頭は「0番目」の文字として扱う点に注意して下さいね!

なのでstr[3]と入力すると4文字目を取得できます。appleの4文字目は「’l’」ですね。

また文字列変数strに”apple”が代入されている状態で、str[5]と入力すると、存在しないはずの6番目の文字を指定しまっている(appleは5文字)ためIndexErrorとなってしまいます。

【まとめ】

len(文字列)で文字列の長さ(文字数)を取得できる!(例)len(str)

文字列変数[n]でn番目の一文字を取得できる!但し最初の文字は0番目とする!(例)str[1]

 

以上の文字列操作に関する予備知識を元にfor文を利用して任意の文字列を縦書きにするサンプルプログラムを書いてみましょう。

【サンプルプログラム11-4】

例えば最初の入力部分で「apple」と入力した場合、appleは5文字なので、range(0, 5)と書くのと同じことになりますよね。range()関数の2つ目の数値は、len(“apple”)となるわけですから、これはすなわち「5」ですよね。

で、入力された値が「apple」の場合、ループ変数「i」は0⇒1⇒2⇒3⇒4と変化しますよね。

str[i]では1文字目を0番目と考え、5文字目を4番目と考えるので、
str[0]⇒str[1]⇒str[2]⇒str[3]⇒str[4]という順で変化し、結果的に、

a
p
p
l
e

という出力が得られますね!

このサンプルプログラムのポイントはfor文の繰り返し回数を「文字列の長さ」回としているところです。このようにfor文のループ回数を抽象的に指定することで、どんな文字列を入力されても必ず縦書きにすることができるわけですね!

こういった使い方ができるところがwhile文にはないfor文の「強み」というわけです。

まとめ

if文、while文、for文といった制御構文はPython3でプログラムを作る際、多用する構文です。確実にマスターしておきたいところですね!

しかし一方で、制御構文までマスターすれば「Python3に入門した!」と言えるところまで到達したのではないでしょうか!?

とはいえ、まだまだPython3の道は長いです!これからも当講座をどうぞよろしくお願いいたします。

次の講座へ進む>Python3入門|初心者対象!【第4回】リスト(list)を使いこなそう!

前の講座を復習する>Python3入門|初心者対象!【第2回】if文(制御構文①)

 

 

コメントを残す

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

CAPTCHA