Python:如何简化长布尔表达式?

时间:2015-03-06 14:20:35

标签: python boolean-expression

def date():
    date = input()
    d,m,y = date.split('/')
    yd400 = int(y) % 400
    yd4 = int(y) % 4
    yd100 = int(y) % 100
    if m == '2' and d == '30':
        print('Invalid Date')

    elif m == '2' and d == '29' and  (yd400 != 0 or (yd4 != 0 and yd100 == 0)):
        print('Invalid Date')

    elif d == '31' and (m == '2' or m == '4' or m == '6' or m == '9' or m == '11'):
        print('Invalid Date')

    else:
        print('Valid Date')

有没有办法简化这部分?

(elif d == '31' and (m == '2' or m == '4' or m == '6' or m == '9' or m == '11'))

我写这篇文章是为了验证插入日期的有效性,而不使用import datetime

2 个答案:

答案 0 :(得分:4)

对集合使用成员资格测试:

d == '31' and m in {'2', '4', '6', '9', '11'}

请注意,您的代码可能需要处理月份和日期部分中的前导0个字符:

d, m = d.lstrip('0'), m.lstrip('0')

因此02/03/2015仍被视为有效日期。

答案 1 :(得分:0)

在上面的示例中,您的上面的代码似乎对大量错误的输入感到非常满意-每月大于32天,负数日或负数月,即0年...

您似乎已经考虑过正确设置leap年,这是值得称赞的,但是很简单

datetime.datetime.strptime(input(), '%m/%d/%Y')

不仅具有“仅需工作”的功能,而且可读性强,并且不需要像您上面制作的产品那样多的维护。

您询问了如何在没有import datetime的情况下执行此操作-这是一个危险信号。已经有人进行了繁重的工作,您可能会因此受益。