Я продолжаю получать CastError: сбрасывать число до отказа для value & ldquo; NaN & rdquo; [Дубликат]

Это может быть не самый эффективный способ, но я решил поставить однострочный (фактически двухстрочный). Обе версии будут работать с произвольными иерархическими вложенными списками и будут использовать языковые возможности (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]

Хотя я не уверен в этом время об эффективности.

17
задан Aziz Shaikh 1 October 2012 в 07:39
поделиться

7 ответов

Нет никакого способа сделать это с обычными операторами / и /=.

Лучший способ сделать то, что вы хотите, - это защита:

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;
}

, но это потеряет читаемость и выразительность /=.

13
ответ дан Mike Samuel 1 September 2018 в 08:52
поделиться

Надеюсь, это полезно

(denominator != 0 ? nominator/denominator : Infinity)

или любое другое значение, которое вы хотите поставить в конце.

Приветствия.

1
ответ дан AlexMethod 1 September 2018 в 08:52
поделиться

, что было бы лучшим способом справиться с такой ситуацией, чтобы не допустить, чтобы другие скрипты выполняли

Отдел на ноль, похоже, не предотвращали выполнение других сценариев в 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;
  }
}
4
ответ дан am2124429 1 September 2018 в 08:52
поделиться

Почему бы просто не проверить, равен ли знаменатель нулю?

if(x != 0) z = y / x;

Вы также можете проверить, является ли результат Бесконечность:

3 / 0 == Infinity

Результаты в true;

(Проверено только в хроме.)

1
ответ дан GAgnew 1 September 2018 в 08:52
поделиться

В верхней части моей головы вы можете:

  1. Проверить вход пользователя, чтобы узнать, равен ли знаменатель нулю (или оценивается до нуля, в зависимости от того, что на самом деле делает ваш скрипт).
  2. Проверьте, является ли результат действия isFinite() , а если нет, то обрабатывайте его соответствующим образом.
5
ответ дан maerics 1 September 2018 в 08:52
поделиться

Немного отличается от остановки выполнения, но троичный оператор является довольно гладким способом настройки назначения переменных.

var one = 1,
    zero = 0,
    customValue = 1;


var quotient = zero===0 ? customValue : one / zero;

Таким образом, установив customVariable на целое по вашему выбору, вы можете ожидать прогнозируемого результата при делении на ноль.

0
ответ дан ShaneSauce 1 September 2018 в 08:52
поделиться

Чтобы предотвратить (нежелательное) выполнение

  1. Всегда проверяйте критический пользовательский ввод и / или результаты
  2. Используйте логические и / или обратные вызовы, которые вы можете предотвратить выполнение
  3. В HTML-форматах и ​​т. д. вы можете использовать значение return false; как значение для прекращения подачи.
2
ответ дан Smamatti 1 September 2018 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: