In Python, a // b
è definito come piano (a/b), come contrario alla maggior parte delle altre lingue in cui la divisione intera è definita come trunc (a/b). C'è una differenza corrispondente nell'interpretazione di a % b
= a - (a // b) * b
.
Il ragione di questo è che la definizione di Python del %
dell'operatore (e divmod
) è generalmente più utile rispetto a quella di altre lingue. Per esempio:
def time_of_day(seconds_since_epoch):
minutes, seconds = divmod(seconds_since_epoch, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
return '%02d:%02d:%02d' % (hours, minutes, seconds)
Con questa funzione, time_of_day(12345)
rendimenti '03:25:45'
, come ci si aspetterebbe.
Ma che ore sono 12345 secondi prima del l'epoca? Con la definizione di Python divmod
, time_of_day(-12345)
restituisce correttamente '20:34:15'
.
E se ridefinire divmod
per utilizzare la definizione C di /
e %
?
def divmod(a, b):
q = int(a/b) # I'm using 3.x
r = a - b * q
return (q, r)
Ora, time_of_day(-12345)
rendimenti '-3:-25:-45'
, che non è un tempo di validità del giorno. Se la funzione standard Python divmod
fosse implementata in questo modo, dovresti scrivere codice di caso speciale per gestire gli input negativi. Ma con la divisione in stile piano, come il mio primo esempio, funziona semplicemente.
È possibile utilizzare 'math.fmod' per ottenere lo stesso comportamento di C o Java. – Helio