Simplifique la comparación encadenada

254

Tengo un valor entero x, y tengo que comprobar si está entre una starty endvalores, así que escribir las siguientes afirmaciones:

if x >= start and x <= end:
    # do stuff

Esta declaración se subraya, y la información sobre herramientas me dice que debo

simplificar la comparación encadenada

Por lo que puedo decir, esa comparación es tan simple como parece. ¿Qué me he perdido aquí?

Brynn McCullagh
fuente
1
Si recibe una sugerencia de la información sobre herramientas, puede pasar el mouse sobre el área y le dará una pequeña bombilla. Puede hacer clic en él y hacer que inserte automáticamente el cambio que sugiere. Para que pueda ver lo que cree que debería estar haciendo (y puede deshacer si no le gusta).
Edward Ned Harvey

Respuestas:

432

En Python puedes "encadenar" las operaciones de comparación, lo que significa que están "y" juntas. En su caso, sería así:

if start <= x <= end:

Referencia: https://docs.python.org/3/reference/expressions.html#comparisons

John Zwinck
fuente
2
Gracias, no sabía que podías hacer eso en Python. Realmente me estaba rascando la cabeza en este caso.
Brynn McCullagh
18
Hombre, así es como deberían ser las cosas. Pero viniendo de otros idiomas, olvidas tus ideales y ni siquiera piensas, que las cosas podrían ser como deberían ser. Pero es por eso que Python es increíble, exactamente por esas cosas :)
Hakaishin
¿Conoces alguna fuente "oficial" que recomiende el estilo encadenado sobre el otro? ¿Cuál es más Python "idiomático"?
Ray
No sé, a veces desearía que Python arrojara más barandas. x == y == z falla con un ValueError cuando x, y, z son series Pandas
BallpointBen
@BallpointBen: muchas cosas no funcionan como cabría esperar en Pandas, ni siquiera x == y and y == z.
John Zwinck
12

Se puede reescribir como:

start <= x <= end:

O:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....
Maroun
fuente
55
El rango es una mala elección porque para un inicio y fin grandes está creando una lista innecesaria.
Burhan Khalid
1
@BurhanKhalid De hecho, pero creo que vale la pena mencionarlo para OP.
Maroun
77
En python3, el rango maneja " contiene " muy bien, por lo que no se genera ninguna lista.
JoshNahum
2
@MarounMaroun desde python 3, la función de rango se comporta como el anterior xrange, también vale la pena mencionarlo
dvdvck
55
Para obtener detalles sobre el uso de if x in range(...), consulte " ¿Por qué" 1000000000000000 en el rango (1000000000000001) "es tan rápido en Python 3? ".
Kevin J. Chase
-4

Simplificación del código.

if start <= x <= end: # start x is between start and end 
# do stuff
Thomson Lukose
fuente
99
¿Cómo es esto diferente de esta respuesta?
GWigWam