#python
#python
Вопрос:
У меня есть if
операторы, которые проверяют число, а затем возвращают строковое значение соответствующим образом.
код:
def get_weekday(day):
if day in ['1', 1]:
return 'Monday'
elif day in ['2', 2]:
return 'Tuesday'
elif day in ['3', 3]:
return 'Wednesday'
elif day in ['4', 4]:
return 'Thursday'
elif day in ['5', 5]:
return 'Friday'
elif day in ['6', 6]:
return 'Saturday'
elif day in ['7', 7]:
return 'Sunday'
return 'Invalid day selected'
Вопрос может показаться субъективным, но я думаю, что должен быть pythonic и лучший, более короткий и чистый способ написания этого.
Комментарии:
1. Почему вы используете in? Откуда у вас целые числа и строки?
2. @PadraicCunningham:
day
исходит из Django из шаблона.3. @Yax, значит, django возвращает разные типы?
4. Спасибо за разъяснение моего ответа @Yax. Я скорректировал его и предоставил обновленный вывод в соответствии со спецификацией вашего кода.
Ответ №1:
Вместо этого я бы создал словарь и привел ваш day
к одному типу, а затем посмотрел это в вашем словаре. Это значительно минимизирует ваш код:
def get_weekday(day):
days_dict = {
'1': 'Monday',
'2': 'Tuesday',
'3': 'Wednesday',
'4': 'Thursday',
'5': 'Friday',
'6': 'Saturday',
'7': 'Sunday'
}
return days_dict.get(str(day), 'Invalid day selected')
Итак, что происходит в приведенной выше функции, так это то, что вы передаете свой day
, не имеет значения, передаете ли вы его как строку или как int, приведение выполняется как str
уже. Теперь ваш словарь содержит сопоставление для вас, и поиск будет стоить вам O (1).
get
Метод вернет None
, если не найдет запись в вашем словаре. Однако, согласно вашему требованию, вы хотите вернуть Invalid day selected
недопустимые записи. get
примет дополнительный аргумент, который будет возвращен в случае предоставления недопустимого ключа.
Вот демонстрация различных случаев, которые могут возникнуть, и того, как ведет себя функция:
>>> print(get_weekday(2))
Tuesday
>>> print(get_weekday('5'))
Friday
>>> print(get_weekday("invalid_thing"))
Invalid day selected
Ответ №2:
Вы могли бы использовать словарь. get
Метод словаря возвращает значение по умолчанию 'Invalid day selected'
, когда заданного day
значения нет в словаре:
days_in_week = {1: 'Monday', 2: 'Tuesday', 3: 'Wednesday', 4: 'Thursday', 5: 'Friday', 6: 'Saturday', 7: 'Sunday'}
def func(day):
return days_in_week.get(int(day), 'Invalid day selected')
Использование приведения к целому int
числу позволяет функции принимать как строки, так и целочисленный day
параметр.
Ответ №3:
Общим решением было бы:
def get_day_name(day):
return {
'1': 'Monday',
'2': 'Tuesday',
'3': 'Wednesday',
'4': 'Thursday',
'5': 'Friday',
'6': 'Saturday',
'7': 'Sunday'
}.get(str(day), 'Invalid day selected')
Здесь делается несколько вещей:
- чтобы избавиться от проверки как строк
'2'
, так и целых2
чисел, преобразуйте все в строки:str(day)
- существует сопоставление (
dict
) всех разрешенных строк ('1'
—'7'
) с результатами - вместо того, чтобы просто принимать результат с
{...}[day]
помощью , dictionary предоставляет methogget
, который принимает аргумент по умолчанию, который будет возвращен, если ключ не найден ('Invalid day selected'
) .
Но опять же, поскольку это всего лишь числа, это можно упростить, используя список вместо словаря:
def get_day_name(day):
day = int(day)
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
if 1 <= day <= 7:
return days[day-1]
else:
return 'Invalid day selected'
В этом случае строки сначала преобразуются в целые числа, а затем целые числа используются для получения значения из списка.
Это, конечно, не сработает, если day = 'something that isnt int'
. Это вызвало бы исключение, которое можно было бы обработать, но если это необходимо обработать, решение с помощью dict лучше.
Комментарии:
1. Пример кода хорош, но, пожалуйста, предоставьте описание того, что он делает.
2.
days[7] -> IndexError
days[1] -> Tuesday
3. @Soviut Да, мне показалось, что нужно больше текста, как только я его написал 😉
4. @PadraicCunningham Спасибо.
Ответ №4:
Вы могли бы использовать словарь, он же map, и просто ввести несколько ключей для одних и тех же значений.
Затем вам нужно только запросить у этого словаря значение, соответствующее ключу текущего дня.
Комментарии:
1. Любые комментарии отважного анонимного даунвотера о том, что не так с этим ответом?
2. Вероятно, они проголосовали против вас, потому что вы не предоставили ни одного примера кода.
3. Возможно. И, очевидно, другие ответы лучше. Но спасибо, что вы, двое, дали ответ.
4. Единственное, что я, вероятно, добавил бы к вашему решению, если бы вы шли по маршруту «подсказка», — это предоставить ссылку на документ словаря. Приветствия.
5. Что я и сделал. Ну, только что. Давайте посмотрим, имеет ли это значение 😉