Я использую класс 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
?
Не могли бы вы поставить полный код? что делает 'self.increaseTime()' do, а что такое 'time' и' endtime' изначально? –
@AnandSKumar Отредактированный вопрос для лучшего понимания. inceaseTime просто увеличивает время на 30 мин. –
Другой вопрос: используется 'join', вызывающий' MemoryError'? Принимая во внимание, что использование + не вызывает его? –