Есть ли оператор или более элегантный способ написания оператора if? - PullRequest
0 голосов
/ 16 июня 2020

Я все еще нахожусь на начальных этапах обучения и, очевидно, пытаюсь сократить такие экземпляры, где у меня есть много условных выражений if до go through. Просто интересно, как с этим справится кто-то более опытный? Я пробовал использовать операторы «или» и «и», и я стараюсь вкладывать свои утверждения там, где вижу, что могу, но в целом это все еще кажется довольно неуклюжим. Этот фрагмент кода был частью валидатора даты, использующего регулярное выражение для How To Automate The Boring Stuff, у меня нет оператора else, поскольку в полном коде больше условных выражений. Есть ли способ лучше, или я слишком усложняю его?

    if month == 4 and day == 31:
            print("Invalid date found in text")
            return False
    elif month == 6 and day == 31:
            print("Invalid date found in text")
            return False
    elif month == 9 and day == 31:
            print("Invalid date found in text")
            return False
    elif month == 11 and day == 31:
            print("Invalid date found in text")
            return False

Ответы [ 4 ]

1 голос
/ 16 июня 2020

Как говорили другие, библиотека DateTime - лучший способ проверить правильность даты (поскольку она обрабатывает различные крайние сценарии ios, например, у февраля 28 дней, и т. Д. c.), Но если это просто запись кратко выше, можно попробовать следующее:

month_invalid = True if (month in [4,6,9,11]) else False
day_invalid = True if day==31 else False
if month_invalid or day_invalid:
    return false
1 голос
/ 16 июня 2020

Как говорили другие, вы хотите использовать библиотеку для работы с датами. Но для такого случая, как ваш, вы можете сделать это:

    illegal_dates = [(4,31), (6,31), (9,31), (11,31)]
    if (month, day) in illegal_dates:
            print("Invalid date found in text")
            return False

Когда вы обнаружите, что повторяете, вы можете иногда создать специальный список c значений и l oop через них. В вашем случае нам даже не нужен for l oop, мы можем просто проверить, есть ли кортеж в списке.

1 голос
/ 16 июня 2020

Что насчет этого?

import datetime
try :
    datetime.datetime(int(year),int(month),int(day))
except ValueError :
    print("Invalid date found in text")
    return False
0 голосов
/ 16 июня 2020

Когда у вас есть общее выражение в последовательности операторов if, вы часто можете выделить их, так что это может быть внешнее выражение, управляющее блоком, например: с очевидными индексами вы, вероятно, использовали бы (игнорируя високосный год):

 maxdays = [31,28,31,30,31,30,31,31,30,31,30,31]
 if day > maxdays[month-1]:
     print("Invalid date found in text")
     return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...