Есть ли причина для такого поведения объекта фильтра в Python? - PullRequest
0 голосов
/ 26 апреля 2020
>>> a = filter(lambda x: x&1, [1,2])
>>> list(a)
[2]
>>> list(a)
[]

Это довольно противоречиво, не так ли? Поэтому, если у кого-то есть объяснение, почему это так, не стесняйтесь!

Я использую Python 3.8.2, кстати

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Поскольку вы знали, как обернуть результат вызова в filter с помощью list(), я предполагаю, что вы знакомы с концепцией функций генератора и тому подобным. Функция filter на самом деле возвращает нечто похожее на функцию генератора в том смысле, что ее можно повторить только один раз. См. Ниже:

>>> a = filter(lambda x: x^1, [1,2])
>>> type(a)
<class 'filter'>
>>> it = iter(a)
>>> next(it)
2
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> it = iter(a) # try to iterate the filter a second time
>>> next(it) # you will get a StopIteration exception the very first time
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

Приведенный выше код по существу эквивалентен:

a = filter(lambda x: x^1, [1,2])
print(type(a))
for item in a:
    print(item)
for item in a:
    print(item)
0 голосов
/ 26 апреля 2020

a - это итерация, элементы которой были использованы при первом вызове list (a). Последующий список (a) ничего не получит.

Аналогично,

a = (i for i in range(10))
list(a)
[0, 1....10]
list(a)
[]

Я предпочитаю C# поведение, которое имеет различные интерфейсы IEnumerable и IEnumerator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...