Причина ваш код возвращает только одно название дня, потому что weekday
никогда не будет соответствовать более чем одной строки в days
кортеж и, следовательно, не будет добавлять любой из дней с момента недели, которые следуют за ним (и не обертываются перед теми, кто до него). Даже если это так или иначе, оно все равно вернет их как одну длинную строку, потому что вы инициализируете result
пустой строкой, а не пустой list
.
Это решение, которое использует модуль datetime
, чтобы создать список всех названий дней недели, начиная с «Понедельник» на языке текущей языковой версии. Этот список затем используется для создания другого списка имен в желаемом порядке, который возвращается. Он упорядочивает поиск индекса назначенного дня в исходном списке и затем сплайсирует вместе два его фрагмента относительно этого индекса, чтобы сформировать результат. В качестве оптимизации он также кэширует имена дня локали, поэтому, если он когда-либо снова называется с той же текущей локалью (вероятный сценарий), ему не нужно будет воссоздать этот закрытый список.
import datetime
import locale
def weekdays(weekday):
current_locale = locale.getlocale()
if current_locale not in weekdays._days_cache:
# Add day names from a reference date, Monday 2001-Jan-1 to cache.
weekdays._days_cache[current_locale] = [
datetime.date(2001, 1, i).strftime('%A') for i in range(1, 8)]
days = weekdays._days_cache[current_locale]
index = days.index(weekday)
return days[index:] + days[:index]
weekdays._days_cache = {} # initialize cache
print(weekdays('Wednesday'))
# ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
Кроме того, не нуждаясь в труднодоступную коде дней имен в функции, другое преимущество использования datetime
модуля является то, что код использования он будет автоматически работать и на других языках. Это можно проиллюстрировать, изменив локаль, а затем вызывая функцию с именем дня на соответствующем языке.
Например, хотя Франция не является моей базой по умолчанию, я могу установить ее как текущую для целей тестирования, как показано ниже. Примечание. В соответствии с этой статьей Capitalization of day names имена дней недели не капитализируются на французском языке, как в моем стандартном английском языке, но это также учитывается автоматически, что означает, что имя, переданное на него, должно быть weekday
на языке текущего языка и также учитывает регистр. Конечно, вы можете изменить функцию, чтобы игнорировать буквенный указатель входного аргумента, если это необходимо.
# set or change locale
locale.setlocale(locale.LC_ALL, 'french_france')
print(weekdays('mercredi')) # use French equivalent of 'Wednesday'
# ['mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'lundi', 'mardi']
хорошее и простое решение) – Gusto