嗨,我是Python的初学者,目前正在PyCharm上使用python3.4.1。我最近做了一个项目,计算两个日期之间的天数,但有两个问题。你知道吗
def get_first_day():
while True:
try:
print('First Date')
day = int(input('Day:'))
month = int(input('Month:'))
year = int(input('Year:'))
print(day, '/', month, '/', year)
date = [day, month, year * 365]
get_second_day(date)
except ValueError:
print('You were supposed to enter a date.')
def get_second_day(date_1):
while True:
try:
print('Second Date')
day = int(input('Day:'))
month = int(input('Month:'))
year = int(input('Year:'))
print(day, '/', month, '/', year)
date = [day, month, year * 365]
convert_dates_and_months(date_1, date)
except ValueError:
print('You were supposed to enter a date.')
def convert_dates_and_months(date_1, date_2):
days_unfiltered = [date_1[0], date_2[0]]
months_unfiltered = [date_1[1], date_2[1]]
year = [date_1[2], date_2[2]]
date_unfiltered = zip(days_unfiltered, months_unfiltered, year)
for d, m, y in date_unfiltered:
if m in [1, 3, 5, 7, 8, 10, 12]:
a = 31
elif m in [4, 6, 9, 11]:
a = 30
elif m in [2, 0] and int(y) % 4 is 0:
a = 29
else:
a = 28
m *= a
days = list(filter(lambda x: 0 < x < (a + 1), days_unfiltered))
months = list(filter(lambda x: 0 < x < 13, months_unfiltered))
date_1 = [days[0], months[0], year[0]]
date_2 = [days[1], months[1], year[1]]
determine_date_displacement(date_1, date_2)
def determine_date_displacement(date_1, date_2):
full_dates = zip(date_1, date_2)
days = -1
for k, v in full_dates:
days += (int(v) - int(k))
if days < 0:
days *= -1
print(days)
get_first_day()
第一个问题是计数器返回的两个日期之间的天数不正确。第二个原因是def get\u second\u day由于某些原因在结尾重复。我来告诉你我的意思:
First Date
Day:10
Month:09
Year:03
10 / 9 / 3
Second Date
Day:06
Month:06
Year:06
6 / 6 / 6
1087
Second Date
Day:
我知道在2003年9月10日到2006年6月6日之间有1000天的时间,但是这个项目的回报是1087天。你知道吗
如果有人能解释为什么这个项目返回一个不正确的数字,以及为什么它要求我填写第二次日期再次结束,那将是完美的。你知道吗
因为这是我的第一个问题,而且我是Python的初学者,所以对于在这个问题中看到的任何奇怪的措辞/糟糕的做法,我提前表示歉意。你知道吗
问题1:
您的闰年计算已关闭:
闰年是
years % 4 == 0
,但只有闰年不是year % 100 == 0
,除非 它们也是year % 400 == 0
:问题2:
在你的输入中,你将一年乘以365,而不检查闰年——他们通常有366天,但得到365天——这将导致在计算闰年的天数时缺少天数。你知道吗
问题3:
您有一个控制流问题:
get_second_day()
重复,因为您:break
放在convert_dates_and_months(date_1, date)
后面,放在get_second_day(..)
里面来修复它建议:
您可以通过减少
get_first_day()
和get_second_day()
之间的重复代码量来简化输入—这遵循干燥原则(Don'tRepeatYourself):更好的解决方案是利用datetime and datettime-parsing,特别是如果你想处理输入验证和闰年估计,你需要更多的检查。你知道吗
使用
datetime
模块很简单:输出:
很好的阅读:How to debug small programs (#1)-在它之后,至少可以将您带到控制流问题。你知道吗
相关问题 更多 >
编程相关推荐