LINUX.ORG.RU

при первом попадании в рекурсионную функцию выполнить условие

 ,


0

1

Описание такое: есть шаблон и есть страничка html

<table>
    <tr><td></td><td></td>
    </tr><tr><td></td><td></td>
    </tr><tr><td></td><td></td></tr>
</table>
<table>
    <tr><td>veered</td><td>123</td>
    </tr><tr><td>dfvdfb</td><td>6767</td>
    </tr><tr><td>cvbfgb</td><td>123</td></tr>
</table>

я сравниваю строки и если они не равны посимвольно в рекурсии сравниваю каких данных нет и эти данные вывожу. Это всё работает!

Теперь собственно вопрос:

Хочу выделить (руками) начала нужных строк в шаблоне «#$» чтобы обрабатывать только их:

<table>
#$    <tr><td></td><td></td>
#$    </tr><tr><td></td><td></td>
#$    </tr><tr><td></td><td></td></tr>
</table>

собственно хочется что-то такое:

def recursion(position1, string1, position2, string2):
    if string2[:2] == "#$":
        new_string = string[2:] # получили подстроку без этих символов
    else: 
        for each symbol in  new_string and string1: # в цикле посимвольно
        # здесь обрабатываю разницу в символах и ставлю курсоры для рекурсивного чтения строки
         ....

        recursion(position1, string1, position2, new_string)    

и когда я передаю в рекурсию new_string от неё разумеется отщипнутся ещё два символа на следующем шаге. Вот мне нужно этого избежать.

Есть какой-то грамотный паттерн чтоли?

★★★★★

Последнее исправление: sniper21 (всего исправлений: 3)

Есть какой-то грамотный паттерн чтоли?

Сделай вложенную функцию, а разовое действие выполняй только в основной.

def recursion(position1, string1, position2, string2):
    do_once()

    def recursion_impl(position1, string1, position2, string2):
        ....
        ....
        ....

    return recursion_impl(position1, string1, position2, string2)
i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)

А так ли рекурсия необходима? Если нет, то reduce с инициализером.

при первом попадании в рекурсионную функцию выполнить условие

Это вроде как противоречит функциональщине, когда результат выполнения функции зависит только от аргументов, но ни от внешнего кода, ни от «номера попадания».

vvn_black ★★★★★
()
Ответ на: комментарий от i-rinat

Сделай вложенную функцию, а разовое действие выполняй только в основной.

так победим.

или так:

def recursion(position1, string1, position2, string2, first_run=True):
    if first_run:
        ....
        ....
    recursion(position1, string1, position2, string2, first_run=False)

...

recursion(0, "asdf", 0, "qwer")

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

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 2)

А можно еще и ...., а то интересно же, где ты неправ.

t184256 ★★★★★
()
Ответ на: комментарий от sniper21

Что-то ты не то делаешь.

когда я передаю в рекурсию new_string от неё разумеется отщипнутся ещё два символа на следующем шаге

Только если они равны твоему «шебангу».

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

У тебя в предыдущем посте была здравая идея через zip() объединять парами строки шаблона и страницы.

Потом достаточно будет их отфильтровать по несовпадению и не надо никак выделять строки в шаблоне.

Или есть различающиеся строки, которые не надо обрабатывать?

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
template = '''
<table>
    <tr><td></td><td></td>
#$    </tr><tr><td></td><td></td>
#$    </tr><tr><td></td><td></td></tr>
</table>
'''

html = '''
<table>
    <tr><td>veered</td><td>123</td>
    </tr><tr><td>dfvdfb</td><td>6767</td>
    </tr><tr><td>cvbfgb</td><td>123</td></tr>
</table>
'''

res = zip(html.split('\n'), template.split('\n'))
res = filter(lambda x: x[0] != x[1] and x[1][:2] == '#$', res)
res = map(lambda x: (x[0], x[1].replace('#$', '')), res)
print(list(res))
[('    </tr><tr><td>dfvdfb</td><td>6767</td>', '    </tr><tr><td></td><td></td>'),
 ('    </tr><tr><td>cvbfgb</td><td>123</td></tr>', '    </tr><tr><td></td><td></td></tr>')]
vvn_black ★★★★★
()
Ответ на: комментарий от anonymous

ух тыыы... в питон не завезли static из плюсов !

я питон уже забыл почти. Сейчас освежаю. Правда нету?

golodranez ★★★★
()
Ответ на: комментарий от anonymous

в питон не завезли static из плюсов

больше глобальных состояний богу состояний!

есть такое свойство функции как реентрабельность. в случае рекурсивной функции определить формально его сложнее, но оно все равно нужно. про многопоточную реентрабельность я вообще молчу.

MyTrooName ★★★★★
()
Ответ на: комментарий от anonymous

ух тыыы... в питон не завезли static из плюсов !

Всё завезли, родной.

class f:
  count = 0
  def __new__(cls):
    cls.count += 1
    return cls.count
    
print(f())
print(f())
print(f())
print(f())

Вывод:

1
2
3
4

Crocodoom ★★★★★
()
Ответ на: комментарий от vvn_black

Решение оказалось элементарным, скорее всего это частный случай у меня:

def recursion(position1, string1, position2, string2):
    if string2[:2] == "#$":
        new_string = string[2:] # получили подстроку без этих символов
    else: 
        for each symbol in  new_string and string1: # в цикле посимвольно
        # здесь обрабатываю разницу в символах и ставлю курсоры для рекурсивного чтения строки
         ....

        recursion(position1, string1, position2, [b]string2[/b])    
Отмечено жирным.

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от neschastnyjj86

1. static если он есть

2. параметр depth и инкрементировать
3. глобальная переменная

И нахера тогда рекурсия спрашивается??

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.