Идти глубже - доходность изнутри доходность

1

Есть ли один лайнер, чтобы взять генератор и получить все элементы в этом генераторе? Например:

def Yearly(year):
  yield YEARLY_HEADER
  for month in range(1, 13):
    # How can I rewrite the following two lines?
    for line in Monthly(month):
      yield line
  yield YEARLY_FOOTER

def Monthly(month):
  yield MONTHLY_HEADER
  for day in range(31):  # Yes, this is wrong
    yield 'Day %d' % day
  yield MONTHLY_FOOTER

Возможно, есть лучшие способы переписать весь этот метод?

  • 1
    Я не думаю, что есть, и я нахожу ваш код отлично читаемым, как сейчас. Простое лучше, чем сложное.
  • 0
    Алексей, рад тебя видеть. :)
Показать ещё 2 комментария
Теги:
yield

2 ответа

3
Лучший ответ

Для этого случая нет специального синтаксиса.

Что вам нужно, описано в PEP 380. Это было уже много лет, но я не думаю, что скоро это произойдет в Python. for .. yield достаточно прост, а другие изменения, которые он предлагает, довольно сложны.

  • 0
    Спасибо! Какой дурацкий 15-минутный минимальный лимит :(
  • 1
    Python 3.2 выйдет в ближайшие пару недель. PEP 380 фактически намечен для включения в Python 3.3, но он выйдет не раньше конца 2012 года.
Показать ещё 1 комментарий
4
import itertools

def Yearly(year):
  return itertools.chain(*[(YEARLY_HEADER,)] + 
                         [Monthly(m) for m in range(1, 13)] + 
                         [(YEARLY_FOOTER,)])

В основном, делая YEARLY_HEADER и YEARLY_FOOTER в итераторах, они могут быть привязаны к месячным итераторам.

  • 6
    Хороший вопрос здесь. Да, есть одна строка. Как и в большинстве однострочников, его сложнее читать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню