使用python计数器程序看似奇怪的行为

时间:2013-06-28 23:58:47

标签: python date iterator

最近任务的一部分是设计一个计算日期之间天数的程序。我还没有完成,我知道这可以大大改善。但是,我的问题是:当我使用 date2 (下面)运行此程序时,会出现错误,但这会按计划运行 date1 (同样如下)。我觉得这个行为很奇怪。这些日期相隔仅一天,但一次失败,一次失败。我已经尝试了多个日期,但每个都在994天后失败,无论月,年,日等等。的为什么吗

澄清:我将“失败”定义为

  File "first.py", line 35, in counter
    return counter(date_array, x+1)

def date_test(date_array):
    first = (date_array[0], date_array[1], date_array[2])
    second = (date_array[3], date_array[4], date_array[5])
    if first > second:
        return False
    elif first != second:
        return True
    elif first == second:
        return False
    else:
        return "Error: This shouldn't happen."

def counter(date_array, x = 0):
    months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    while(date_test(date_array)):
        if(date_array[2] == 31 and date_array[1] == 12):
            date_array[0] += 1; date_array[1], date_array[2] = 1, 1
            return counter(date_array, x+1)
        else:
            if date_array[2] < months[date_array[1]-1]:
                date_array[2] += 1
                return counter(date_array, x+1)
            else:
                date_array[1] += 1; date_array[2] = 1;
                return counter(date_array, x+1);
    return x

def tuple_test(date):
    date_array = []
    for x in date:
        date_array.append(x)
    if not date_test(date_array):
       return "The first date is before the second. Swap them."
    return counter(date_array)

date1 = (1900,1,1,1902,9,22)
date2 = (1900,1,1,1902,9,23)

print tuple_test(date1)
print tuple_test(date2)

2 个答案:

答案 0 :(得分:0)

你应该使用python提供的工具

>>> import datetime
>>> date1 = (1900,1,1,1902,9,22) #your weird list with 2 dates
>>> dt1 = datetime.date(*date1[:3]) #create a date object  == datetime.date(1900,1,1)
>>> dt2 = datetime.date(*date1[3:]) #create a date object  == datetime.date(1902,9,22)
>>> if dt1 < dt2: dt1,dt2 = dt2,dt1 #if dt1 is smaller than dt2, swap them
...
>>> print (dt1 - dt2).days #subtract them and print their days
994
>>>

答案 1 :(得分:0)

错误的原因是您已超出最大递归深度。

要“破解”(并验证)此问题,您只需添加

即可
import sys 
sys.setrecursionlimit(10000)

到代码顶部