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í:
- Filtros en Python3 [duplicado] 2 respuestas
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.