2015-06-16 73 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%确定这与pythonic的做事方式非常遥远。那么是否有更多pythonic的方式来生成从0:0024:00的每日日历视图?

+0

你能把完整的代码? 'self.increaseTime()'做了什么,最初是什么'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

好吧,是的,刚才注意到了。 –