パスワードを忘れた? アカウント作成
15644806 journal
日記

masakunの日記: 第4章 繰り返し(すっきりPython 159~190頁)

日記 by masakun

☆☆☆ while 文 ☆☆☆

繰り返す回数に目途がたたないときに使う。
繰り返しの条件やカウンタ変数の操作を明示する必要がある。

count = 0
while count < 3 :
        count += 1
        print(f'ひつじが{count}匹')
print('グッナイ')

0<3, 1<3, 2<3 ...と条件を満たすまで繰り返させる 3-4行目が while ブロック。
繰り返すたびに値が変化する変数をカウンタ変数またはループ変数と呼ぶ。

☆☆☆ 状態による繰り返し ☆☆☆

あるものの状態によって、繰り返しの条件を判定したいときに使う。

is_awake = True #フラグとなる変数は is_xxx とするのが一般的
count = 0
while is_awake == True:
        count += 1
        print(f'ひつじが{count}匹')
        key = input('もう眠れそうですか(y/n)>>')
        if key == 'y': #'y' が入力されたらループは止まる
                is_awake = False
print('グッナイ')
実行結果
ひつじが1匹
もう眠れそうですか(y/n)>> n
ひつじが2匹
もう眠れそうですか(y/n)>> y
グッナイ

☆☆☆ 繰り返しによるリストの作成 ☆☆☆

count = 0
seito_suu = int(input('生徒の人数は?>>'))
score_list = list()
while count < seito_suu:
        count += 1
        score = int(input(f'{count}人目の成績は?>>'))
        score_list.append(score)
print(score_list)
print(f'平均は{sum(score_list)/seito_suu}点です。')
実行結果
生徒の人数は?>> 4
1人目の成績は?>> 10
2人目の成績は?>> 20
3人目の成績は?>> 30
4人目の成績は?>> 40
[10, 20, 30, 40]
平均は25.0点です。

☆☆☆ 繰り返しによるリスト要素の利用 ☆☆☆

scores = [80, 20, 75, 60, 100]
count = 0
while count < len(scores): #リストの要素数より小さければ繰り返す
        if scores[count] >= 60: #リストの添え字に変数が使える!
                print('合格!')
        else:
                print('不合格')
        count += 1
実行結果
合格!
不合格
合格!
合格!
合格!

☆☆☆ for 文 ☆☆☆

繰り返す回数に目途がたつときに使う。

for 変数 in リスト:
繰り返しのたびにリストの要素が先頭から順に変数に代入される

score = [80, 20, 75, 60, 100]
for data in score:
        if data >= 60:
                print('合格!')
        else:
                print('不合格')

【追記】Python プログラミング完全入門の122頁をみていたら、二次元リストにもループ処理がかませることが分かった。

hanrei = ['国名','感染者','回復者','死亡者','致死率']
ame = ['アメリカ',83356490,80836418,1023513,1.2]
ind = ['インド',43091393,42547699,523975,1.2]
bra = ['ブラジル',30502501,29602372,663816,2.2]
fra = ['フランス',28805690,27301021,146376,0.5]
deu = ['ドイツ',25116363,23000500,136405,0.5]
eng = ['イギリス',22090523,21395888,175546,0.8]
rus = ['ロシア',18211178,17578659,376560,2.1]
sko = ['南朝鮮',17438068,969524,23158,0.1]
jpn = ['日本国',8008115,7598239,29741,0.4]
hyo = [hanrei, ame, ind, bra, fra, deu, eng, rus, sko, jpn]

for row in hyo:
        print(row)
実行結果
['国名', '感染者', '回復者', '死亡者', '致死率']
['アメリカ', 83356490, 80836418, 1023513, 1.2]
['インド', 43091393, 42547699, 523975, 1.2]
['ブラジル', 30502501, 29602372, 663816, 2.2]
['フランス', 28805690, 27301021, 146376, 0.5]
['ドイツ', 25116363, 23000500, 136405, 0.5]
['イギリス', 22090523, 21395888, 175546, 0.8]
['ロシア', 18211178, 17578659, 376560, 2.1]
['南朝鮮', 17438068, 969524, 23158, 0.1]
['日本国', 8008115, 7598239, 29741, 0.4]
【追記ここまで】

for 変数 in range(n):
0~n-1 までの整数リストを作れる range 関数だが、range(1,10)と指定することで
[1,2,3,4,5,6,7,8,9] というリストを得られる。

for t in range(1,10):
        for y in range(1,10):
                print(f'{t*y:4d}', end='')
        print('\n', end='')

なお end='' は改行しないことを指示する(185頁)。

☆☆☆ 繰り返しの制御 ☆☆☆

#age リストから年齢サンプルを抽出するプログラム
ages = [28, 50, 8, 20, 78, 25, 22, 10, 27, 33, 39, 21, 24, 60]
num = int(input('20代のデータ、何人分抽出しますか'))
count = 1
samples = list()
for age in ages: #実はこの行ですべてのデータを舐めている
        print(f'{count}回 ',end='')
        count += 1
        if 20 <= age < 30:
                if len(samples) < num:
                        samples.append(age)
print(samples)
実行結果
20代のデータ、何人分抽出しますか 3
1回 2回 3回 4回 5回 6回 7回 8回 9回 10回 11回 12回 13回 14回 [28, 20, 25]

count 回数を仕込んでみると、たった3人分のデータを抽出するのにすべての要素にあたっていることが分かる。そこで必要なデータの抽出が終わったら止められるように改良する。

ages = [28, 50, 8, 20, 78, 25, 22, 10, 27, 33, 39, 21, 24, 60]
num = int(input('20代のデータ、何人分抽出しますか'))
count = 1
samples = list()
for age in ages:
        print(f'{count}回 ',end='')
        count += 1
        if 20 <= age < 30:
                samples.append(age)
                if len(samples) == num: #必要数に達したら止まれ
                        break
print(samples)
実行結果
20代のデータ、何人分抽出しますか 3
1回 2回 3回 4回 5回 6回 [28, 20, 25]

3つ目が抽出できた6回目で止まった。

〇繰り返しのスキップ

ages = [28, 50, 8, 'ひみつ', 20, 78, 25, 22, 'ないしょ', 10, 27, 33, 39, 21, 24, 60]
num = int(input('20代のデータ、何人分抽出しますか'))
count = 1
samples = list()
for age in ages:
        print(f'{count}回 ',end='')
        count += 1
        if 20 <= age < 30:
                samples.append(age)
                if len(samples) == num: #必要数に達したら止まれ
                        break
print(samples)

もし ages リストに str 型の値が混在していると、if 20 <= age < 30 でエラーが出てしまう。そこで整数型でないデータはスキップさせる必要がある。

ages = [28, 50, 8, 'ひみつ', 20, 78, 25, 22, 'ないしょ', 10, 27, 33, 39, 21, 24, 60]
num = int(input('20代のデータ、何人分抽出しますか'))
count = 1
samples = list()
for age in ages:
        print(f'{count}回 ',end='')
        count += 1
        if not isinstance(age, int): #整数でなければ continue を実行(スキップ)
                continue

        if 20 <= age < 30:
                samples.append(age)
                if len(samples) == num: #必要数に達したら止まれ
                        break
print(samples)
実行結果
20代のデータ、何人分抽出しますか 1
1回 [28]

isinstance(データ, データ型)
データがデータと一致したら True に置き換わる。

break 文を使うと、特定条件以降がストップしてしまう。
if num == 2:
        break
print(num)

continue 文を使うと、特定条件だけをスキップできる。
if num == 2:
        continue
print(num)

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家

読み込み中...