程序未在编辑器上运行(崇高,原子),并且由于在Web编辑器上使用13 CPU秒而关闭

时间:2018-07-07 15:55:49

标签: python python-2.7

我仍然是编程的初学者,因此编写下一个代码是出于学习目的。

给出您的生日和当前日期,计算您的年龄 在几天内。补偿leap日。假设生日 和当前日期是正确的日期(并且没有时间旅行)。简而言之,如果您是2012年1月1日出生,今天是 2012年1月2日,您1天大。

尝试解决此问题,我想出了2种不同的方法,但是它们都不运行,它甚至不打印或不打印-1,它什么也不做。最糟糕的部分(我想知道原因)是运行它之后,我的计算机开始减速,因此我需要重置或关闭我的PC(表面书2,所以我认为不是硬件)问题)。我是否正确安装了python?

代码如下:

daysOfMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def isLeapYear(year):
    if year % 4 != 0:
        return False
    elif year % 100 != 0:
        return True
    elif year % 400 != 0:
        return False
    else:
        return True


def next_date(year, month, day):
    day += 1
    if isLeapYear(year) == True:
        daysOfMonths[1] = 29
    elif day > daysOfMonths[month-1]:
        day = 1
        month += 1
    elif month > 12:
        month = 1
        year += 1
    return year, month, day


def daysBetweenDates(y1, m1, d1, y2, m2, d2):
    days = 0
    while [y1, m1, d1] < [y2, m2, d2]:
        y1, m1, d1 = next_date(y1, m1, d1)
        days += 1
    return days

print daysBetweenDates(2000,01,10,2001,01,12)

我正在寻找答案,但是通常当问题与我的相似时,答案要么与调试有关,要么与循环有关(如果无限),但是我已经测试了功能isLeapYearnext_date 。我还通过使用next_date函数将一个日期添加到第一个日期并告诉计算机在日期1和2相同时停止,来确保while不会变为无限。

1 个答案:

答案 0 :(得分:0)

您正在重新发明轮子。您可以使用python的标准库datetime在日期上执行各种操作

实施:

from datetime import datetime

def days_between_dates(date_1, date_2):
    # date format: MM/DD/YYYY you can change to whatever format you need
    date_format = "%m/%d/%Y"
    # convert given date string to python datetime objects
    date_1_object = datetime.strptime(date_1, date_format)
    date_2_object = datetime.strptime(date_2, date_format)

    # substracting date_1 from date_2 result python datetime delta object
    delta = date_2_object - date_1_object

    # return number of days in integer format from delta object
    return delta.days

用法:

days_between_dates('12/12/2018', '12/12/2018') # returns 0
days_between_dates('12/12/2018', '12/13/2018') # returns 1
days_between_dates('12/12/2017', '12/12/2018') # returns 365

为什么您的代码无法正常工作

next_year函数的实现是错误的。错误是

  1. 声明daysOfMonths[1] = 29会永久更改daysOfMonths,这意味着在第一个leap年daysOfMonths[1]之后的所有年份中,29都是我们不想要的。解决方案是维护两个单独的daysOfMonths列表或将daysOfMonths[1]的值放回28

  2. next_date(2000,1,31)返回(2000, 1, 32),但应该是(2000, 2, 1)。它的发生是因为elif。如果year是leap年,则将不会执行2nd,3rd条件day > daysOfMonths[month-1]month > 12,因为它们位于elif中,但是我们想检查这些条件,即使是leap年。解决方案不是将它们放在elif块中,以便所有条件都将始终执行。

next_year的正确实现将是

commonYear = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def next_date(year, month, day):
    day += 1
    daysOfMonths = commonYear
    if isLeapYear(year) == True:
        daysOfMonths = leapYear
    if day > daysOfMonths[month-1]:
        day = 1
        month += 1
    if month > 12:
        month = 1
        year += 1
    return year, month, day

为什么您的程序未在编辑器中运行?可能是因为while循环变成了无限循环,导致程序没有在编辑器中返回任何内容。但是网络编辑器可以检测到无限循环并杀死进程