Semplifica il confronto incatenato


254

Ho un valore intero xe devo verificare se è compreso tra a starte endvalori, quindi scrivo le seguenti dichiarazioni:

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

Questa affermazione viene sottolineata e il suggerimento mi dice che devo farlo

semplifica il confronto incatenato

Per quanto ne so, quel confronto è semplice quanto arrivano. Cosa mi sono perso qui?


1
Se ricevi un suggerimento dalla descrizione comandi, puoi passare il mouse sopra l'area e ti darà una piccola lampadina. Puoi fare clic su di esso e inserire automaticamente la modifica che sta suggerendo. Quindi puoi vedere cosa pensa che dovresti fare (e puoi annullare se non ti piace).
Edward Ned Harvey,

Risposte:


432

In Python puoi "concatenare" le operazioni di confronto, il che significa semplicemente che sono "e" messe insieme. Nel tuo caso, sarebbe così:

if start <= x <= end:

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


2
Grazie, non sapevo che avresti potuto farlo in Python. Stavo davvero grattando la testa su questo.
Brynn McCullagh,

18
Amico, ecco come dovrebbero essere le cose. Ma venendo da altre lingue dimentichi i tuoi ideali e non pensi nemmeno che le cose potrebbero essere come dovrebbero essere. Ma questo è il motivo per cui Python è fantastico, proprio per queste cose :)
Hakaishin,

Conosci qualche fonte "ufficiale" che raccomanda lo stile incatenato rispetto all'altro? Qual è il Python più "idiomatico"?
Ray,

Non so, a volte vorrei che Python sollevasse più guardrail. x == y == z non riesce con un ValueError quando x, y, z sono serie Pandas
BallpointBen

@BallpointBen: molte cose non funzionano come ci si potrebbe aspettare in Panda, nemmeno x == y and y == z.
John Zwinck,

12

Può essere riscritto come:

start <= x <= end:

O:

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

5
L'intervallo è una scelta sbagliata perché per l'inizio e la fine di grandi dimensioni si sta creando un elenco non necessario.
Burhan Khalid,

1
@BurhanKhalid In effetti, ma credo che valga la pena menzionare per OP.
Maroun,

7
In python3, gli handle di intervallo " contengono " bene, quindi non viene generato alcun elenco.
JoshNahum,

2
@MarounMaroun da Python 3, la funzione range si comporta come l'ex xrange, vale anche la pena menzionarlo
dvdvck


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.