Уведомления

Группа в Telegram: @pythonsu

#1 Июль 30, 2011 19:56:07

vkopey
От:
Зарегистрирован: 2010-09-26
Сообщения: 116
Репутация: +  3  -
Профиль   Отправить e-mail  

Помогите улучшить код с рекурсией

Эта функция возвращает элемент документа XML по заданному индексу. Например, корневой элемент имеет индекс 0, первый его подэлемент - 1 и т.д. Чувствую, что немножко наговнокодил. Можно ли обойтись без глобальных переменных, без переменных res и result, и без вложенной функции?

def getElByIndex (self, node, index):
'''Возвращает элемент по индексу'''
global i, res
i = 0 # начальный индекс
res = None # найденный элемент
def f (node, index): # рекурсивная функция
global i, res
if node.nodeType == Node.ELEMENT_NODE: # если это элемент
if i == index: # если индекс равен заданному
res = node # запомнить результат
i + = 1 # увеличить индекс
if node.hasChildNodes: # если узел имеет дочерние
for child in node.childNodes: # для всех дочерних
f (child, index)
f (node, index)
result = res
del i, res
return result



Офлайн

#2 Июль 30, 2011 22:17:26

atomAltera
От:
Зарегистрирован: 2011-07-27
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите улучшить код с рекурсией

Вместо global можно nonlocal использовать, ещё можно, как я понял вместо последнего if elif использовать, ну и зачем res и result когда одним можно обойтись?

def getElByIndex (self, node, index):
'''Возвращает элемент по индексу'''
i = 0 # начальный индекс
result = None # найденный элемент
def f (node, index): # рекурсивная функция
nonlocal i, result
if node.nodeType == Node.ELEMENT_NODE: # если это элемент
if i == index: # если индекс равен заданному
result = node # запомнить результат
i + = 1 # увеличить индекс
elif node.hasChildNodes: # если узел имеет дочерние
for child in node.childNodes: # для всех дочерних
f (child, index)
f (node, index)
return result
Возможности проверить не было, так что извеняйте если что

p.s. Удалять локальные переменные тоже не надо: сами удалятся



Отредактировано (Июль 30, 2011 22:18:32)

Офлайн

#3 Июль 30, 2011 23:54:22

vkopey
От:
Зарегистрирован: 2010-09-26
Сообщения: 116
Репутация: +  3  -
Профиль   Отправить e-mail  

Помогите улучшить код с рекурсией

nonlocal - это для Python 3, а во втором кажись нету такого.
Но спасибо и за это!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version