【发布时间】:2015-06-16 19:08:03
【问题描述】:
我正在使用一个 python 类来生成一个用于日历每日视图的 HTML 表格。为了生成表格,我递归地调用我的函数,直到它到达所需的结尾。我看起来是这样的:
# 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 个函数调用真的那么昂贵吗?
如果我的 ''naive'' 连接实际上非常昂贵,我将如何替换它?
我试过了
return format_html(''.join(row).join(self.makeRows(self.increaseTime(time), end_time)))
但这会抛出Exception Type: MemoryError,我猜它只是溢出了堆或堆栈或它存储的任何地方。
最后,我对 python 还是很陌生,我 99% 确信这与 python 的做事方式相去甚远。那么有没有更pythonic的方式来生成从0:00到24:00的每日日历视图?
【问题讨论】:
-
你能把完整的代码吗?
self.increaseTime()是做什么的,time和endtime最初是什么? -
@AnandSKumar 编辑了问题以便更好地理解。 inceaseTime 只是将时间增加了 30 分钟
-
另一个问题,是使用
join导致MemoryError吗?然而,使用 + 不会导致它? -
@AnandSKumar yes 使用第二个
join会导致MemoryError
标签: python recursion string-concatenation