判斷第幾天(Python)

判斷第幾天要實現的功能:輸入具體時間,判斷是一年中的第幾天。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章