python - 尝试构建一个 python 程序,在用户输入生日时呈现出生日期。当前的尝试就像一个循环
问题描述
我们都知道,在我们目前使用的公历中,一周中的随机一天可以是 7 个选项之一。
我的代码的意图是基于 Arthur Benjamin 的 Think Like A Math Genius (2006) 中的一段,您可以使用数学执行一个简单的派对技巧。使用代码(基本上是根据格里高利的模式实现快捷方式并在除以七后找到余数),可以快速准确地预测一周中的过去和未来几天。
我当前的尝试导致 PyCharm 过度计算并占用了大部分 CPU 活动。我认为这可能是因为我没有像限制“typedMonth”那样限制用户输入“Year”的范围。
这是原始代码:
print("Enter the full date: in dd/Month/yyyy")
Date = int(input("dd:"))
typedMonth = str(input("Month:"))
Year = int(input("yyyy: "))
while not int(Year) in range(0,3000):
Year = int(input("Please enter year (yyyy) limited to [0 - 3000] : "))
if typedMonth in ['January']:
Month = 3
while int(Year) % 4 == 0:
Month = 2
elif typedMonth in ['February']:
Month = 6
while int(Year) % 4 == 0:
Month = 5
elif typedMonth in ['March', 'November']:
Month = 6
elif typedMonth in ['April', 'July']:
Month = 2
elif typedMonth in ['May']:
Month = 4
elif typedMonth in ['August']:
Month = 5
elif typedMonth in ['September', 'December']:
Month = 1
elif typedMonth in ['October']:
Month = 3
elif typedMonth in ['June']:
Month = 0
else:
Month = 0
remYear = Year%400
if 300 <= remYear <= 400:
Year = Year + 1
elif 200 <= remYear <= 300:
Year = Year + 3
elif 100 <= remYear <= 200:
Year = Year + 5
else:
Year = Year + 0
print(remYear)
Day = (Date + int(Month) + remYear) % 7
print(Day)
例如,独立测试表明前四行代码按预期工作(如果我只是 print typedMonth
)。
在筒仓中,靠近末尾的段remYear= Year%400
也可以按预期工作。
因此,在我未经训练的眼睛看来,“过度计算”可能是由于我用来修复来自用户输入字符串的 Month 变量的一段代码typedMonth
。需要强调的是,Month 的初始输入以字符串开头typedMonth
。然后我使用 while 语句将用户输入的字符串转换为整数值。该整数值归属于变量“Month”,因此可以进行整数“Date”、“Month”和“Year”的最终计算。余数将对应于星期几(例如 0 = 星期日、1 = 星期一、2 = 星期二等)。
这是更新的代码(第三次迭代)。感谢下面的评论,我现在可以输入大多数年份作为输入,程序将运行。逻辑错误仍然存在,尤其是分配给月份的代码。我将在未来的迭代中修复它们。
print("Enter the full date: in dd/Month/yyyy")
Date = int(input("dd:"))
typedMonth = str(input("Month:"))
Year = int(input("yyyy: "))
while not int(Year) in range(1,3000):
Year = int(input("Please enter year (yyyy) limited to [0 - 3000] : "))
if typedMonth in ['January']:
Month = 3
while int(Year) % 4 == 0:
Month = 2
elif typedMonth in ['February']:
Month = 6
while int(Year) % 4 == 0:
Month = 5
elif typedMonth in ['March', 'November']:
Month = 6
elif typedMonth in ['April', 'July']:
Month = 2
elif typedMonth in ['May']:
Month = 4
elif typedMonth in ['June']:
Month = 0
elif typedMonth in ['August']:
Month = 5
elif typedMonth in ['September', 'December']:
Month = 1
elif typedMonth in ['October']:
Month = 3
remYear = Year%400
if 300 <= remYear <= 400:
Year = Year + 1
elif 200 <= remYear <= 300:
Year = Year + 3
elif 100 <= remYear <= 200:
Year = Year + 5
else:
Year = Year + 0
calcYear = int(Year % 100)
Day=(Date + Month + calcYear) % 7
print("The date is %d"%Date)
print("The month is %d"%Month)
print("The calculated year is %d"%calcYear)
print("The code for day is %d"%Day)
if Day in [0]:
print("You were born on a Sunday")
elif Day in [1]:
print("You were born on a Monday")
elif Day in [2]:
print("You were born on a Tuesday")
elif Day in [3]:
print("You were born on a Wednesday")
elif Day in [4]:
print("You were born on a Thursday")
elif Day in [5]:
print("You were born on a Friday")
elif Day in [6]:
print("You were born on a Saturday")
print("~~End Of Program~~")
对于限制 Year 的计算范围(限制 Year 的用户输入并不能解决上述问题)或从初始字符串输入“typedMonth”重构变量 month 的值的建议将不胜感激。
PS1 也许我应该为这个项目使用其他软件?我刚开始使用 python,所以我不知道哪些应用程序更适合此类程序。如果您认为这可能是一个可行的解决方案,请推荐!
PS2取得进展!该程序适用于千禧一代婴儿(又名进入 2001 年之后),我仍然需要修复逻辑!
PS3 感谢下面的评论,我现在可以运行该程序。代码中仍然存在明显的逻辑错误。我努力在时间允许的情况下开始这个项目的工作。我会相应地更新这篇文章。感谢您加入我的学习之旅!
解决方案
您问 Python 是否适合此类项目。是的,但如果你使用得当,它会更合适。换句话说,不要让问题变得不必要的困难。
我理解您为了适应编程而实施特定算法的冲动,但我不得不说这不是一个好的选择。日期算术通常很痛苦。如果您想使用计算快捷方式(并且应该),请查看 Python 编程环境提供的快捷方式。
例如:
>>> import datetime
>>> from dateutil import parser
>>> date = "25/December/1999"
>>> datetime.datetime.strftime(parser.parse(date), "%A")
'Saturday'
该dateutil
模块不是标准库的一部分,但值得安装。
推荐阅读
- json - 如何从 HttpClient 获取 json 文件?
- magento2 - 在 Magento2 如何为特定商店创建自定义较少文件?
- javascript - 单击两次禁用折叠
- java - 使用存储访问框架打开特定路径
- ios - XCode UI测试长按左右拖拽按钮
- elasticsearch - 日期之间的 Elasticsearch 聚合字段
- ruby-on-rails-4 - 如何使用符号调用活动记录搜索
- java - 如何将对象 (JAXB) 或 byte[] (来自此对象) 转换为 `org.w3c.dom.Element`?
- javascript - 使用 NodeJS 和 Mongoose 在 MongoDB 中打开了多个连接
- c# - 在 Crystal Reports 中获取数据库字段名称