Почему оператор Walrus не работает, если он реализован внутри оператора return этой функции?
Я пытался решить эту проблему, когда думал о реализации оператора внутри оператора return. Вот вопрос:
Цифровой корень - это рекурсивная сумма всех цифр числа. Для данного n возьмите сумму цифр n. Если это значение имеет более одной цифры, продолжайте уменьшать таким образом, пока не будет получено однозначное число. Входными данными будет неотрицательное целое число. Примеры:
- 16 -> 1 + 6 = 7
- 493193 -> 4 + 9 + 3 + 1 + 9 + 3 = 29 -> 2 + 9 = 11 -> 1 + 1 = 2
- 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