Это может быть не самый эффективный способ, но я решил поставить однострочный (фактически двухстрочный). Обе версии будут работать с произвольными иерархическими вложенными списками и будут использовать языковые возможности (Python3.5) и рекурсию.
def make_list_flat (l):
flist = []
flist.extend ([l]) if (type (l) is not list) else [flist.extend (make_list_flat (e)) for e in l]
return flist
a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = make_list_flat(a)
print (flist)
Выход:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
Это работает на глубине первый способ. Рекурсия идет до тех пор, пока не найдет элемент, не являющийся списком, затем расширяет локальную переменную flist
и затем возвращает ее родительскому элементу. Всякий раз, когда возвращается flist
, он расширяется до родительского flist
в понимании списка. Поэтому в корне возвращается плоский список.
Вышеописанное создает несколько локальных списков и возвращает их, которые используются для расширения списка родителя. Я думаю, что путь для этого может создать gloabl flist
, как показано ниже.
a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = []
def make_list_flat (l):
flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l]
make_list_flat(a)
print (flist)
Выход снова
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
Хотя я не уверен в этом время об эффективности.
Нет никакого способа сделать это с обычными операторами /
и /=
.
Лучший способ сделать то, что вы хотите, - это защита:
function notZero(n) {
n = +n; // Coerce to number.
if (!n) { // Matches +0, -0, NaN
throw new Error('Invalid dividend ' + n);
}
return n;
}
, а затем выполните деление, подобное
numerator / notZero(denominator)
. В качестве альтернативы вы всегда можете защитить выход
function dividend(numerator, denominator) {
var quotient = numerator / denominator;
if (quotient !== quotient) { throw new Error(numerator + " / " + denominator); }
return quotient;
}
, но это потеряет читаемость и выразительность /=
.
Надеюсь, это полезно
(denominator != 0 ? nominator/denominator : Infinity)
или любое другое значение, которое вы хотите поставить в конце.
Приветствия.
, что было бы лучшим способом справиться с такой ситуацией, чтобы не допустить, чтобы другие скрипты выполняли
blockquote>Отдел на ноль, похоже, не предотвращали выполнение других сценариев в JavaScript:
var a = 20; var b = 0; var result = a/b; console.log(result); // returns Infinity
Если вам нужно что-то другое в случае деления на ноль, вы можете использовать
function divideIfNotZero(numerator, denominator) { if (denominator === 0 || isNaN(denominator)) { return null; } else { return numerator / denominator; } }
Почему бы просто не проверить, равен ли знаменатель нулю?
if(x != 0) z = y / x;
Вы также можете проверить, является ли результат Бесконечность:
3 / 0 == Infinity
Результаты в true
;
(Проверено только в хроме.)
В верхней части моей головы вы можете:
isFinite()
, а если нет, то обрабатывайте его соответствующим образом. Немного отличается от остановки выполнения, но троичный оператор является довольно гладким способом настройки назначения переменных.
var one = 1,
zero = 0,
customValue = 1;
var quotient = zero===0 ? customValue : one / zero;
Таким образом, установив customVariable на целое по вашему выбору, вы можете ожидать прогнозируемого результата при делении на ноль.
return false;
как значение для прекращения подачи.