Как бы вы сократили эту длинную функцию if/elif?

#python #if-statement

Вопрос:

Этот код работает по назначению, но не очень элегантен. Я ищу разные точки зрения или лучшие методы получения одного и того же результата. Кроме того, если у вас есть какие-либо рекомендации по соглашениям об именах, когда речь заходит о переменных для удобства чтения кода, обратная связь приветствуется.

 def get_oldest(date1, date2):
    """Given 2 date strings in "MM/DD/YYYY" format, return oldest one."""
    date_one = date1.split("/")
    date_two = date2.split("/")
    if date_one[2] < date_two[2]:
        return date1
    elif date_one[2] > date_two[2]:
        return date2
    elif date_one[2] == date_two[2]:
        if date_one[0] < date_two[0]:
            return date1
        elif date_one[0] > date_two[0]:
            return date2
        elif date_one[0] == date_two[0]:
            if date_one[1] < date_two[1]:
                return date1
            elif date_one[1] > date_two[1]:
                return date2
            elif date_one[1] == date_two[1]:
                return date1


get_oldest("06/21/1958", "06/24/1958")
 

Комментарии:

1. Вопросы, требующие проверки рабочего кода, лучше подходят для codereview.stackexchange.com . Тем не менее, почему бы не проанализировать ваши строки как даты, а затем просто сравнить даты вместо этого?

2. @shree.pat18 Спасибо за предложение, о котором я не знал в разделе обзора кода. Я также опубликую их. В данном конкретном случае профессор прямо сказал не использовать какие-либо модули, которые анализируют даты.

3. Рассмотрите небольшую функцию для повторного преобразования входных дат в целое число, например, мм/дд/гггг в ггггммдд, и просто используйте алгоритм сортировки для перестановки по мере необходимости и просто восстановите ввод даты из «целого числа».

4. @JasonChia Спасибо за предложение. Это то, что я сделал, и это работает! Спасибо!

Ответ №1:

Есть ли причины не использовать встроенную библиотеку datetime?

 from datetime import datetime

def get_oldest(date1, date2):
    date_one = datetime.strptime(date1, "%m/%d/%Y")
    date_two = datetime.strptime(date2, "%m/%d/%Y")
    if date_one < date_two:
        return date_one
    else:
        return date_two

print(get_oldest("06/21/1958", "06/24/1958"))
print(get_oldest("01/23/2005", "12/31/2004"))
 

ВОЗВРАТ

 1958-06-21 00:00:00
2004-12-31 00:00:00
 

Комментарии:

1. Фу-у, тебе бы min() тоже пригодилось: return min([date_one, date_two])

Ответ №2:

Шаг 1: Используйте нормальный формат даты. mm/dd/yyyy это не нормальный формат даты.

Шаг 2: Используйте встроенную min() функцию.

Нет никакого шага 3.

 min(["1958-06-21", "1958-06-24"])
 

min() ожидает список значений. Этот список может состоять из 1-N пунктов. Это хорошо работает для вашего случая (наименьшее из двух значений), но любой другой случай работает так же хорошо.

Комментарии:

1. Я изменил формат даты, и теперь он работает! Спасибо!

2. @Jack Take-away: Вы избавите себя от огромной головной боли, если никогда не будете использовать локализованные форматы дат в коде. Всегда используйте формат даты ISO или типы данных фактической даты для хранения и передачи дат. Вы всегда можете легко создавать локализованные форматы, например mm/dd/yyyy , с помощью стандартных функций форматирования даты , но вы должны использовать эти форматы только для отображения.