Генераторы и Итераторы (работает только в Firefox 2 + и Safari).
function fib() {
var i = 0, j = 1;
while (true) {
yield i;
var t = i;
i = j;
j += t;
}
}
var g = fib();
for (var i = 0; i < 10; i++) {
document.write(g.next() + "
\n");
}
функция, содержащая
yield
, ключевое слово является генератором. При вызове его его формальные параметры связываются с действительными аргументами, но его тело на самом деле не оценено. Вместо этого итератор генератора возвращается. Каждый вызов к итератору генератораnext()
метод работает, другой проходит через итеративный алгоритм. Значение каждого шага является значением, определеннымyield
ключевое слово. Думайтеyield
как версия итератора генератора возврата, указывая на границу между каждым повторением алгоритма. Каждый раз Вы звонитеnext()
, резюме кода генератора от оператора послеyield
.В нормальном использовании, объекты итератора "невидимы"; Вы не должны будете воздействовать на них явно, но будете вместо этого использовать JavaScript
for...in
иfor each...in
операторы для цикличного выполнения естественно по ключам и/или значениям объектов.
var objectWithIterator = getObjectSomehow();
for (var i in objectWithIterator)
{
document.write(objectWithIterator[i] + "
\n");
}
Где-то между 1e308 и 1e309 точность с плавающей запятой заканчивается, поэтому, если вы вычисляете результаты выше этого диапазона, вы увидите inf
>>> 1e308
1e+308
>>> 1e309
inf
>>> json.dumps(1e308,allow_nan=False)
'1e+308'
>>> json.dumps(1e309,allow_nan=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps
**kw).encode(obj)
File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "/usr/lib/python2.6/json/encoder.py", line 304, in _iterencode
yield floatstr(o, self.allow_nan)
File "/usr/lib/python2.6/json/encoder.py", line 47, in floatstr
raise ValueError(msg)
ValueError: Out of range float values are not JSON compliant: inf
>>>
Decimal может обрабатывать большие числа, но, очевидно, это снижает производительность (и его нельзя сериализовать с помощью json)
>>> from decimal import Decimal
>>> Decimal('1e900')/10
Decimal("1E+899")
Вот пример добавления, которое не вызывает исключение переполнения
>>> a=1e308
>>> a+a
inf