Python | for文とwhile文を学習した

2021-07-03

こんにちは。

最近はPythonの初歩を学習しています。

Pythonを動かしている環境については簡単に言うと以下です。

  • Windows 10 64bit
  • python 3.9.4
  • PyCharm Community Edition 2021.1 x64

より詳細は以下の記事に記載してあります。

今回はPythonによるプログラミングについて、for文とwhile文の基本的な使い方を試してみました。この記事は学習内容の備忘録です。

while文

for文とwhile文を学習したのですが、Pythonの場合、for文は少し難しいと感じました。なので、while文から紹介します。

なお、while文では条件式について知っておく必要があります。最初のうちは比較演算子を使った条件式を知っておくとよいと思います。比較演算子については、「比較演算子を学習した」に備忘録を記載しています。

while文の基本的な使い方

while文は「指定した条件がTrueの間は処理を繰り返したい」という場合に使います。基本的な構文は以下です。

構文
while [条件式]:
    実行したい処理 1
    実行したい処理 2
    実行したい処理 3
    ・
    ・
    ・

while文で繰り返す処理は、文言「while」の次の行にインデントして記述します。while文で実行したい文が複数ある場合は、その文も続けてインデントします。便宜的に、インデントされた行をブロックと呼ぶことにします。大まかな処理は以下の通りです。

  1. [条件式]が評価される。
    1. その結果がTrueの場合、ブロックの処理が順に実行される。
    2. その結果がFalseの場合、ループを抜ける。
  2. 最初([条件式]の評価)に戻る。

以下は簡単なサンプルプログラムです。

ソース
i = 0
while i < 3:
    print(i)
    i += 1
結果
0
1
2

上記のサンプルプログラムのwhile文のブロックでは、最後に変数iの値を1加算しています。変数iの値が3になると、条件式i < 3の結果がFalseになります。その時はブロックは実行されません。

上記のブロックで、最後の処理「i += 1」を削除した場合、while文の処理が終わりません。常に条件式i < 3の結果がTrueとなるためです。while文では処理内容が無限ループになる場合があるので気を付ける必要があります。プログラミングのミスでそのような状況になった場合、プログラムを強制終了することになります。PyCharm Community Editionではプログラムを停止するボタンがあります。

以下は停止ボタンで処理を止めるための練習のサンプルプログラムです。

ソース
import time

i = 0
while i < 10:
    print(i)
    time.sleep(1)
    i += 1

上記プログラムは1秒ごとに変数iの値を加算して、変数iの値が10になると処理が終わります。少なくとも10秒は動くプログラムなので、処理が終わる前に停止ボタンを押す練習になります。

上記画像の個所が停止ボタンです。これをクリックするとプログラムが終了します。

上記のサンプルプログラムの条件式では、変数iの整数値を判断して居ますが、以下のように入力された文字を利用するという方法もあります。

ソース
tax_rate = 0.08

c = 'y'
while c == 'y':
    price = int(input('価格: '))
    print('{0}の税込み価格は{1}です。'.format(price, round(price * (1 + tax_rate))))

    c = input('続ける場合は「y」を入力したください。:')

このサンプルプログラムでは、価格を入力すると税込み価格を出力するというプログラムです。while文のブロックの最後で文字を入力してもらうようになっています。その文字で次の繰り返しを実行するかが判定されます。

price * (1 + tax_rate)の結果がfloat型になるため、組み込み関数round()関数を使っています。この関数は第1引数の値を四捨五入する関数です。第2引数を省略した場合、入力値に最も近い整数を返します。

以下は、実行結果の一例です。文字の入力では、一度目はyを入力して、2度目はy以外を入力しています。

結果の一例
価格: 100
100の税込み価格は108です。
続ける場合は「y」を入力したください。:y
価格: 200
200の税込み価格は216です。
続ける場合は「y」を入力したください。:a

上記のように繰り返し回数が不定であるようなwhile文の使い方もあります。

for文

繰り返し処理を指定するための構文として、for文というものもあります。

for文で処理を10回繰り返す

for文を使うと繰り返し処理ができます。Pythonのfor文自体の構文は後で記載しますが、10回処理を繰り返す場合は以下のように記述します。

ソース
for n in range(10):
    print(n)
結果
0
1
2
3
4
5
6
7
8
9

上記のサンプルプログラムでは、変数nが0から9まで値を出力する処理を繰り返しています。初めてこのプログラムを実行したときは、range(10)の結果が0から9までの数列らしきものなのだと漠然と感じました。

Pythonではrangeという組み込み型が定義されています。range(10)はrange型のコンストラクタに整数10を渡しているということです。生成されたオブジェクトはlist()に渡すことができます。

以下のプログラムではlist()を使い、range(10)の内容を出力しています。

ソース
values = range(10)
print(values)
print(list(values))
結果
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

list(values)の結果が0から9の数字の列であることがわかりました。

for文の構文は大雑把には以下の形式です。

for文
for 変数 in [リストなど]:
    実行したい処理 1
    実行したい処理 2
    実行したい処理 3
    ・
    ・
    ・

[リストなど]と記載している個所は、より正確にはイテレータオブジェクトを生成してくれるオブジェクトを記述できるようです。初心者の私には難しいので、range型やリストが使えることがわかれば今は十分であると判断しました。

変数には[リストなど]の個所に書いたオブジェクトの要素が格納されます。リストの場合では、繰り返し処理の1回目では変数にリストの1番目の要素が格納され、繰り返し処理の2回目では変数にリストの2番目の要素が格納されます。

リストをfor文で使う

以下のサンプルプログラムでは、listを使ってfor文を試してみました。

ソース
values = [99, 'abc', 100, 0.123]
for value in values:
    print('{0}...{1}'.format(value, type(value)))
結果
99...
abc...
100...
0.123...

上記のサンプルプログラムのvaluesの要素には、整数、文字列、小数があります。それぞれが繰り返し処理で変数valueに格納されています。変数の型は格納された値に応じて変わります。

リストのインデックスを知りたい場合

listをfor文で使うことができますが、リストのインデックスを繰り返し処理で使うためには、組み込み関数enumerate()を使います。
以下は変数の値を表示するだけのサンプルプログラムです。

ソース
values = [99, 'abc', 100, 0.123]

for i, value in enumerate(values):
    print(f'{i=}, {value=}')
結果
i=0, value=99
i=1, value='abc'
i=2, value=100
i=3, value=0.123

上記の変数iには整数値が0から順番に格納されます。初心者のうちは上記を型として覚えておけば良いと思います。

enumerate()関数で返却されるオブジェクトについては、次のサンプルプログラムで少しわかりました。

ソース
values = [99, 'abc', 100, 0.123]
print(enumerate(values))

l = list(enumerate(values))
print(l)
print(l[0][0])
print(l[0][1])
print(l[1][0])
print(l[1][1])
結果
<enumerate object at 0x000002104F5F6940>
[(0, 99), (1, 'abc'), (2, 100), (3, 0.123)]
0
99
1
abc

enumerate()関数はenumerate オブジェクトを返却します。それをlist()関数の引数に指定することができます。その出力結果は2重配列のようなものだとわかりました。(ここでは詳細は深追いしません)。

今回の学習内容はここまでです。for文の応用的な使い方はまたの機会に書きます。

以上、参考になれば幸いです。