繁体   English   中英

我如何浓缩所有这些“if”语句?

[英]How do I condense all these “if” statements?

我对 python 和一般编程很陌生,我制作了这个程序,可以让你在今天的当前日期添加天数,它会 output 那个日期是什么。 不是很有用,但我对它占用的空间感到非常恼火,并且想知道它是否可以变得更小更紧凑,因为它非常简单。 我其实一点头绪都没有。 因此,如果有人可以向我展示那将是很好的。

import datetime
calendar = {1:"Sunday", 2:"Monday", 3:"Tuesday", 4:"Wednesday", 5:"Thursday", 6:"Friday", 0:"Saturday"}
Day = eval(input("Enter how many days you want to look into the future: "))
todayDate = datetime.date.today()
x = todayDate.strftime("%A")
if x == "Sunday" :
    y = ((1+ Day) % 7)
    print(calendar[y]) 
    exit()
if x == "Monday" :
    y = ((2+ Day) % 7)
    print(calendar[y]) 
    exit()
if x == "Tuesday" :
    y = ((3+ Day) % 7)
    print(calendar[y]) 
    exit()
if x == "Wednesday" :
    y = ((4+ Day) % 7)
    print(calendar[y]) 
    exit()
if x == "Thursday" :
    y = ((5+ Day) % 7)
    print(calendar[y]) 
    exit()
if x == "Friday" :
    y = ((6+ Day) % 7)
    print(calendar[y]) 
    exit()
if x == "Saturday" :
    y = ((7+ Day) % 7)
    print(calendar[y]) 
    exit()

offset = {d: o for o, d in calendar.items()}
y = (offset[x] + day) % 7
print(calendar[y])

您可以使用 timedelta 将任意时间量添加到日期。

from datetime import date, timedelta

x=5#or any amount of days you want
date = date.today()
new_date=date+timedelta(days=x)
print(new_date.strftime('%A'))

如果您不希望创建逆向字典,您可以使用自己的代码执行多种操作。

  • 不要重复自己(打印和退出可以在 if 语句之后完成
  • 使用 elif 避免不必要地检查 if 语句(虽然目前不会发生单独的退出)
x = todayDate.strftime("%A")
if x == "Sunday" :
    y = ((1+ Day) % 7)
elif x == "Monday" :
    y = ((2+ Day) % 7)
elif x == "Tuesday" :
    y = ((3+ Day) % 7)
elif x == "Wednesday" :
    y = ((4+ Day) % 7)
elif x == "Thursday" :
    y = ((5+ Day) % 7)
elif x == "Friday" :
    y = ((6+ Day) % 7)
elif x == "Saturday" :
    y = ((7+ Day) % 7)
print(calendar[y]) 
exit()

Python 3.10 将带来match语句,这将稍微提高效率

x = todayDate.strftime("%A")
match x:
    case "Sunday" :
        y = ((1+ Day) % 7)
    case "Monday" :
        y = ((2+ Day) % 7)
    case "Tuesday" :
        y = ((3+ Day) % 7)
    case "Wednesday" :
        y = ((4+ Day) % 7)
    case "Thursday" :
        y = ((5+ Day) % 7)
    case "Friday" :
        y = ((6+ Day) % 7)
    case "Saturday" :
        y = ((7+ Day) % 7)

通常在压缩/去重代码时,您应该做的第一件事是确定您经常重复的内容是什么。

例如,在您的代码中,我们多次看到这种“结构”:

if x == <SOME DAY>:
    y = ((<SOME INTEGER> + Day) % 7)
    print(calendar[y]) 
    exit()

所以我们想把它抽象掉,所以我们只写一次(见DRY 原则)。

所以我们想写这样的东西:

def increment_days_and_print(day, increment):
    y = ((day + increment) % 7)
    print(calendar[y]) 
    exit()

然后我们可以调用我们定义的 function 来替换所有重复的代码:

def increment_days_and_print(day, increment):
    y = ((day + increment) % 7)
    print(calendar[y]) 
    exit()

calendar = {1:"Sunday", 2:"Monday", 3:"Tuesday", 4:"Wednesday", 5:"Thursday", 6:"Friday", 0:"Saturday"}
Day = eval(input("Enter how many days you want to look into the future: "))
todayDate = datetime.date.today()
x = todayDate.strftime("%A")

if x == "Sunday":
    increment_days_and_print(1, Day)
if x == "Monday":
    increment_days_and_print(2, Day)
if x == "Tuesday":
    increment_days_and_print(3, Day)
if x == "Wednesday":
    increment_days_and_print(4, Day)
if x == "Thursday":
    increment_days_and_print(5, Day)
if x == "Friday":
    increment_days_and_print(6, Day)
if x == "Saturday":
    increment_days_and_print(7, Day)

这已经好多了,不是吗? 我们也可以像这样重构它:

def increment_days_and_print(day, increment):
    y = ((day + increment) % 7)
    print(calendar[y]) 
    exit()

calendar = {1:"Sunday", 2:"Monday", 3:"Tuesday", 4:"Wednesday", 5:"Thursday", 6:"Friday", 0:"Saturday"}
Day = eval(input("Enter how many days you want to look into the future: "))
todayDate = datetime.date.today()
x = todayDate.strftime("%A")

if x == "Sunday":
    start = 1
if x == "Monday":
    start = 2
if x == "Tuesday":
    start = 3
if x == "Wednesday":
    start = 4
if x == "Thursday":
    start = 5
if x == "Friday":
    start = 6
if x == "Saturday":
    start = 7

increment_days_and_print(start, Day)

最后,请注意,我们实际上是在将start设置为一个 svalue,给定一个x的值。 这正是dict的用途:

def increment_days_and_print(day, increment):
    y = ((day + increment) % 7)
    print(calendar[y]) 
    exit()

calendar = {1:"Sunday", 2:"Monday", 3:"Tuesday", 4:"Wednesday", 5:"Thursday", 6:"Friday", 0:"Saturday"}
Day = eval(input("Enter how many days you want to look into the future: "))
todayDate = datetime.date.today()
x = todayDate.strftime("%A")

weekday_numbers = {
  "Sunday": 1,
  "Monday": 2,
  "Tuesday": 3,
  "Wednesday": 4,
  "Thursday": 5,
  "Friday": 6,
  "Saturday": 0
}

start = weekday_numbers[x]

increment_days_and_print(start, Day)

最后,做一些清理工作:

weekday_numbers = [
    (1, "Sunday"),
    (2, "Monday"),
    (3, "Tuesday"),
    (4, "Wednesday"),
    (5, "Thursday"),
    (6, "Friday"),
    (0, "Saturday")
]

num_to_weekday = dict((d, w) for (d, w) in weekday_numbers)
weekday_to_num = dict((w, d) for (d, w) in weekday_numbers)

increment = int(input("Enter how many days you want to look into the future: "))
today = datetime.date.today()
weekday = today.strftime("%A")
start = weekday_to_num[weekday]
next_day = ((start + increment) % 7)
print(num_to_weekday[next_day]) 

由于我们只调用了一次 function,因此不再需要它; 它只是作为一种工具来帮助我们了解我们可以在此过程中进行哪些简化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM