- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我是 Python 初学者,目前在 PyCharm 上使用 Python 3.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_second_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 日之间正好有 1,000 天,但项目返回了 1,087 天。
如果有人能解释为什么这个项目返回了错误的数字,以及为什么它要求我在最后再次填写第二个日期,那就完美了。
由于这是我的第一个问题,而且我是 Python 的初学者,因此对于此问题中出现的任何奇怪的措辞/不良做法,我提前表示歉意。
最佳答案
您的闰年计算已关闭:
闰年是years % 4 == 0
但仅限多年 year % 100 == 0
除非他们也是year % 400 == 0
:
2004,2008,2012 : leap year (%4==0, not %100==0)
1700,1800,1900 : no leap year (%4 == 0 , % 100 == 0 but not %400 == 0)
1200,1600,2000 : leap years (* 1200 theor. b/c gregorian cal start)
在您的输入中,您将年份预乘 365,而不检查闰年 - 他们应该有 366 天,但得到了 365 天 - 这会导致在计算闰年的天数时缺少天数。
您遇到控制流问题:get_second_day()
重复,因为你这样做:
get_first_date()
while without end:
do smth
call get_second_date(..)
while without end:
do smth
call some calculation functions
that calc and print and return with None
back in get_second_date(), no break, so back to the beginning
of its while and start over forever - you are TRAPPED
break
来修复它之后convert_dates_and_months(date_1, date)
里面get_second_day(..)
建议:
您可以通过减少 get_first_day()
之间的重复代码量来简化输入。和get_second_day()
- 这遵循 DRY 原则(D不要R重复Y我们自己):
def getDate(text):
while True:
try:
print(text)
day = int(input('Day:'))
month = int(input('Month:'))
year = int(input('Year:'))
print(day, '/', month, '/', year)
return [day, month, year * 365] # see Problem 2
except ValueError:
print('You were supposed to enter a date.')
def get_first_day():
date1 = getDate("First Date")
# rest of code omitted
def get_second_day(date_1):
date = getDate("Second Date")
# rest of code omitted
<小时/>
更好的解决方案是利用datetime and datettime-parsing ,特别是如果您想处理输入验证和闰年估计,您将需要更多的检查。
使用datetime
模块会简化很多:
import datetime
def getDate(text):
while True:
try:
print(text)
day = int(input('Day:'))
month = int(input('Month:'))
year = int(input('Year (4 digits):'))
print(day, '/', month, '/', year)
# this will throw error on invalid dates:
# f.e. 66.22.2871 or even (29.2.1977) and user
# gets a new chance to input something valid
return datetime.datetime.strptime("{}.{}.{}".format(year,month,day),"%Y.%m.%d")
except (ValueError,EOFError):
print('You were supposed to enter a valid date.')
def get_first_day():
return getDate("First Date")
def get_second_day():
return getDate("Second Date")
# while True: # uncomment and indent next lines to loop endlessly
first = get_first_day() # getDate("First Date") and getDate("Second Date")
second = get_second_day() # directly would be fine IMHO, no function needed
print( (second-first).days)
输出:
First Date
Day:10
Month:9
Year (4 digits):2003
10 / 9 / 2003
Second Date
Day:6
Month:6
Year (4 digits):2006
6 / 6 / 2006
1000
好读:How to debug small programs (#1) - 遵循它,至少可能会导致您遇到控制流问题。
关于python - 为什么此日计数器会产生错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772999/
我在leetcode上看到这段代码,是一道求众数的题,下面是题目描述: 给定一个大小为 n 的数组,找到多数元素。众数元素是出现次数超过 ⌊ n/2 ⌋ 次的元素。 你可以假设数组是非空的并且多数元素
每次在 JavaScript 中执行特定操作时,例如: $(function() { $('#typing').keyup(function () { switch($(this)
我一直在为网页设计一个计数器,但我一直被这个我无法解决的功能所困扰。 我有一个 4 个 div 的计数器,因为其中两个是小数字,另外两个是大数字,所以第一个运行得很快,我看不到它们的功能。 有人知道如
我已经在文档中进行了一些搜索,并在网上花了一段时间,但找不到解决方案!我希望警报告诉我单击 .thumb 时它处于each() 的哪一次迭代。 EG:有六个.thumb,我点击数字3,浏览器弹出3!
在 Handlebars 中,假设我有 names 的集合.我能怎么做 {{#each names}} {{position}} {{name}} {{/each}} 在哪里 {{position}}
这个问题在这里已经有了答案: Numbering rows within groups in a data frame (9 个回答) 4年前关闭。 我们如何在数据帧的每组中生成唯一的 ID 号?以下
我正在努力解决以下问题。我希望为给定的“一”序列创建一个计数器。例如,我有以下内容: 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 鉴于该序列,我希望为 1 的每个序列设置一个计数器直到
我正在努力解决以下问题。我希望为给定的“一”序列创建一个计数器。例如,我有以下内容: 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 鉴于该序列,我希望为 1 的每个序列设置一个计数器直到
我有一个jsfiddle here 这是一个简单的 JavaScript 函数,可以计算出设定的数字。 是否可以进行这种计数,但也保留一位小数 所以它算 1.1、1.2、1.3 等。 func
我正在构建一个计数器,当我按下鼠标时,它应该增加到 maxValue 并且减少不超过 0。我还可以选择将计数器重置为其初始值:0。另外,如果 maxValue 是偶数,它应该计数到该数字。但是,如果
所以我成功地为字母和单词构建了其他计数器,但现在我只能用这个来计算句子。我的代码如下,当我运行它时,它会返回很多错误消息: #include #include #include int main
Closed. This question is off-topic。它当前不接受答案。
我需要一个计数器,它会随着某些任务的完成而递增。我们只需要最后一小时的值,即窗口将移动而不是静态时间。 解决此问题的最佳方法是什么?我能想到的一种方法是拥有一个大小为 60 的数组,每分钟一个,并更新
我希望使用计数器来为我提供独特的引用系统。我想单击一个按钮,然后检查一个字段/文件中的最后一个数字,然后简单地向其添加 1,然后将其插入到屏幕上的字段中? 不确定执行此操作的最佳方法或具体如何执行此操
我有一个用 php 制作的表格,在该表格内我显示了数据库中的一些内容。我在每个 td 中创建了一个简单的按钮(类似于 Like),我希望每次点击它都会增加 1。这是带有按钮的行: echo "
如何将数据库中的值转换为可用于 if else 函数的 int 值? 例如:在我的数据库“armnumber = 3”中,如何在 if else 函数中使用它? 代码 string myConnect
我需要生成唯一的“ids”,问题是,它只能在 1 - 99999 之间。 “好”的是,它仅在与另一列组合时必须是唯一的。 我们有组,每个组都有自己的“group_id”,每个组都需要类似 unique
有这个简单的代码: UPDATE counter SET c= c +1 where id = 1; 并且它在开头的 c 字段中为 null 的情况下不起作用。它只有在已经输入了一些数字时才有效,也就
我正在尝试在 python 中构建一个具有闭包属性的计数器。以下工作中的代码: def generate_counter(): CNT = [0] def add_one():
我使用 CSS 来计算 HTML 文档中的部分: body {counter-reset: sect;} section:before { counter-increment: sect;
我是一名优秀的程序员,十分优秀!