为什么 Walrus Operator 在此函数的 return 语句中实现时不起作用?

Why is the Walrus Operator not working when implemented inside the return statement of this function?

当我想到在 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)

要使用海象运算符,您应该将其放在 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-int-sum歌舞全无意义 n < 10 -

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

要“缩短”它,您可以使用 conditional expression -

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