В чем причина наличия «//» в Python?


1 Answers

// безоговорочно «разделение полов», например:

>>> 4.0//1.5
2.0

Как вы видите, хотя оба операнда являются float s, // полы - так что вы всегда точно знаете, что он собирается делать.

Одиночный / может или не может быть установлен в зависимости от выпуска Python, будущих импортов и даже флагов, на которых выполняется запуск Python, например ...:

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

Как вы видите, single / may floor или он может возвращать float, основанный на полностью нелокальных проблемах, вплоть до значения флага -Q ... ;-).

Итак, если и когда вы знаете, что хотите настил пола, всегда используйте // , что гарантирует его. Если и когда вы знаете, что вы не хотите настила пола, похлопайте float() вокруг другого операнда и используйте / . Любая другая комбинация, и вы во власти версии, импорта и флагов! -)

Question

Я видел это в чей-то код:

y = img_index // num_images

где img_index - это бегущий индекс, а num_images - 3.

Когда я общаюсь с // в IPython, он действует так же, как знак разделения (т. Е. Одна косая черта). Мне просто интересно, есть ли причина иметь двойные косые черты?




В дополнение к этим другим ответам оператор // также предлагает значительные (3x) преимущества производительности по сравнению с / , предполагая, что вы хотите целочисленное деление.

$ python -m timeit '20.5 // 2'
100000000 loops, best of 3: 0.0149 usec per loop
$ python -m timeit '20.5 / 2'
10000000 loops, best of 3: 0.0484 usec per loop
$ python -m timeit '20 / 2'
10000000 loops, best of 3: 0.043 usec per loop
$ python -m timeit '20 // 2'
100000000 loops, best of 3: 0.0144 usec per loop



Related