Мой общий подход к такого рода вещам: не начинайте бездельничать, пытаясь переопределить свою собственную логику дат - это сложно, т.е. ты испортишь это для крайних случаев и выглядишь плохо. Подсказка: , если у вас в программе есть арифметика с модом 7, или вы где-нибудь в своей программе рассматриваете даты как целые числа: вы потерпели неудачу . Если бы я увидел «принятое решение» где-нибудь в (или даже рядом) с моей базой кода, кто-то должен был бы начать все сначала. Это порождает воображение, что любой, кто считает себя программистом, проголосует за этот ответ.
Вместо этого используйте встроенную логику даты / времени, которая поставляется с Python:
Сначала получите список всех интересующих вас дней:
from datetime import date, timedelta
FRI = 5; SAT = 6
# a couple of random test dates
now = date.today()
start_date = now - timedelta(57)
end_date = now - timedelta(13)
print start_date, '...', end_date # debug
days = [date.fromordinal(d) for d in
range( start_date.toordinal(),
end_date.toordinal()+1 )]
Затем отфильтруйте только дни, которые являются выходными. В вашем случае вас интересуют вечера пятницы и субботы, которые равны 5 и 6. (Обратите внимание, что я не пытаюсь свернуть эту часть в предыдущее понимание списка, поскольку это будет трудно проверить как правильное).
weekend_days = [d for d in days if d.weekday() in (FRI,SAT)]
for day in weekend_days: # debug
print day, day.weekday() # debug
Наконец, вы хотите выяснить, сколько выходных в вашем списке. Это сложная часть, но на самом деле нужно рассмотреть только четыре случая, по одному для каждого конца в пятницу или субботу. Конкретные примеры помогают прояснить ситуацию, плюс это действительно то, что вы хотите документировать в своем коде:
num_weekends = len(weekend_days) // 2
# if we start on Friday and end on Saturday we're ok,
# otherwise add one weekend
#
# F,S|F,S|F,S ==3 and 3we, +0
# F,S|F,S|F ==2 but 3we, +1
# S|F,S|F,S ==2 but 3we, +1
# S|F,S|F ==2 but 3we, +1
ends = (weekend_days[0].weekday(), weekend_days[-1].weekday())
if ends != (FRI, SAT):
num_weekends += 1
print num_weekends # your answer
Короче, яснее и проще для понимания означает, что вы можете больше доверять своему коду и справляться с более интересными проблемами.