日付を 01, 02, ..., 09, 10, ... のように、2けたでそろえて書きだしたい。 5月31日の解答例では、日の数値が 10 未満のばあいと 10 以上のばあいをわけて、 ふたつのループにするか、あるいは、ループ内で if・else で分岐して処理した。
Python の「書式 (format、フォーマット) に従った文字列への変換」の 機能をつかうと、「1けたの数値ならば上位に 0 を入れて 2文字にする」という処理を 直接指定できる。
書式の指定のしかたのうち、つぎのような 「フォーマット済み文字列リテラル(f-string)」とよばれる方式が Python 3.6 以後のバージョンで可能になった。
「f」につづいて、'...' (single quotation marks) で かこまれ、 その内側に {...} (波かっこ) でかこまれて、 「変数:書式文字列」の形のものがある (変数と書式文字列のあいだはコロン)。 ここでつかう書式文字列「02」は、整数を2けたで上位を「0」で埋めた文字列に変換するものである。
# list_days_may_w.py # 2022-06-05 masudako # 演習02 # 2022年5月のすべての日付を表示させる # Python3 の 書式 (format) による文字列への変換をつかう # ループを while 構文と 制御変数を 1 ずつふやすことで構成する day = 1 while (day <= 31): sday = f'{day:02}' print("2022-05"+sday) day = day+1
day の値を 1 ずつふやしながらループするには、 つぎのように、for 構文と range 関数をつかう方法もある。 range 関数は、つぎのように下限と上限を指定する。 (1つの数を指定したときは、それが上限となり、下限は 0 となる。) ただし、ここでいう上限の値は、実際のくりかえしでつかわれる値よりも ひとつ大きな値である。
# list_days_may_f.py # 2022-06-05 masudako # 演習02 # 2022年5月のすべての日付を表示させる # Python3 の 書式 (format) による文字列への変換をつかう # ループを for 構文と range 関数で構成する for day in range(1, 31+1): sday = f'{day:02}' print("2022-05"+sday)
年、月を 端末 (キーボード) から読み、その月のすべての日付を表示させる。
平年 (うるう年でない年) の各月の日数をリスト num_day に用意しておく。 (Python の添え字は 0 から始まるので、k 月の日数は num_day[k-1] である。)
月が 2月であり、年が うるう年であるときは、日数 (days) に 29 を与える。 それ以外のときは、num_day のうちから値を与える。
「月が 2月であり、年が うるう年である」という条件を、 論理演算の and と or をくみあわせて実現している。 演算順序を指定するために かっこ を たくさん使っている。
年、月は、読みこんだものをいったん整数型の変数に入れ、 それから書式にしたがって文字列に変換するようにした。
あとは、演習 02 の別解と同様。
# list_days_anymonth_w.py # 2022-06-05 masudako # 演習02の発展 # 任意の月のすべての日付を表示させる # Python3 の 書式 (format) による文字列への変換をつかう # ループを while 構文と 制御変数を 1 ずつふやすことで構成する num_day = [31,28,31,30,31,30,31,31,30,31,30,31] year = int(input("year =")) month = int(input("month =")) syear = f'{year:04}' smonth = f'{month:02}' if (month == 2) and \ (((year % 4 == 0) and (year % 100 != 0)) or (year % 400 == 0)): ndays = 29 else: ndays = num_day[month-1] ##### day = 1 while (day <= ndays): sday = f'{day:02}' print(syear+"-"+smonth+"-"+sday) day = day+1
(「#####」よりも上は、コメント以外、上の例文と同じ)
##### for day in range(1, ndays+1): sday = f'{day:02}' print(syear+"-"+smonth+"-"+sday)