/ / Python rekurencyjne konkatenacja ciągów - python, rekurencja, konkatenacja ciągów

Python rekursywna konkatenacja ciągów - python, rekursja, konkatenacja ciągów

Używam klasy python do generowania tabeli HTML używanej w codziennym widoku kalendarza. Aby wygenerować tabelę, rekursywnie wywołuję moją funkcję, aż osiągnie pożądany koniec. Wygląda tak:

# 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]

Niedawno zmieniłem wszystkie moje konkatenacje ciągów += do "".join() ale jedyną „naiwną” konkatenacją jest moje rekurencyjne wezwanie.

Funkcja jest zwykle wywoływana 48 razy w celu wygenerowania wierszy 0:00 -> 24:00

Czy połączenie „naiwne” w moim wywołaniu rekurencyjnym jest tak drogie dla 48 wywołań funkcji?

Jak miałbym zastąpić moją „naiwną” konkatenację, jeśli faktycznie jest bardzo kosztowna?

Próbowałem to zrobić

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

ale to rzuca Exception Type: MemoryError i zgaduję, że po prostu przepełnia stertę lub stos lub gdziekolwiek jest przechowywany.

Wreszcie, jestem całkiem nowy w Pythonie i jestem w 99% pewien, że jest to bardzo dalekie od pythonicznego sposobu robienia rzeczy. Czy istnieje bardziej pythonowy sposób generowania codziennego widoku kalendarza 0:00 do 24:00?

Odpowiedzi:

0 dla odpowiedzi № 1

Wydaje mi się, że próbujesz zastąpić -

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

Z

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

Ale to nie jest poprawne, obie zwracają różne rzeczy. Weźmy bardzo prosty przykład, aby wyjaśnić -

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

Myślę, że powinieneś zachować swoje obecne użycie + operator konkatenacji zamiast próbować poprawić jego wydajność, chyba że pracujesz z bardzo dużą listą łańcuchów do konkatenacji, co nie wydaje się tak.