程序不在编辑器上运行(sublime,atom),并在Web编辑器上使用13 CPU second而关闭



我仍然是编程的初学者,因此下一个代码是为了学习目的而制作的。

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

为了解决这个问题,我想出了 2 种不同的方法,但它们都无法运行,它甚至不打印或 -1,它什么都不做。 最糟糕的部分(我想知道原因(是运行它后,我的计算机开始变慢,所以然后我需要重置或关闭我的 PC(Surface Book 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 不会无限。

你正在重新发明轮子。 您可以使用 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变化,这意味着在第一个闰年之后的所有年份daysOfMonths[1]都将29我们不想要的。对此的解决方案是维护两个单独的daysOfMonths列表或将daysOfMonths[1]值放回28

  2. next_date(2000,1,31)返回(2000, 1, 32)但它应该是(2000, 2, 1).它的发生是因为elif.如果年份是闰年,那么第 2 个、第 3 个条件day > daysOfMonths[month-1]month > 12不会执行,因为它们处于elif但我们希望检查这些条件,即使是闰年。解决方案不是将它们放在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 循环变成无限循环导致程序在您的编辑器中不返回任何内容。 但是Web编辑器可以检测到无限循环并会杀死该过程

最新更新