rangeとstep
回したい数が、まだリストになっていない
前のレッスンでは、すでに用意されたリストを for で回しました。では「1 から 7 まで」のような連番を回したいときはどうするか。手で並べて書くのは、1 から 31 まででも面倒です。
数の並びをその場で作ってくれるのが range です。渡す引数の数で意味が変わります。
Python
for n in range(3):
print(n)
for n in range(1, 8):
print(n)
for n in range(1, 8, 2):
print(n)1 つなら 0 から始まり、その数の手前までなので 0 1 2 が出ます。
2 つなら始まりと終わりで、1 から 7 までが出ます。3 つ目まで書くと、それが 刻み幅 です。1 3 5 7 と 1 つ飛ばしで進みます。刻み幅を 3 にすれば 1 4 7 です。
終わりに書いた値は出ない
3 つの書き方に共通しているのは、終わりに書いた値が含まれない ことです。range(1, 8) の 8 は出ません。1 から 7 までが欲しければ、終わりには 1 つ多い数を書きます。
これは Python 全体で一貫している決まりで、慣れるまでは「終わりは手前まで」と声に出して確認します。最終日だけ出てこない、という間違いはここから来ます。
始まりと終わりが同じ range(1, 1) は、1 つも数を出しません。for の中身は 1 度も動かないので、入れ物は用意したときの値のまま残ります。なお刻み幅に 0 を渡すといつまでも進まないため、ValueError になります。
数と文字はそのままつなげない
range から出てくるのは数値です。日本語の見出しに混ぜるには、文字列に変えてからつなぎます。
Python
n = 3
print(str(n) + "回目")
print(f"{n}回目")どちらも 3回目 になります。str を挟まずに n + "回目" と書くと TypeError です。第 2 章でやった型変換が、ここで効いてきます。
数値と文字列の連結は、
Pythonを書き始めた最初の 1 か月でいちばん多く出会うエラーです。TypeErrorを見たら、まずstrの付け忘れを疑います。
やってみよう
関数 day_labels(last_day, step) を実装してください。引数は 2 つで、last_day は最終日 (int)、step は刻み幅 (int) です。
1 から last_day まで step ごとに進みながら、"1日目" のような文字列を並べたリストを return します。day_labels(7, 2) なら ["1日目", "3日目", "5日目", "7日目"] です。
last_day が 0 のときは、1 つも作れないので空のリスト [] を返します。range の終わりが含まれないことに気をつけてください。
要件
- 関数名は day_labels で、引数は last_day と step の2つにする
- range の3つ目の引数に step を渡して刻み幅を指定する
- 1 から last_day まで含める。終わりの値が含まれないことに注意する
- 各要素は "1日目" のように数値のうしろに日目を付けた文字列にする
入出力例
day_labels(7, 1) → ["1日目","2日目","3日目","4日目","5日目","6日目","7日目"]
day_labels(7, 2) → ["1日目","3日目","5日目","7日目"]
day_labels(7, 3) → ["1日目","4日目","7日目"]
day_labels(1, 1) → ["1日目"]
day_labels(0, 1) → []