Math.sum (javascript) .... вид замещения оператора
.1 + .0001 + -.1 --> 0.00010000000000000286
Math.sum(.1 , .0001, -.1) --> 0.0001
Object.defineProperties(Math, {
sign: {
value: function (x) {
return x ? x < 0 ? -1 : 1 : 0;
}
},
precision: {
value: function (value, precision, type) {
var v = parseFloat(value),
p = Math.max(precision, 0) || 0,
t = type || 'round';
return (Math[t](v * Math.pow(10, p)) / Math.pow(10, p)).toFixed(p);
}
},
scientific_to_num: { // this is from https://gist.github.com/jiggzson
value: function (num) {
//if the number is in scientific notation remove it
if (/e/i.test(num)) {
var zero = '0',
parts = String(num).toLowerCase().split('e'), //split into coeff and exponent
e = parts.pop(), //store the exponential part
l = Math.abs(e), //get the number of zeros
sign = e / l,
coeff_array = parts[0].split('.');
if (sign === -1) {
num = zero + '.' + new Array(l).join(zero) + coeff_array.join('');
} else {
var dec = coeff_array[1];
if (dec)
l = l - dec.length;
num = coeff_array.join('') + new Array(l + 1).join(zero);
}
}
return num;
}
}
get_precision: {
value: function (number) {
var arr = Math.scientific_to_num((number + "")).split(".");
return arr[1] ? arr[1].length : 0;
}
},
diff:{
value: function(A,B){
var prec = this.max(this.get_precision(A),this.get_precision(B));
return +this.precision(A-B,prec);
}
},
sum: {
value: function () {
var prec = 0, sum = 0;
for (var i = 0; i < arguments.length; i++) {
prec = this.max(prec, this.get_precision(arguments[i]));
sum += +arguments[i]; // force float to convert strings to number
}
return Math.precision(sum, prec);
}
}
});
Идея состоит в том, чтобы вместо Math вместо Math использовать ошибки плавания
Math.diff(0.2, 0.11) == 0.09 // true
0.2 - 0.11 == 0.09 // false
также отмечают, что Math.diff и Math.sum автоматически определяют точность использования
. Math.sum принимает любое количество аргументов
Сделайте это:
list(map(chr,[66,53,0,94]))
В Python 3+ многие процессы, которые перебирают итераторы, возвращают сами итераторы. В большинстве случаев это приводит к экономии памяти и ускоряет работу.
Если все, что вам нужно сделать, это перебрать этот список в конце концов, нет необходимости даже преобразовывать его в список, потому что вы все равно можете перебирать объект map
следующим образом:
# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
print(ch)
Я не знаком с Python 3.1, но будет ли это работать?
[chr(x) for x in [66, 53, 0, 94]]
В дополнение к приведенным выше ответам в Python 3
мы можем просто создать list
значений результата из map
как
li = []
for x in map(chr,[66,53,0,94]):
li.append(x)
print (li)
>>>['B', '5', '\x00', '^']
. Мы можем обобщить другой пример, где я был поражен , операции на карте также можно обрабатывать аналогичным образом, как в regex
, мы можем написать функцию, чтобы получить list
элементов для отображения и получить результат в одно и то же время. Ex.
b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
li.append(x)
print (li)
>>>[1, 72, 474]
list(map(chr, [66, 53, 0, 94]))
map (func, * iterables) -> map object Сделать итератор, который вычисляет функцию, используя аргументы из каждого из iterables. Остановка, когда исчерпана самая короткая итерация.
«Сделать итератор»
blockquote>означает, что он вернет итератор.
", который вычисляет функцию с использованием аргументов из каждого из итераций "
blockquote>означает, что функция next () итератора будет принимать одно значение каждого итератора и передавать каждый из них в один позиционный параметр function.
Итак, вы получаете итератор из map () funtion и jsut передаете его в список () встроенную функцию или используете списки.
Новый и опрятный в Python 3.5:
[*map(chr, [66, 53, 0, 94])]
Благодаря Дополнительные распаковывающие обобщения
Почему вы этого не делаете:
[chr(x) for x in [66,53,0,94]]
Это называется пониманием списка. Вы можете найти много информации о Google, но вот ссылка на документацию Python (2.6) на понимание списков . Однако вас может заинтересовать документация Python 3 .
Функция отображения списка с возвратом имеет преимущество сохранения набора текста, особенно во время интерактивных сеансов. Вы можете определить функцию lmap
(по аналогии с python2's imap
), которая возвращает список:
lmap = lambda func, *iterable: list(map(func, *iterable))
Тогда вызов lmap
вместо map
выполнит задание: lmap(str, x)
короче на 5 символов (30% в этом случае), чем list(map(str, x))
и, конечно, короче [str(v) for v in x]
. Вы также можете создавать похожие функции для filter
.
Был комментарий к исходному вопросу:
Я бы предложил переименовать в Get Map (), чтобы вернуть список в Python 3. *, как это применимо ко всем версиям Python3. Есть ли способ сделать это? - meawoppl 24 января в 17:58
blockquote>Возможно, это , но это очень плохая идея. Просто для удовольствия, вот как вы можете (но не должны) делать это:
__global_map = map #keep reference to the original map lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion map = lmap x = [1, 2, 3] map(str, x) #test map = __global_map #restore the original map and don't do that again map(str, x) #iterator
Преобразование моего старого комментария для лучшей видимости: для «лучшего способа сделать это» без map
целиком, если ваши входы, как известно, являются ординалами ASCII, обычно гораздо быстрее конвертировать в bytes
и декодировать, a la bytes(list_of_ordinals).decode('ascii')
. Это дает вам str
значений, но если вам нужно list
для изменчивости или тому подобное, вы можете просто преобразовать его (и он все же быстрее). Например, в ipython
микрообъектах, преобразующих 45 входов:
>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)
>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)
>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)
Если вы оставите его как str
, это займет ~ 20% от времени самых быстрых map
решений; даже конвертируя обратно в список, он по-прежнему составляет менее 40% от самого быстрого решения map
. Массовое преобразование через bytes
и bytes.decode
, тогда объемное преобразование обратно в list
экономит много работы, , но , как отмечено, работает только, если все ваши входы являются ординалами ASCII (или ординалами в некотором байта на конкретное кодирование для каждого символа, например latin-1
).