Python による気象解析入門 補足 (2022-06-07 増田)

演習 02 (p. 9) の別解 (Python3)

日付を 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」で埋めた文字列に変換するものである。

/home/masuda/20220607/list_days_may_w.py

# 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 となる。) ただし、ここでいう上限の値は、実際のくりかえしでつかわれる値よりも ひとつ大きな値である。

/home/masuda/20220607/list_days_may_f.py

# 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)

発展演習 (p. 9) の別解 (Python3)

年、月を 端末 (キーボード) から読み、その月のすべての日付を表示させる。

平年 (うるう年でない年) の各月の日数をリスト num_day に用意しておく。 (Python の添え字は 0 から始まるので、k 月の日数は num_day[k-1] である。)

月が 2月であり、年が うるう年であるときは、日数 (days) に 29 を与える。 それ以外のときは、num_day のうちから値を与える。

「月が 2月であり、年が うるう年である」という条件を、 論理演算の and と or をくみあわせて実現している。 演算順序を指定するために かっこ を たくさん使っている。

年、月は、読みこんだものをいったん整数型の変数に入れ、 それから書式にしたがって文字列に変換するようにした。

あとは、演習 02 の別解と同様。

ループを while 構文で構成する

/home/masuda/20220607/list_days_anymonth_w.py

# 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 構文で構成する

/home/masuda/20220607/list_days_anymonth_w.py

(「#####」よりも上は、コメント以外、上の例文と同じ)

#####
for day in range(1, ndays+1):
    sday = f'{day:02}'
    print(syear+"-"+smonth+"-"+sday)

(更新) 2022-06-07
増田 耕一 (MASUDA Kooiti)
[セミナーF、セミナーの基礎F]