masakunの日記: 第4章 繰り返し(すっきりPython 159~190頁)
☆☆☆ 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)
第4章 繰り返し(すっきりPython 159~190頁予定) More ログイン