Понимания списка Python хороши, но почти невозможны отладить. У Вас парни есть какие-либо хорошие советы / инструменты для отладки их?
Если это достаточно сложно, чтобы это не было очевидно на первый взгляд, распакуйте его на несколько шагов и / или циклов for. Это явно слишком сложно, и сделать его более явным - самый простой способ отладить его. Дополнительный бонус: теперь вы можете перейти к отладчику или добавить операторы печати!
совет: используйте составление списков для простых задач (1 или 2 уровня). В противном случае для удобства чтения лучше сделать его явным.
Используйте отладчик, например pdb
, чтобы просмотреть или разбить понимание списка на полный цикл for.
В Haskell я использую нечто похожее на:
def trcPV(prompt, value):
print ("%s%s" % (prompt, str(value)))
return value
xs = trcPV("xs=", [x for x in range(0,100) if trcPV("check=",(trcPV("x=",x) % 15) in [0,3,5])])
Понимание списка Haskell по крайней мере может быть (и это что делают компиляторы), переписанный в терминах map, concat и filter.
Итак, этот пример на Haskell:
[ x*x | x<-[1..25], even x]
Работает как:
map (\x-> x*x) (filter (even) [1..25])
Я ожидаю, что аналогичные идентичности сохранятся и для Python, поэтому аналогичная декомпозиция должна дать эквивалентный код и на Python. Эквивалентный код будет легче отлаживать (и работать так же эффективно).