variable valores usar operaciones logicas funcion exclusivo español ejemplos ejemplo como booleanos bool python function design internal

python - usar - valores booleanos y operaciones logicas



¿Por qué Python `any` devuelve un bool en lugar del valor? (6)

El comportamiento de yy existe por razones históricas.

Antes de que Python tuviera una operación ternaria / expresión condicional, usabas yy or si querías usar un valor en una condición. Cualquier expresión de este tipo se puede reescribir con la sintaxis de expresión condicional:

true_val if condition else false_val

Básicamente, están sobrecargados con dos funciones y, por razones de compatibilidad, no se han modificado.

Esa no es una razón para sobrecargar otras operaciones. parece que debería decirle si una condición es verdadera para un elemento , que es un booleano, por lo que debería devolver un bool .

and or devuelven el último elemento que evaluaron, pero ¿por qué la función incorporada de Python no funciona?

Quiero decir que es bastante fácil implementarse así, pero aún me pregunto por qué.

def any(l): for x in l: if x: return x return x

editar:

Para agregar a las respuestas a continuación, aquí hay una cita real de esa misma lista de correo del poderoso emperador sobre el tema:

Ya sea para regresar siempre verdadero y falso o el primer elemento faling / passing? Jugué con eso también antes de bloguear, y me di cuenta de que el caso final (si la secuencia está vacía o si todos los elementos no pasan la prueba) nunca se puede hacer funcionar satisfactoriamente: elegir Ninguno se siente raro si el argumento es un iterable de bools, y elegir False se siente raro si el argumento es un iterable de objetos no bool.

Guido van Rossum (página de inicio: http://www.python.org/~guido/ )


Este mismo problema surgió en la lista de correo del desarrollador de Python en 2005, cuando Guido Van Rossum propuso agregar any y all a Python 2.5.

Bill Janssen requested que se implementaran como

def any(S): for x in S: if x: return x return S[-1] def all(S): for x in S: if not x: return x return S[-1]

Raymond Hettinger, quien implementó all , responded específicamente por qué any y all any all no actúan como y or :

Con el tiempo, recibí comentarios sobre estas y otras recetas de itertools. Nadie ha objetado los valores de retorno verdadero / falso en esas recetas o en la versión de Guido.

La versión de Guido coincide con la expectativa normal de que alguno / todos sea un predicado. Además, evita el tipo de errores / confusión que las personas experimentan actualmente con la implementación única de "y" y "o" de Python.

Devolver el último elemento no es malo; es simplemente extraño, inesperado y no obvio. Resiste el impulso de ponerte complicado con este.

La lista de correo estuvo en gran medida de acuerdo, dejando la implementación tal como la ve hoy.


Hice esta misma pregunta sobre python-ideas , y me dijeron que la razón era que any() y all() necesitan devolver un valor cuando la secuencia está vacía, y esos valores deben ser False y True . Esto me parece un argumento débil.

Las funciones no pueden cambiar ahora, pero creo que serían más útiles y mejores análogos de los operadores and y or que generalizan si devolvieran el primer valor verdadero o falso que encontraran.


No es inmediatamente obvio que el valor de cualquiera sea False o uno de los valores en la entrada. Además, la mayoría de los usos se verían como

tmp = any(iterable) if tmp: tmp.doSomething() else: raise ValueError(''Did not find anything'')

Eso es mirar antes de saltar y, por lo tanto, no epipónico. Comparar con:

next(i for i in iterable if i).doSomething() # raises StopIteration if no value is true

El comportamiento de or fue históricamente útil como un complemento para la expresión condicional no disponible en ese momento.


Any devuelve un booleano porque trata de manera efectiva su argumento como una lista de bools antes de considerar si alguno de ellos es verdadero. Devuelve el elemento que evalúa, pero resulta ser un bool.

¿Cuándo querrías usar tu versión de any ? Si está en una lista de bools, entonces ya tienes la respuesta correcta. De lo contrario, solo está protegiendo contra None y podría expresarse como:

filter(lambda x: x != None, l)[0]

o:

[x for x in l if x != None][0]

Que es una declaración de intenciones más clara.


and y or pueden definirse con sensatez de forma que siempre devuelvan uno de sus operandos. Sin embargo, any y all any all no pueden ser definidos con sensatez para devolver un valor de su secuencia de entrada: específicamente no pueden hacerlo cuando la lista está vacía. Ambos, any y all , tienen actualmente un resultado bien definido en esta situación: any devolución es Falsa y all regresa Verdadero. Se vería obligado a devolver a veces un valor booleano y, a veces devolver un elemento de la secuencia, lo que lo convierte en una interfaz desagradable y sorprendente. Mucho mejor para ser simple y consistente.