Почему оператор Walrus не работает, если он реализован внутри оператора return этой функции?

Я пытался решить эту проблему, когда думал о реализации оператора внутри оператора return. Вот вопрос:

Цифровой корень - это рекурсивная сумма всех цифр числа. Для данного n возьмите сумму цифр n. Если это значение имеет более одной цифры, продолжайте уменьшать таким образом, пока не будет получено однозначное число. Входными данными будет неотрицательное целое число. Примеры:

  1. 16 -> 1 + 6 = 7
  2. 493193 -> 4 + 9 + 3 + 1 + 9 + 3 = 29 -> 2 + 9 = 11 -> 1 + 1 = 2
  3. 942 -> 9 + 4 + 2 = 15 -> 1 + 5 = 6

Код:

      def digital_root(n):
    return w:=sum(int(x) for x in str(n)) if w<10  else digital_root(w)

2 ответа

Чтобы использовать оператор моржа, вы должны поместить его там, где if состояние:

      def digital_root(n):
    return w if (w := sum(int(x) for x in str(n))) < 10 else digital_root(w)

По сути, это более короткая версия этого:

      def digital_root(n):
    if (w := sum(int(x) for x in str(n))) < 10:
        return w 
    else:
        return digital_root(w)

Вы слишком сосредоточены на «коротком» коде, чтобы понять, что принимаете глупые решения. Нет смысла делать все str- sum песня и танец, если n < 10 -

      def digital_root(n):
  if n < 10:
    return n
  else:
    return digital_root(sum(int(x) for x in str(n)))

Чтобы «сократить» это, вы можете использовать условное выражение -

      def digital_root(n):
  return n if n < 10 else digital_root(sum(int(x) for x in str(n)))

Но посмотрите, как вы преобразуете число в строку и сразу же вернетесь, используя int? Я понимаю, что вы делаете это, чтобы использовать свойство итерации строк, но вы могли бы написать простой итератор для чисел и полностью пропустить преобразование типов -

      def digits(n):
  yield n % 10
  if n >= 10: yield from digits(n // 10)

def digital_root(n):
  return n if n < 10 else digital_root(sum(digits(n)))

Польза от этого очевидна. Не только digital_root легче писать, но у вас также есть полезный digits функция, которая полезна в любой другой программе, которая нуждается в этой цифровой функциональности.

      print(digital_root(16))
print(digital_root(493193))
print(digital_root(942))
      7
2
6
Другие вопросы по тегам