python—在这个函数的return语句中实现时,为什么walrus操作符不起作用?

watbbzwu  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(296)

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

plicqrtu1#

要使用walrus操作符,应将其放在 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)
kdfy810k

kdfy810k2#

你太专注于“简短”的代码,以至于没有意识到你在做愚蠢的决定。整件事都做没有意义 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)))

要“缩短”这个时间,可以使用条件表达式-

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

但看看如何将数字转换为字符串,然后立即使用 int ? 我知道您这样做是为了利用字符串的iterable属性,但是您可以为数字编写一个简单的迭代器,并完全跳过类型转换-

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

相关问题