Comment puis-je déterminer si un entier donné se situe entre deux autres entiers (par exemple supérieur ou égal à 10000
et inférieur ou égal à 30000
)?
J'utilise 2.3 IDLE et ce que j'ai essayé jusqu'à présent ne fonctionne pas:
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
Réponses:
la source
if number in range(10000, 30001)
comme suggéré par une autre solution? De plus, est-il plus rapide ou plus lent lors de l'utilisationset
au lieu derange
?number
est d'abord comparé10000
. S'il est inférieur,10000
l'expression est immédiatement court-circuitée et la deuxième comparaison n'est pas vérifiée. La complexité estO(1)
.in range(0, n)
génère à la place la séquence entière de nombres puis l'itère. La complexité estO(n)
. La complexité dein set(range(0, n))
est toujoursO(n)
parce que la construction d'un ensemble a une complexité temporelle deO(n)
ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt> python -m timeit '10000 <= 10 <= 30000'
> python -m timeit '10 in range(10000, 30001)'
> python -m timeit '10 in set(range(10000, 30001))'
la source
range
(ouxrange
en python2) renvoyer un générateur, vous ne pouvez donc pas le tester à plusieurs reprises.4 in range(1,4)
c'est faux. Il vaut donc mieux utiliser le1 >= r <= 4
car il évite les erreurs possibles des nouveaux arrivants1.5 in r
donneFalse
, même en 3.4. Cette réponse n'est valable que pour les entiers.1 <= r <= 4
if a <= x <= b
...) (2.) ne fonctionne pas pour lesfloat
types (3 .) le test de plage n'est pas inclusif ... donc de nombreux développeurs peuvent introduire des bogues car ils s'attendent à une plage inclusiveVotre opérateur est incorrect. Devrait l'être
if number >= 10000 and number <= 30000:
. De plus, Python a un raccourci pour ce genre de chose,if 10000 <= number <= 30000:
.la source
Votre extrait de code,
vérifie en fait si le nombre est supérieur à 10000 et 30000.
En supposant que vous vouliez vérifier que le nombre est compris entre 10000 et 30000, vous pouvez utiliser la comparaison d'intervalle Python:
Cette fonctionnalité Python est décrite plus en détail dans la documentation Python .
la source
la source
Le problème avec les comparaisons est qu'elles peuvent être difficiles à déboguer lorsque vous mettez un
>=
où il devrait y avoir un<=
Python vous permet d' écrire simplement ce que vous voulez dire en mots
En Python3, vous devez utiliser à la
range
place dexrange
.edit: Les gens semblent être plus préoccupés par les repères microbench et la façon dont les opérations de chaînage sont cool. Ma réponse concerne la programmation défensive (moins de surface d'attaque pour les bugs).
À la suite d'une réclamation dans les commentaires, j'ai ajouté le micro benchmark ici pour Python3.5.2
Si vous êtes préoccupé par les performances, vous pouvez calculer la plage une fois
la source
range(10000, 30001)
en Python3. Il ne crée pas de listexrange
en Python2, ourange
en Python3 ont des tests d'appartenance. Essayez-le vous-même si vous n'y croyez pas.<=
est seulement plus efficace car il ne crée pas d'objet range. Dans les deux sens comme O (1). Le point est l'OP a essayé de le faire votre chemin et a fini avec un bug . Un code rapide erroné est pire.Définissez la plage entre les nombres:
Ensuite, utilisez-le:
la source
range
ne compte pas la dernière valeur 10 dans votre cas.range(1,11)
est correct, si vous devez comparer entre 1 et 10Il existe deux façons de comparer trois entiers et de vérifier si b est compris entre a et c :
et
Le premier semble plus lisible, mais le second s'exécute plus rapidement .
Comparons en utilisant dis.dis :
et en utilisant timeit :
vous pouvez également utiliser la plage , comme suggéré précédemment, mais elle est beaucoup plus lente.
la source
Supposons qu'il y ait 3 entiers non négatifs:
a
,b
, etc
. Mathématiquement parlant, si nous voulons déterminer s'ilc
y a entrea
etb
, inclusivement, on peut utiliser cette formule:ou en Python:
la source
Vous souhaitez que la sortie imprime l'instruction donnée si et seulement si le nombre se situe entre 10 000 et 30 000.
Le code devrait être;
la source
La condition devrait être,
la raison de l'utilisation
number == 10000
est que si la valeur du nombre est 50000 et si nous utilisonsnumber >= 10000
la condition passera, ce qui n'est pas ce que vous voulez.la source