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.