Simplifique a comparação encadeada


254

Eu tenho um valor inteiro x, e eu preciso verificar se ele está entre um starte endvalores, então eu escrevo as seguintes declarações:

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

Essa declaração é sublinhada e a dica de ferramenta diz que devo

simplifique a comparação encadeada

Tanto quanto posso dizer, essa comparação é tão simples quanto possível. O que eu perdi aqui?


1
Se você receber uma sugestão da dica de ferramenta, você pode passar o mouse sobre a área e ela fornece uma pequena lâmpada. Você pode clicar nele e inserir automaticamente a alteração sugerida. Assim, você pode ver o que pensa que deveria estar fazendo (e pode desfazer se não gostar).
Edward Ned Harvey

Respostas:


432

No Python, você pode "encadear" operações de comparação, o que significa que elas são "e" editadas juntas. No seu caso, seria assim:

if start <= x <= end:

Referência: https://docs.python.org/3/reference/expressions.html#comparisons


2
Obrigado, eu não sabia que você poderia fazer isso em Python. Estava realmente coçando minha cabeça neste.
Brynn McCullagh

18
Cara, é assim que as coisas devem ser. Mas, vindo de outras línguas, você esquece seus ideais e nem pensa que as coisas poderiam ser do jeito que deveriam ser. Mas é por isso que python é incrível, exatamente por causa de tais coisas :)
Hakaishin

Você conhece alguma fonte "oficial" que recomende o estilo encadeado em detrimento do outro? Qual é o Python mais "idiomático"?
Raio

Não sei, às vezes eu gostaria que o python virasse mais grades de proteção. x y == == z falha com um ValueError quando x, y, z são pandas série
BallpointBen

@ BallpointBen: muitas coisas não funcionam da maneira que você pode esperar no Pandas, nem mesmo x == y and y == z.
John Zwinck

12

Pode ser reescrito como:

start <= x <= end:

Ou:

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

5
O intervalo é uma péssima escolha, pois, para um início e um final grandes, você está criando uma lista desnecessária.
Burhan Khalid 22/10

1
@BurhanKhalid De fato, mas acho que vale a pena mencionar para o OP.
Maroun 22/10

7
No python3, os identificadores de intervalo " contêm " muito bem, portanto, nenhuma lista é gerada.
JoshNahum 3/06

2
@MarounMaroun desde python 3, comporta-se de função gama como o ex-xrange, é também vale a pena mencionar
dvdvck

5
Para obter detalhes sobre o uso de if x in range(...), consulte " Por que" 1000000000000000 no intervalo (1000000000000001) "é tão rápido no Python 3? ".
Kevin J. perseguição

-4

Simplificação do código

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

9
Como isso é diferente desta resposta?
GWigWam
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.