В зависимости от того, что именно вы ищете:
Float
и Double
- в значительной степени то, что вы знаете и «любите» из Float и Doubles на всех других языках. Rational
, который является Ratio
из Integer
с FixedPoint
- Этот пакет предоставляет значения фиксированной точки произвольного размера. Например, если вам нужно число, представленное 64 целыми битами и 64 дробными битами, вы можете использовать FixedPoint6464
. Если вы хотите, чтобы число составляло 1024 целых и 8 дробных битов, используйте $(mkFixedPoint 1024 8)
для генерации типа FixedPoint1024_8
. numbers
, упомянутом выше - очень круто. Я бы просто поместил его в список в начале:
from calendar import Calendar, SUNDAY
cal = Calendar(SUNDAY)
month_dates = list(cal.itermonthdates(year, month))
month_start = month_dates[0]
month_end = month_dates[-1]
Поскольку может быть только 42 дня (с учетом начального и конечного контекстов), это имеет незначительное влияние на производительность.
Также , лучше использовать ВОСКРЕСЕНЬЕ, чем магическое число.
Для этой конкретной проблемы, я думаю, я бы пошел с решением Мэтью Флашена. Мне это кажется наиболее простым.
Если ваш вопрос следует рассматривать в более общем плане, для любого генератора (с неизвестным и, возможно, большим количеством элементов), то что-то более похожее на подход RichieHindle может быть лучше. Моя небольшая модификация его решения состоит не в том, чтобы перечислять и проверять элемент 0, а в том, чтобы просто явно захватить первый элемент:
month_dates = cal.itermonthdates(year, month)
month_start = month_dates.next()
for date in month_dates:
pass
month_end = date
Ричи понял правильную идею. Проще:
month_dates = cal.itermonthdates(year, month)
month_start = month_dates.next()
for month_end in month_dates: pass # bletcherous
Как насчет этого?
for i, date in enumerate(month_dates):
if i == 0:
month_start = date
month_end = date
enumerate ()
позволяет найти первую, а переменная date
выпадает из цикла, чтобы получить последнюю.