variable tipos locales inside globales python variables filter variable-assignment

tipos - variable local python



¿Por qué foo=filter(...) devuelve un<objeto de filtro>, no una lista? (5)

Consulte esta implementación de ejemplo de filter para comprender cómo funciona en 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))

El siguiente es un ejemplo de cómo puede usar filter o generadores my_filter :

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

Esta pregunta ya tiene una respuesta aquí:

Trabajando en Python IDLE 3.5.0 shell. Desde mi entendimiento de la función incorporada de "filtro", devuelve una lista, tupla o cadena, dependiendo de lo que le pases. Entonces, ¿por qué la primera asignación a continuación funciona, pero no la segunda (las ''>>>'' son solo las indicaciones interactivas de Python)

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


De la documentación

Tenga en cuenta que el filter(function, iterable) es equivalente a [item for item in iterable if function(item)]

En python3, en lugar de devolver una lista; Filtro, mapa de retorno un iterable. Tu intento debería funcionar en python2 pero no en python3

Claramente, estás obteniendo un objeto de filtro, hazlo como una lista.

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


Eche un vistazo a la documentación de python para el filter(function, iterable) (desde here ):

Construya un iterador a partir de aquellos elementos de iterable para los cuales la función devuelve true.

Así que para obtener una lista de nuevo tienes que usar:

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

Pero probablemente esto no sea lo que quería, porque trata de llamar al resultado de los greetings() , que es "hola", en los valores de su lista de entrada, y esto no funcionará. Aquí también entra en juego el tipo de iterador, porque los resultados no se generan hasta que los usa (por ejemplo, llamando a la list() ). Entonces, al principio no recibirá un error, pero cuando intente hacer algo con ella, dejará de funcionar:

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

Si desea verificar qué elementos de su lista son iguales a "hola", tiene que usar algo como esto:

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

(Pongo su función en un lambda, vea la respuesta de Randy C para una función "normal")


El filtro espera obtener una función y algo sobre lo que pueda iterar. La función debe devolver Verdadero o Falso para cada elemento en el iterable. En su ejemplo particular, lo que está buscando hacer es algo como lo siguiente:

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

Tenga en cuenta que en Python 3, puede ser necesario usar la list(filter(greetings, ["hello", "goodbye"])) para obtener este mismo resultado.


La razón por la que devuelve < filter object > es que, el filtro es una clase en lugar de una función integrada.

help(filter) obtendrá lo siguiente: Ayuda en clase filtro en módulos incorporados:

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.