Сущность filtered
по сути является объектом с состоянием.Конечно, сейчас очевидно, что запуск max
или min
на нем изменит это состояние.Чтобы перестать спотыкаться об этом, я хотел бы прояснить (на самом деле для себя), что я создаю что-то, а не просто преобразую что-то:
Добавление дополнительного шага действительно может помочь:
def filtered(container):
return filter(lambda x : x is not None and x != 0, container)
ratio = max(filtered(c)) / min(filtered(c))
Если вы поместите filtered(...)
в какую-то функцию (может быть, она не нужна для чего-то еще) или определите ее как функцию уровня модуля, то вам решать,но в этом случае я бы предположил, что если filtered
(итератор) нужен только для функции, оставьте его там, пока он не понадобится где-то еще.
Другая вещь, которую вы можете сделать, - это создать list
от него, который оценит итератор:
filtered_iter = filter(lambda x : x is not None and x != 0, container)
filtered = list(filtered_iter)
ratio = max(filtered) / min(filtered)
(Конечно, вы можете просто сказать filtered = list(filter(...))
.)