如果函数中的其他块之后的新If语句返回意外结果

时间:2014-08-15 03:16:06

标签: python python-2.7

我希望得到一个功能,工作日返回1,周末2,节假日3。 如果假期在平日,我希望它返回3。 我试过了:

from datetime import datetime

def type(d):
    if d.weekday() in [0, 1, 2, 3, 4]:
        return 1         # return type 1, weekdays
    else:
        return 2         # return type 2, weekends
    if d in (datetime(2014, 1, 1), \
            datetime(2014, 5, 26), \
            datetime(2014, 7, 4), \
            datetime(2014, 9, 1), \
            datetime(2014, 11, 27), \
            datetime(2014, 12, 25)):
        return 3         # return type 3, holidays

print type(datetime(2014, 1, 1))     # return 1 instead of 3

然后我用if替换了else,仍然得到相同的结果:

def type(d):
    if d.weekday() in [0, 1, 2, 3, 4]:
        return 1         # return type 1, weekdays
    if d.weekday() in [5, 6]:
        return 2         # return type 2, weekends
    if d in (datetime(2014, 1, 1), \
            datetime(2014, 5, 26), \
            datetime(2014, 7, 4), \
            datetime(2014, 9, 1), \
            datetime(2014, 11, 27), \
            datetime(2014, 12, 25)):
        return 3         # return type 3, holidays

3 个答案:

答案 0 :(得分:2)

您的支票应该从具体到一般。在这种情况下,这意味着您应该在检查工作日或周末之前检查假期。

from datetime import datetime

def day_type(d):
    if d in (datetime(2014, 1, 1),
            datetime(2014, 5, 26),
            datetime(2014, 7, 4),
            datetime(2014, 9, 1),
            datetime(2014, 11, 27),
            datetime(2014, 12, 25)):
        return 3         # return type 3, holidays
    elif d.weekday() in [0, 1, 2, 3, 4]:
        return 1         # return type 1, weekdays
    else:
        return 2         # return type 2, weekends

此外,你不需要那些反斜杠来继续你的行 - 周围的()使这不必要。 type是内置的Python,因此将您的函数重命名为day_type(),以便您不会隐藏type()

答案 1 :(得分:0)

首先检查假期:

from datetime import datetime
def type(d):
    if d in (datetime(2014, 1, 1), \
            datetime(2014, 5, 26), \
            datetime(2014, 7, 4), \
            datetime(2014, 9, 1), \
            datetime(2014, 11, 27), \
            datetime(2014, 12, 25)):
        return 3
    if d.weekday() in [0, 1, 2, 3, 4]:
        return 1
    else:
        return 2
print type(datetime(2014, 1, 1))

答案 2 :(得分:0)

更合适的方法是检查假期,然后是周末和其他工作日

def type(d):

    if d in (datetime(2014, 1, 1), \
            datetime(2014, 5, 26), \
            datetime(2014, 7, 4), \
            datetime(2014, 9, 1), \
            datetime(2014, 11, 27), \
            datetime(2014, 12, 25)):
        daytype = 3          # return type 3, holidays
    elif d.weekday() in [5,6]:
        daytype = 2         # return type 2, weekends
    else:
        daytype =  1    # return type 3 weekdays

    return daytype