判斷第幾天要實現的功能:輸入具體時間,判斷是一年中的第幾天。
(1)將輸入的時間由str類型轉化爲datetime類型需要datetime庫中的datetime.strptime函數,而.year,.month,.day分別提取int型的年、月、日。
(2)一年中各月份對應的天數可以用不同的數據結構表示,1.0,2.0,3.0,4.0分別用元組,列表,集合和字典表示。
1.0:將每月對應的天數按照順序放入一個元組中(2月先輸入28天),得到輸入的月份後對元組中的切片(:month-1)元素求和(注意:元組的索引比月份小1)。這裏默認2月有28天,對於閏年的情況需要進行判斷,如果輸入的是閏年並且月份大於2時,需要多加一天,如果月份不大於2,即使是閏年也不需要多加一天。
"""
1.0:判斷一年中的第幾天
"""
from datetime import datetime
def main():
date_str = input("請輸入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days_in_tup = (31,28,31,30,31,30,31,31,30,31,30,31)
days = sum(days_in_tup[:month-1]) + day
if (year%100!=0 and year%4==0) or (year%400 ==0):
if month>2:
days +=1
print("這是一年中的第{}天".format(days))
if __name__=="__main__":
main()
2.0:首先對判斷閏年的函數進行封裝,使得代碼更結構化。用列表代替元組。列表與元組最大的區別在於列表可以更改,而元組不可變。將每月對應的天數按照順序放入列表中(2月輸入28天),然後判斷輸入的年份是否爲閏年,如果是閏年,將列表中2 月對應的天數改爲29,最後對列表中的切片元素求和。
"""
2.0:用列表代替元組
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("請輸入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days_in_list = [31,28,31,30,31,30,31,31,30,31,30,31]
if is_leap_year(year):
days_in_list[1] = 29
days = sum(days_in_list[:month-1]) + day
print("這是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()
3.0:將不同天數的月份用集合表示,創建兩個集合,分別是天數爲30天和31天的月份,這兩個集合均不包括2月,days(求得總天數)的初始值爲輸入的日期當月的天(day),通過循環遍歷輸入的月份之前的月份,若第i月有31天(判斷i在哪個集合中)days中加31,若第i月有30天,days加30,當遍歷至2月時,days加28。最後判斷是否爲閏年,如果是閏年且輸入月份大於2,days+1。
"""
3.0:將月份用不同的集合表示
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("請輸入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days = day
_30days_month = {4,6,9,11}
_31days_month = {1,3,5,7,8,10,12}
for i in range(1,month):
if i in _30days_month:
days += 30
elif i in _31days_month:
days += 31
else:
days += 28
if is_leap_year(year) and month > 2:
days += 1
print("這是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()
4.0:將月份與對應的天數用字典表示。字典的訪問同列表不同,字典的訪問索引爲鍵。
(1)鍵爲月份,值爲天數。days初始值爲day,然後遍歷輸入的月份之前的每一個月,days加上鍵i對應的值(2月28天),最後判斷是否爲閏年,如果是閏年且月份大於2,days+1。
"""
4.0:將月份和對應的天數用字典表示
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("請輸入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days = day
month_day_dict = {
1:31,
2:28,
3:31,
4:30,
5:31,
6:30,
7:31,
8:31,
9:30,
10:31,
11:30,
12:31
}
for i in range(1,month):
days += month_day_dict[i]
if is_leap_year(year) and month > 2:
days += 1
print("這是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()
(2)鍵爲天數,值爲對應的月份(不包括2月份)。通過訪問字典的鍵獲得對應的月份,後面的代碼同3.0。
"""
4.0:將月份與天數用字典表示
"""
from datetime import datetime
def is_leap_year(year):
leap = False
if (year % 100 != 0 and year % 4 == 0) or (year % 400 == 0):
leap = True
return leap
def main():
date_str = input("請輸入日期(yyyy/mm/dd):")
date_input = datetime.strptime(date_str,"%Y/%m/%d")
year = date_input.year
month = date_input.month
day = date_input.day
days = day
day_month_dict = {
31:{1,3,5,7,8,10,12},
30:{4,6,9,11}
}
for i in range(1,month):
if i in day_month_dict[30]:
days += 30
elif i in day_month_dict[31]:
days += 31
else:
days += 28
if is_leap_year(year) and month > 2:
days += 1
print("這是{}年中的第{}天".format(year,days))
if __name__=="__main__":
main()