Кто-нибудь знает, почему этот код не работает нормально? Кажется, не нравится итерации с ключевым словом yield: Я пытаюсь разминировать все цифры с любого уровня списков или диктонов (особенно заинтересованных в списках). На второй итерации он находит [2,3], но не печатает 2 и 3 один за другим... Представьте себе, что у меня может быть много уровней списков.
def digIn( x ):
try:
if isDict(x) or isList(x):
print "X:", x
for each in x:
print "each:", each
if isDict(each) or isList(each):
digIn(each)
else:
yield each
else:
yield x
except Exception,ex:
print ex
print "STARTING OVER"
for i in digIn( [1,[2,3]] ):
print i
Когда вы рекурсивно вызываете digIn
, внутренние выходы не вызывают значения, получаемые от внешнего вызова. Вместо этого рекурсивный digIn
возвращает генератор, а затем вы молча отбрасываете этот генератор и теряете внутренние элементы.
Вам нужно явно получить результаты от рекурсивного вызова.
if isDict(each) or isList(each):
for innerItem in digIn(each):
yield innerItem
else:
yield each
digIn(each)
неверно. Вы должны перебрать его и получить каждое значение по очереди.
Вы должны "повторно выполнить" генератор для рекурсивного повторения всех элементов списка.
if isDict(each) or isList(each):
for elem in digIn(each):
yield elem
else:
yield each