«Это» - все о сфере видимости. Каждая функция имеет свою собственную область действия, и поскольку все в JS является объектом, даже функция может хранить некоторые значения в себе, используя «это». ООП 101 учит, что «это» применимо только к экземплярам объекта. Поэтому каждый раз, когда выполняет функция, новый «экземпляр» этой функции имеет новое значение «this».
Большинство людей путаются, когда пытаются использовать «это» внутри анонимных функций закрытия например:
(function(value) { this.value = value; $('.some-elements').each(function(elt){ elt.innerHTML = this.value; // uh oh!! possibly undefined }); })(2);
Итак, внутри each (), «this» не содержит «значение», которое вы ожидаете от него (от
this.value = value;над ним). Итак, чтобы справиться с этой проблемой (без каламбуры), разработчик мог:
(function(value) { var self = this; // small change self.value = value; $('.some-elements').each(function(elt){ elt.innerHTML = self.value; // phew!! == 2 }); })(2);
попробовать; вам понравится эта схема программирования
Вы используете Python 2.x, где целочисленные деления будут усекаться, а не превращаться в число с плавающей точкой.
>>> 1 / 2
0
Вы должны сделать одно из них float
:
>>> float(10 - 20) / (100 - 10)
-0.1111111111111111
или from __future__ import division
, что заставит /
принять поведение Python 3.x, который всегда возвращает float.
>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
В любом случае, это целочисленное деление. 10/90 = 0. Во втором случае вы просто преобразуете 0 в число с плавающей точкой.
Попробуйте преобразовать один из операндов "/" в тип float:
float(20-10) / (100-10)
Вы вставляете целые числа, поэтому Python возвращает вам целое число обратно :
>>> 10 / 90
0
Если вы затем преобразуете это значение в число с плавающей запятой, округление будет уже выполнено, другими словами, 0 целое всегда будет 0 с плавающей точкой.
Если вы используете числа с плавающей запятой по обе стороны от деления, Python даст вам ожидаемый ответ.
>>> 10 / 90.0
0.1111111111111111
Итак, в вашем случае:
>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
Вы преобразовываете в тип float после того, как деление уже произошло во втором примере. Попробуйте следующее:
float(20-10) / float(100-10)
Вам нужно изменить его на float ПЕРЕД делением. То есть:
float(20 - 10) / (100 - 10)
Сделайте хотя бы один из них float, тогда это будет float division, а не integer:
>>> (20.0-10) / (100-10)
0.1111111111111111
Приводить результат к float слишком поздно.