Pythonの標準ライブラリのみを使って
ユーザーに入力してもらった日付を [”2021″,”01″,”01″] みたいに扱えるようにするプログラムができました。
①ユーザーに日付を入力してもらう
②入力した日付が
・整数であるか
・桁数に問題がないか
・入力した日付が未来の日付になっていないか
・存在しない日付となっていないか
というのをチェック
③問題がなければリスト形式で日付が返ってくる(例:[”2021″,”01″,”01″])
といったプログラムのコードを書きました。
import datetime
def input_year():
# input_year では、年の入力をしてもらう
inputyear = input("年(例:2021)を入力し、エンター ")
"""strptimeで入力した数値にエラーが発生するかどうかで、正しい形式の年が
入力されたか確認を行う"""
try:
Check = datetime.datetime.strptime(inputyear,"%Y")
except:
print("4桁の整数で年を入力しましょう")
return input_year()
return inputyear
def input_month():
# input_month では、月の入力をしてもらう
inputmonth = input("月(例:01)を入力し、エンター ")
"""strptimeで入力した数値にエラーが発生するかどうかで、正しい形式の月が
入力されたか確認を行う"""
try:
Check = datetime.datetime.strptime(inputmonth,"%m")
except:
print("1~12のうちの整数で入力してください")
return input_month()
return inputmonth.zfill(2)
def input_day():
# input_day では、日の入力をしてもらう
inputday = input("日(例:01)を入力し、エンター ")
"""strptimeで入力した数値にエラーが発生するかどうかで、正しい形式の日が
入力されたか確認を行う"""
try:
Check = datetime.datetime.strptime(inputday,"%d")
except:
print("1~31のうちの整数で日を入力しましょう")
return input_day()
return inputday.zfill(2)
def input_date():
# input_dateを呼び出すと、年月日の入力をしてもらい、その年月日が未来の日付や
# 存在しない日付になっていないかのチェックを行ってから、問題なければ
# ['yyyy', 'mm', 'dd'] といったリスト形式で吐き出すようになっている
print("年月日で入力しましょう")
inputdate = []
inputdate.append(input_year())
inputdate.append(input_month())
inputdate.append(input_day())
try:
# date関数に入力された日付を差し込み、存在する日付を入力しているかのチェックに使った
hikakuinput = datetime.date(int(inputdate[0]),int(inputdate[1]),
int(inputdate[2]))
hikakunow = datetime.date.today()
except:
print("存在しない日付を入力しています。最初から入力し直してください")
if hikakunow > hikakuinput:
pass
else:
print(inputdate[0] + "年" + inputdate[1] + "月" + inputdate[2] + "年")
print("誤った日付が入力されたようです。最初から入力し直してください")
return input_date()
try:
Check = datetime.datetime.strptime(inputdate[0] + inputdate[1] + inputdate[2],"%Y%m%d")
except:
print("誤った日付が入力されたようです。最初から入力し直してください")
return input_date()
return inputdate
a = input_date()
print(a)
さぁ、じゃんじゃんじゃかじゃか持ってっちゃってください。
Python勉強始めてからまだ僅かなので、ツッコミどころがあったらぜひ教えて下さい!
ちなみに
# 例えば●●年2月31日 のように存在していない日付への対応が出来ていない
とコード内で書いたように、存在していない日付への対応が出来ていないので使われる方はご留意くださいね
追記:コメントを頂き、上記のような問題が解決されました!
ありがとうございました。
コメント
すごく楽しそうですね。
余計なお節介かもしれませんがいくつかアドバイスさせて頂きます。
①関数が入れ子になっていて読みづらいです
→input_date()は独立させた方がよいと思います。これは僕の好みかもしれませんが・・・。
②関数の説明があると良いかもしれません
③日付として成立するかどうかのチェックは以下でやっても良いかもしれません
datetime.datetime.strptime(xxxxxx,”%Y/%m/%d”)
④コーディング規約の存在を知っておくと良いと思います。自分の中でルールが統一されてればよいですが可読性が上がりますのでご参考まで。
→PEP8:https://pep8-ja.readthedocs.io/ja/latest/
→Qiita:https://qiita.com/simonritchie/items/bb06a7521ae6560738a7
では、頑張ってください。
見ていただけて光栄です……!
①関数が入れ子になっていて読みづらいです
└改めて見ると、入れ子構造になっている必然性は無いですね。。。
②関数の説明があると良いかもしれません
└関数の説明ですね
確かに何が出来るか、今のままではわからないですもんね(´・ω・`)
③日付として成立するかどうかのチェックは以下でやっても良いかもしれません
└これはいわゆる正規表現というものですかね
別口で正規表現に詰まってしまったので、これを機に学んでみます
④コーディング規約の存在を知っておくと良いと思います。自分の中でルールが統一されてればよいですが可読性が上がりますのでご参考まで。
└ちょうど本日、PEP8というものを見かけて、はえーそんなのあるんですねーって思ったばかりで、とてもタイムリーな助言で嬉しいです!
アドバイスや、的確な助言ありがとうございます神様!