2015-06-16 5 views
0

Я использую класс python для создания таблицы HTML, используемой в ежедневном представлении календаря. Для генерации таблицы я рекурсивно вызываю свою функцию до тех пор, пока она не достигнет нужного конца. Я выглядит так:Конкатенация рекурсивной строки Python

# By default time=[0][0] and end_time=[0][24] 
--------------------------------------------- 
def makeRows(self, time, end_time): # time/end_time = [min][hour] 
     row = ['<tr><td>'] 
     if time[1] == end_time[1]: # Base case 
      # String format 
      if time[0] == 0: 
       row.append('%s:00' % time[1]) 
      else: 
       row.append('%s:%s' % (time[1], time[0])) 

      row.append('</td></tr>') 

      return format_html(''.join(row)) 
     else: # Recursive case 

      if time[0] == 0 and time[1] == 0: # First row 
       row.append('0:00') 
       row.append('</td><td rowspan="97"><div class="day_event_container"></div></td></tr>') 
      else: 
       # String format 
       if time[0] == 0: 
        row.append('%s:00' % time[1]) 
       else: 
        row.append('%s:%s' % (time[1], time[0])) 

       row.append('</td></tr>') 

      return format_html(''.join(row)+self.makeRows(self.increaseTime(time), end_time)) 

def increaseTime(self, time): 
     hour = time[1] 
     minute = time[0] 

     if minute == 0: 
      minute+= 30 
     else: 
      hour += 1 
      minute = 0 

     return [minute, hour] 

Недавно я изменил все мои строки конкатенации от += к ''.join() но только «» наивным «» конкатенация в моем рекурсивном вызове.

функция обычно вызывается 48 раз, чтобы генерировать строки из 0:00->24:00

ли «» наивная «» конкатенация в моем рекурсивном вызове действительно, что дорога для вызовов 48 функций?

Как бы я заменил свою «наивную» конкатенацию, если она на самом деле очень дорогостоящая?

Я пытался делать

return format_html(''.join(row).join(self.makeRows(self.increaseTime(time), end_time)))

но бросает Exception Type: MemoryError и я предполагаю, что это просто переполняет куча или стек или там, где ее хранить.

Наконец, я довольно новичок в python, и я на 99% уверен, что это очень далеко от питонического способа делать вещи. Итак, существует ли более питонический способ генерации ежедневного календарного вида от 0:00 до 24:00?

+0

Не могли бы вы поставить полный код? что делает 'self.increaseTime()' do, а что такое 'time' и' endtime' изначально? –

+0

@AnandSKumar Отредактированный вопрос для лучшего понимания. inceaseTime просто увеличивает время на 30 мин. –

+0

Другой вопрос: используется 'join', вызывающий' MemoryError'? Принимая во внимание, что использование + не вызывает его? –

ответ

0

Кажется мне, как вы пытаетесь заменить -

format_html(''.join(row)+self.makeRows(self.increaseTime(time), end_time)) 

С

format_html(''.join(row).join(self.makeRows(self.increaseTime(time), end_time))) 

Но это не правильно, и возвращать разные вещи. Давайте очень простой пример, чтобы объяснить -

>>> ''.join('Bye').join('Hello') 
'HByeeByelByelByeo' 
>>> ''.join('Bye') + 'Hello' 
'ByeHello' 

Я думаю, вы должны сохранить текущее использование + конкатенаций вместо того, чтобы пытаться сделать его работать лучше, если вы не работаете с очень большим списком строк, чтобы быть конкатенированный, что, похоже, не так.

+0

'. .join (row)' требуется, поскольку строка - это список, а не строка –

+0

Хорошо, я только что заметил это. –

Смежные вопросы