2017-05-22 92 views
-2

我寫了下面的代碼的條件計:更新日期,如果如果匹配

daysInMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
startDate = {'day': 1, 'month': 1, 'year': 1901, 'dayOfTheWeek': 3} 
endDate = {'day': 31, 'month': 12, 'year': 2000, 'dayOfTheWeek': 1} 
counter = 0 


def update_date(): 
    startDate['day'] += 1 
    startDate['dayOfTheWeek'] += 1 
    if startDate['dayOfTheWeek'] > 7: 
     startDate['dayOfTheWeek'] = 1 
    if startDate['day'] > daysInMonths[startDate['month'] - 1]: 
     startDate['day'] = 1 
     startDate['month'] += 1 
    if startDate['month'] > 12: 
     startDate['month'] = 1 
     startDate['year'] += 1 
    if startDate['year'] % 4 == 0 and not startDate['year'] % 100 == 0: 
     daysInMonths[2] = 29 


def compare(): 
    if startDate['day'] != endDate['day']: 
     return True 
    if startDate['month'] != endDate['month']: 
     return True 
    if startDate['year'] != endDate['year']: 
     return True 
    return False 

while compare(): 
    if startDate['day'] == startDate['dayOfTheWeek'] == 1: 
     counter += 1 
     print(counter) 
    print(startDate) 
    update_date() 

所以我想在今天是星期天在每月的第一天來算,但我得到一個壞的結果(173),我的代碼出錯了嗎?

+2

善良你的代碼需要'datetime'和'calendar'庫! –

+0

當你簡單地執行'startDate!= endDate'時,你爲什麼需要'compare()'? – DyZ

+0

因爲它沒有工作 –

回答

4

你的整個代碼可表示爲:

import calendar 
import itertools 

first_of_months = itertools.product(range(1901, 2001), 
            range(1,13), 
            itertools.repeat(1)): 
result = sum(1 for y,m,d in first_of_months 
      if calendar.weekday(y,m,d) == calendar.SUNDAY) 

或者等效地:

from calendar import weekday, SUNDAY 

total = 0 
for y in range(1901, 2001): 
    for m in range(1, 13): 
     d = 1 
     if weekday(y, m, d) == SUNDAY: 
      total += 1 
+0

再一次,不要使用0-12 dangit。 – RMSD

+1

@LTT吧? 'calendar.weekday' [記錄](https://docs.python.org/3/library/calendar.html?highlight=calendar#calendar.weekday)預計爲1-12個月。 –

+0

是的,我也查了它,這是...尷尬。雖然我明白他們想使用人類可讀的日期,但對於使用基於零的容器的語言查看基於一個範圍的範圍,我感到很奇怪。無論如何,我現在知道! – RMSD

0

更短的解決方案(更多是出於好奇不是必要的):

import calendar 

sum(calendar.monthrange(year,month)[0]==calendar.SUNDAY 
    for year in range(1901,2001) 
    for month in range(1,13))