2011-01-18 36 views
5

In Learn Python the Hard Way (pag 15-16), ha un esempio esercizio di Zed ShawModulo e ordine delle operazioni in Python

100 - 25 * 3 % 4 

il risultato è 97 (provare per credere!)

non riesco a vedere la ordine delle operazioni che possono fare questo ..

100 - 25 = 75
3% 4 = 0
o (100-25 * 3) = 225% 4 = ??? ma in ogni caso non 97 non credo ...

Un esempio simile è 3 + 2 + 1 - 5 + 4 % 2 - 1/4 + 6 che produce 7

In che ordine sono fatte le operazioni?

+1

http://docs.python.org/reference/expressions.html#summary –

+1

Sei stato anche ottenuto la moltiplicazione e la sottrazione di sbagliato, usano lo stesso ordine in matematica di base. –

+1

avrebbe dovuto spiegato che. Ancora una volta sono triste nel constatare che esistono tutorial Python migliori. Immergiti in Python ". –

risposta

22

Per il primo esempio: * e % prendere la precedenza su -, quindi per prima cosa valutare 25 * 3 % 4. * e % hanno la stessa priorità e associatività da sinistra a destra, quindi valutiamo da sinistra a destra, a partire da 25 * 3. Questo produce 75. Ora valutiamo 75 % 4, producendo 3. Infine, 100 - 3 è 97.

+0

Grazie a tutto questo, la tua risposta e quelle che seguono sono molto utili, anche i riferimenti, e io non lo so davvero, e l'intero concetto di modulo è un po 'estraneo a me ... anche se lo capisco non hanno mai avuto il caso d'uso. (per modulo che è ..) – dartdog

+0

un orologio da parete standard è "modulo 60" perché una volta che si arriva a 59 minuti, e aggiungere 1 minuto, si ottiene 0 (== 60) –

+0

ho avuto la stessa domanda, grazie! – Drewdin

2

Moltiplicazione >> >> mod sottrazione

In [3]: 25 * 3 
Out[3]: 75 

In [4]: 75 % 4 
Out[4]: 3 

In [5]: 100 - 3 
Out[5]: 97 

Moltiplicazione e operatore modulo hanno la stessa precedenza, in modo da valutare da sinistra a destra per questo esempio.

+0

Non è solo una questione di ciò che appare per primo. Per esempio '2 ** 3 ** 4 == 2 ** (3 ** 4)', perché l'associatività di '**' è da destra a sinistra. –

+0

Modifica per renderlo un po 'più chiaro sulla base del commento di Sven. – chauncey

0

Ecco come va:

'*' e '%' avere lo stesso precendenza, in modo da valutare quelli da sinistra a destra.

  1. 25 * 3 = 75
  2. 75% 4 = 3 (4 * 18 = 72; resto è 3)
  3. 100 - 3 = 97

come volevasi dimostrare

+0

Non tutto ciò che ha la stessa precedenza viene valutato da sinistra a destra - ad es. '2 ** 3 ** 4 == 2 ** (3 ** 4)' viene valutato da destra a sinistra. –

0

problema originale: 100 - 25 * 3 % 4

In realtà, la valutazione 25 * 3 e prendendo il 75% dei 4 non è corretta, e mi è capitato di lavorare comodamente per questo problema.

Quello che% in python è in realtà è un operatore modulo in cui x% y fornisce il resto di x/y. In questo caso, quello che è successo è che 75/4 è 18, con un resto di 3, motivo per cui 100 - 3 = 97.

Non cercare di moltiplicare le percentuali, è un errore comune.

0

Nella seconda versione,% ha lo stesso ordine di * quindi otteniamo 3 + 2 + 1-5 + 4% 2-1/4 + 6 = 3 + 2 + 1-5 + (4% 2) - (1/4) + 6 = 1 + (4% 2) - (1/4) +6 = 1 + 0- (1/4) + 6 = 1 (1/4) + 6 = 0,75 + 6 = 6.75 e questo è quello che dice quando lo provo sulla console, quindi qualunque cosa tu abbia fatto devi aver fatto qualcosa per aggirarlo.

0

La matematica non è il mio punto di forza, quindi anche questa domanda mi ha preso per un momento. Ma spero che tu trovi questo utile.

75 diviso 4 è 18.75

18 moltiplicato per 4 è 72 (3 lasciando rimanente dal 75)

Il calcolo è dato 100-25 * 3% 4 con una risposta di 97. Ora questo è come vorrei farlo usando PEMDAS mentre parla della nella sezione di domanda:

#!/bin/python 

A = 100 
B = 25 
C = 3 
D = 4 
E = B*C# 75 
F = E%D # 3 
G = A-F # 97 
print("B * C ="), E 
print("E % D ="), F 
print("A - F ="), G 

io penso che si debba trattare modulo (%) come divisione,

2

ho capito l'una rispondi alla tua seconda domanda perché mi dava fastidio anche a me - la risposta di Zac è vicina, ma la perdita del risultato di 1/4 è dovuta al fatto che Python 2.X sta troncando i risultati della divisione intera. Così è valutazione del funzionamento modulo primo, poi la divisione (che non essendo galleggiare, viene restituito come 0.

3 + 2 + 1 - 5 + 4 % 2 - 1/4 + 6 
3 + 2 + 1 - 5 + (0) - (0) + 6 
6 - 5 + 6 
1 + 6 
7 
0

Python calcola% dopo * ma prima o + _.

così,

(100 - 25 * 3 % 4) 
(100 - 75 % 4) 
(100 - 3) 
(97) 
Problemi correlati