Почему foo = filter (…) возвращает <объект фильтра>, а не список?

Работа в оболочке Python IDLE 3.5.0. Из моего понимания встроенной функции «фильтр» она возвращает список, кортеж или строку, в зависимости от того, что вы передаете в нее. Итак, почему первое назначение ниже работает, но не второе («>>>» – это просто интерактивные подсказки Python)

>>> def greetings(): return "hello" >>> hesaid = greetings() >>> print(hesaid) hello >>> >>> shesaid = filter(greetings(), ["hello", "goodbye"]) >>> print(shesaid) <filter object at 0x02B8E410> 

5 Solutions collect form web for “Почему foo = filter (…) возвращает <объект фильтра>, а не список?”

Посмотрите документацию на python для filter(function, iterable) ( отсюда ):

Построить итератор из тех элементов итерации, для которых функция возвращает true.

Итак, получите список, который вы должны использовать:

 shesaid = list(filter(greetings(), ["hello", "goodbye"])) 

Но это, вероятно, не то, что вы хотели, потому что он пытается вызвать результат greetings() , который является «привет», на значения вашего входного списка, и это не сработает. Здесь также вводится итератор, потому что результаты не генерируются до тех пор, пока вы их не используете (например, путем вызова list() на нем). Поэтому сначала вы не получите ошибку, но когда вы попытаетесь что-то сделать с shesaid она перестанет работать:

 >>> print(list(shesaid)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object is not callable 

Если вы хотите проверить, какие элементы в вашем списке равны «привет», вы должны использовать что-то вроде этого:

 shesaid = list(filter(lambda x: x == "hello", ["hello", "goodbye"])) 

(Я помещаю вашу функцию в лямбду, см. Ответ Рэнди С для «нормальной» функции)

фильтр ожидает получить функцию и что-то, что она может перебрать. Функция должна возвращать True или False для каждого элемента в iterable. В вашем конкретном примере то, что вы хотите сделать, выглядит следующим образом:

 In [47]: def greetings(x): ....: return x == "hello" ....: In [48]: filter(greetings, ["hello", "goodbye"]) Out[48]: ['hello'] 

Обратите внимание, что в Python 3 может потребоваться использовать list(filter(greetings, ["hello", "goodbye"])) чтобы получить тот же результат.

Из документации

Обратите внимание, что filter(function, iterable) эквивалентен [item for item in iterable if function(item)]

В python3 вместо возврата списка; filter, map return iterable. Ваша попытка должна работать на python2, но не в python3

Ясно, что вы получаете объект фильтра, делаете его списком.

 shesaid = list(filter(greetings(), ["hello", "goodbye"])) 

Пожалуйста, ознакомьтесь с этой примерной реализацией filter чтобы понять, как он работает в Python 3:

 def my_filter(function, iterable): """my_filter(function or None, iterable) --> filter object Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true.""" if function is None: return (item for item in iterable if item) return (item for item in iterable if function(item)) 

Ниже приведен пример того, как вы можете использовать генераторы filter или my_filter :

 >>> greetings = {'hello'} >>> spoken = my_filter(greetings.__contains__, ('hello', 'goodbye')) >>> print('\n'.join(spoken)) hello 

причина, по которой он возвращает < filter object > заключается в том, что фильтр является классом вместо встроенной функции.

help(filter) вы получите следующее: Справка по фильтрации классов в встроенных модулях:

 class filter(object) | filter(function or None, iterable) --> filter object | | Return an iterator yielding those items of iterable for which function(item) | is true. If function is None, return the items that are true. | | Methods defined here: | | __getattribute__(self, name, /) | Return getattr(self, name). | | __iter__(self, /) | Implement iter(self). | | __new__(*args, **kwargs) from builtins.type | Create and return a new object. See help(type) for accurate signature. | | __next__(self, /) | Implement next(self). | | __reduce__(...) | Return state information for pickling. 
  • Как создать переменные путем итерации с помощью комбинации целых чисел и строк?
  • Переменные python являются указателями?
  • В Python подсчитайте количество переменных в классе или не добавьте новые переменные класса
  • Как создать словарь на основе значения переменной в Python
  • Свободные переменные Python. Почему это не удается?
  • Как вы можете напечатать имя переменной в python?
  • Как использовать существующие переменные и их значения в качестве параметров для функции (Python)?
  • Использование Python глобальной версии vs, определяющей модуль
  • Python - лучший язык программирования в мире.