Como determino se um número inteiro está entre dois outros números inteiros (por exemplo, maior que / igual a 10000
e menor que / igual a 30000
)?
Estou usando o 2.3 IDLE e o que tentei até agora não está funcionando:
if number >= 10000 and number >= 30000:
print ("you have to pay 5% taxes")
Respostas:
fonte
if number in range(10000, 30001)
como sugerido por outra solução? Além disso, é mais rápido ou mais lento ao usar emset
vez derange
?number
primeiro é comparada a10000
. Se for menor do que10000
a expressão será imediatamente colocada em curto-circuito e a segunda comparação não será verificada. A complexidade éO(1)
.in range(0, n)
em vez disso, gera toda a sequência de números e depois itera. A complexidade éO(n)
. A complexidade dain set(range(0, n))
ainda éO(n)
porque a construção de um conjunto tem uma complexidade de tempo 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))'
fonte
range
(ouxrange
em python2) retorna um gerador, assim você não pode testar repetidamente nele.4 in range(1,4)
é falso. Então é melhor usar o1 >= r <= 4
1.5 in r
dáFalse
, mesmo em 3.4. Essa resposta é boa apenas para números inteiros.1 <= r <= 4
if a <= x <= b
...) (2.) não funciona parafloat
tipos (3 .) o teste de gama não é incluído ... tantos desenvolvedores podem introduzir erros porque esperam gama inclusivaO seu operador está incorreto. Deveria ser
if number >= 10000 and number <= 30000:
. Além disso, o Python possui uma abreviação para esse tipo de coisaif 10000 <= number <= 30000:
,.fonte
Seu snippet de código,
na verdade, verifica se o número é maior que 10000 e 30000.
Supondo que você deseja verificar se o número está no intervalo de 10000 a 30000, você pode usar a comparação de intervalo do Python:
Esse recurso do Python é descrito mais detalhadamente na documentação do Python .
fonte
fonte
O problema das comparações é que elas podem ser difíceis de depurar quando você coloca um local
>=
onde deve haver um<=
Python permite que você escreva o que você quer dizer com palavras
No Python3, você precisa usar em
range
vez dexrange
.editar: As pessoas parecem estar mais preocupadas com as marcas de microbench e com as operações legais de encadeamento. Minha resposta é sobre programação defensiva (menos superfície de ataque para bugs).
Como resultado de uma reivindicação nos comentários, adicionei aqui o micro benchmark para o Python3.5.2
Se você está preocupado com o desempenho, pode calcular o intervalo uma vez
fonte
range(10000, 30001)
em Python3. Ele não cria uma listaxrange
no Python2 ourange
no Python3 tem testes de associação. Tente você mesmo se não acredita.<=
é apenas mais eficiente porque não cria um objeto de intervalo. Nos dois sentidos como O (1). O ponto é que o OP estava tentando fazer do seu jeito e acabou com um bug . Código rápido errado está pior.Defina o intervalo entre os números:
Então use-o:
fonte
range
não conta o último valor 10 no seu caso.range(1,11)
está correto, se você precisar comparar entre 1 e 10Há duas maneiras de comparar três números inteiros e verificar se b está entre a e c :
e
O primeiro parece mais legível, mas o segundo corre mais rápido .
Vamos comparar usando dis.dis :
e usando timeit :
Além disso, você pode usar o alcance , conforme sugerido anteriormente, porém é muito mais lento.
fonte
Suponha que há 3 inteiros não negativos:
a
,b
, ec
. Matematicamente falando, se queremos determinar sec
está entrea
eb
, inclusive, pode-se usar esta fórmula:ou em Python:
fonte
Você deseja que a saída imprima a instrução fornecida se e somente se o número estiver entre 10.000 e 30.000.
Código deve ser;
fonte
A condição deve ser,
A razão para usar
number == 10000
é que, se o valor do número for 50000 e se usarmos,number >= 10000
a condição será aprovada, e não é isso que você deseja.fonte