2013-05-21 10 views
34

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

+1

Puoi fare un esempio in cui la precedenza dell'operatore non funziona come pensi che faccia? – dodgethesteamroller

risposta

42

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

  1. lambda
  2. se - altro
  3. o
  4. e
  5. non x
  6. in, non in, è, non è , <, < =,>,> =,! =, ==
  7. |
  8. ^
  9. &
  10. < <, >>
  11. +, -
  12. *, /, //,%
  13. + x, -x, ~ x
  14. **
  15. x [indice], x [indice: indice], x (argomenti ...), x.attributo
  16. (espressioni ...), [espressioni ...], {chiave: valore ...} , {espressioni. ..}

EDIT: Had la precedenza sbagliato

+0

Questo è l'ordine relativo, sì, ma quale ha maggiore precedenza? –

+0

Whoops, ha confuso me stesso. Grazie! –

+0

Si noti che '**' ha alcune eccezioni annotate in una nota a piè di pagina quando si tratta della precedenza sugli operatori aritmetici. –

3

Degli operatori booleani la precedenza, da debole a forte, è la seguente:

  1. or
  2. and
  3. not x
  4. is not; not in

Dove gli operatori hanno la stessa precedenza, la valutazione procede da sinistra verso destra.

+0

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

+0

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_. –

1

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.

1

È 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.

Problemi correlati