487 votes

Quelle est la raison d'avoir "//" en Python?

J'ai vu ça dans le code de quelqu'un:

 y = img_index // num_images
 

img_index est un indice courant et num_images est 3.

Quand je gâche avec // dans IPython, il semble agir comme un signe de division (une barre oblique). Je me demandais s'il y avait une raison d'avoir des doubles barres obliques?

627voto

Mark Rushakoff Points 97350

En Python 3, ils ont fait l' / opérateur de faire une division flottante, et a ajouté l' // de l'opérateur de faire de division entière (c'est à dire le quotient sans reste); alors qu'en Python 2, l' / opérateur était simplement la division entière, sauf si l'une des opérandes est déjà un nombre à virgule flottante.

En Python 2.X:

>>> 10/3
3
>>> # to get a floating point number from integer division:
>>> 10.0/3
3.3333333333333335
>>> float(10)/3
3.3333333333333335

En Python 3:

>>> 10/3
3.3333333333333335
>>> 10//3
3

Pour plus de renseignements, voir PEP238.

216voto

Alex Martelli Points 330805

// est inconditionnellement "tronquer la division", e.g:

>>> 4.0//1.5
2.0

Comme vous le voyez, même si les deux opérandes sont des floats, // encore tronque-de sorte que vous savez toujours en toute sécurité ce qu'il va faire.

Seul / peut ou peut ne pas tronquer selon version de Python, les importations à l'avenir, et même des drapeaux sur lesquels Python, e.g....:

$ python2.6 -Qold -c 'print 2/3'
0
$ python2.6 -Qnew -c 'print 2/3'
0.666666666667

Comme vous le voyez, seul / peut tronquer, ou il peut renvoyer à un flotteur, basée sur complètement non à des questions locales, jusqu'à et y compris la valeur de l' -Q drapeau...;-).

Donc, si et quand vous savez que vous voulez de troncature, toujours utiliser //, ce qui la garantit. Si et quand vous savez que vous n'avez pas envie de troncature, une claque float() autour de l'autre opérande et l'utilisation /. Toute autre combinaison, et vous êtes à la merci de la version, les importations et les drapeaux!-)

23voto

EOL Points 24342

Pour compléter la réponse d'Alex, j'ajouterais qu'à partir de Python 2.2.0a2, from __future__ import division est une alternative pratique à l'utilisation de lots de float(…)/… . Toutes les divisions effectuent des divisions de flottement , sauf celles avec // . Cela fonctionne avec toutes les versions de 2.2.0a2 sur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X