Per quanto ne so, in C & C++, la sequenza di priorità per NOT AND & OR NON è> AND> OR. Ma questo non sembra funzionare in modo simile in Python. Ho provato a cercarlo nella documentazione di Python e ho fallito (suppongo di essere un po 'impaziente). Qualcuno può chiarirlo?Priorità delle istruzioni logiche NOT AND & OR in python
risposta
not
si lega più stretto di and
che lega più stretto di or
come indicato nel language reference
non lo è, AND, OR, dal più alto al più basso in base alla documentazione https://docs.python.org/3/reference/expressions.html#operator-precedence
Ecco la tabella delle precedenze completa , la precedenza più bassa al più alto. Una riga ha la stessa priorità e catene da sinistra verso destra
- lambda
- se - altro
- o
- e
- non x
- in, non in, è, non è , <, < =,>,> =,! =, ==
- |
- ^
- &
- < <, >>
- +, -
- *, /, //,%
- + x, -x, ~ x
- **
- x [indice], x [indice: indice], x (argomenti ...), x.attributo
- (espressioni ...), [espressioni ...], {chiave: valore ...} , {espressioni. ..}
EDIT: Had la precedenza sbagliato
Questo è l'ordine relativo, sì, ma quale ha maggiore precedenza? –
Whoops, ha confuso me stesso. Grazie! –
Si noti che '**' ha alcune eccezioni annotate in una nota a piè di pagina quando si tratta della precedenza sugli operatori aritmetici. –
Degli operatori booleani la precedenza, da debole a forte, è la seguente:
or
and
not x
is not
;not in
Dove gli operatori hanno la stessa precedenza, la valutazione procede da sinistra verso destra.
Mi spiace che il tuo # 2 sia tecnicamente corretto ma ancora molto fuorviante. Prima di tutto, il documento non sembra cambiare. In secondo luogo, la tua opinione n. 2 (suggerendo che 'and' &' &' not x' viene valutata da sinistra a destra) è tecnicamente equivalente all'effetto ufficiale, ma questo è semplicemente perché quando in "cond1 e non cont2", python deve calcolare cont2 prima di default. – RayLuo
Grazie a @RayLuo, ma non era nemmeno _technically_ correct. Stavo posizionando il significato nelle righe visualizzate in modo errato che dividevano le righe in quella tabella. Guardando il documento 2.7 _today_ 'or' e' and' sembrano essere nella stessa cella usando _Firefox_ ma non _Opera_. La differenza di precedenza tra 'or' e' and' è ovvia (ad esempio '1 o 0 e 0' vs' (1 o 0) e 0') che tra 'and' e' not x' non tanto per il motivo per cui lo dai. Riparerò la mia risposta in modo che rifletta ciò che la documentazione dice _actually_. –
Non c'è nessuna buona ragione per Python di avere altra sequenza priorità di quegli operatori che ben consolidata una in (quasi) tutti gli altri linguaggi di programmazione, tra cui C/C++.
Si possono trovare in Il Python di riferimento di, parte 6.16 - Precedenza degli operatori, scaricabile (per la versione attuale e ricco di tutta la documentazione standard) da https://docs.python.org/3/download.html, o leggere online qui: 6.16. Operator precedence.
Ma c'è ancora qualcosa in Python che può trarre in inganno: Il risultato di and
e or
operatori può essere diverso da True
o False
- vedono 6.11 Boolean operations nello stesso documento.
È possibile eseguire il test seguente per determinare la precedenza di and
e or
.
primo luogo, cercare 0 and 0 or 1
nella console python
Se or
si lega prima, poi ci si aspetterebbe 0
come output.
Nella mia console, 1
è l'output. Significa and
o si associa prima o uguale a or
(forse le espressioni vengono valutate da sinistra a destra).
Quindi provare 1 or 0 and 0
.
Se or
e and
si legano allo stesso modo con l'ordine di valutazione integrato da sinistra a destra, è necessario ottenere 0
come output.
Nella mia console, 1
è l'output. Quindi possiamo concludere che and
ha priorità più alta di or
.
Puoi fare un esempio in cui la precedenza dell'operatore non funziona come pensi che faccia? – dodgethesteamroller