Simplifiez la comparaison chaînée


255

J'ai une valeur entière xet je dois vérifier si elle se situe entre les valeurs a startet end, j'écris donc les instructions suivantes:

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

Cette déclaration est soulignée et l'info-bulle me dit que je dois

simplifier la comparaison chaînée

Pour autant que je sache, cette comparaison est aussi simple que possible. Qu'est-ce que j'ai raté ici?


1
Si vous obtenez une suggestion de l'infobulle, vous pouvez survoler la zone et cela vous donne une petite ampoule. Vous pouvez cliquer dessus et insérer automatiquement la modification suggérée. Ainsi, vous pouvez voir ce qu'il pense que vous devriez faire (et vous pouvez annuler si vous ne l'aimez pas).
Edward Ned Harvey

Réponses:


433

En Python, vous pouvez "chaîner" les opérations de comparaison, ce qui signifie simplement qu'elles sont "et" éditées ensemble. Dans votre cas, ce serait comme ça:

if start <= x <= end:

Référence: https://docs.python.org/3/reference/expressions.html#comparisons


2
Merci, je ne savais pas que vous pouviez faire ça en Python. Je me grattais vraiment la tête sur celui-ci.
Brynn McCullagh

18
C'est ainsi que les choses devraient être. Mais venant d'autres langues, vous oubliez vos idéaux et ne pensez même pas que les choses pourraient être comme elles devraient être. Mais c'est pourquoi le python est incroyable, exactement à cause de telles choses :)
Hakaishin

Connaissez-vous des sources "officielles" qui recommandent le style enchaîné par rapport à l'autre? Lequel est le Python le plus "idiomatique"?
Ray

Je ne sais pas, parfois je souhaite que le python lève plus de garde-corps. x == y == z échoue avec une ValueError lorsque x, y, z sont des séries Pandas
BallpointBen

@BallpointBen: beaucoup de choses ne fonctionnent pas comme vous pourriez vous y attendre dans Pandas, même pas x == y and y == z.
John Zwinck

12

Il peut être réécrit comme:

start <= x <= end:

Ou:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....

5
La plage est un mauvais choix car pour un début et une fin importants, vous créez une liste inutile.
Burhan Khalid

1
@BurhanKhalid En effet, mais je suppose que cela vaut la peine d'être mentionné pour OP.
Maroun

7
En python3, la plage gère " contient " bien, donc aucune liste n'est générée.
JoshNahum

2
@MarounMaroun depuis python 3, la fonction range se comporte comme l'ancien xrange, il convient également de le mentionner
dvdvck

5
Pour plus de détails sur l'utilisation de if x in range(...), voir « Pourquoi« 1000000000000000 dans la plage (1000000000000001) »est-il si rapide dans Python 3? ».
Kevin J. Chase

-4

Simplification du code

if start <= x <= end: # start x is between start and end 
# do stuff

9
En quoi est-ce différent de cette réponse?
GWigWam
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.