如何在python中反复查找每个T数的数字总和的数字总和,直到成为单个数字?

时间:2018-08-26 09:26:27

标签: python python-3.x function if-statement return

这是我编写的代码,用于从重复的次数中获取数字总和,直到总和低于10:

T = int(input())
for i in range(T):
    N = int(input())
    def P():
            M = [int(d) for d in str(N)]
            N = sum(M)
            if N<10:
                    print(N)
            else :
                    return P()
    P()

在运行此代码时,它给我一个错误,例如:

 Traceback (most recent call last): 
 File"C:/Users/AdityaShrivastava/AppData/Roaming/Python/Python36/Scripts/tes 
 ting.py", line 11, in <module>
 P()
 File "C:/Users/Aditya 
 Shrivastava/AppData/Roaming/Python/Python36/Scripts/testing.py", line 5, in 
 P
 M = [int(d) for d in str(N)]
 UnboundLocalError: local variable 'N' referenced before assignment

4 个答案:

答案 0 :(得分:1)

python中的函数声明了一个新范围,这就是N在您的函数中不可见的原因。您可以通过将N传递到内部范围来避免这种情况,如下所示:

T = int(input())
for i in range(T):
    N = int(input())
    def P(N):
            M = [int(d) for d in str(N)]
            N = sum(M)  # this line was the actual culprit
            if N<10:
                    print(N)
            else :
                    return P(N)
    P(N)

>>> 1      # test one time
>>> 12345  # cross total of 121212
6

Python在写操作上比较保守。仅从外部作用域变量中读取是可以的,但是重新分配名称N(如果您写N = sum(M)会发生这种情况)使它严格检查 local 该名称的变量。

因此,它进一步假设尚未声明的变量是您要从其上方的行中读取的位置-实际上,这有点误导。


有关python中作用域和名称空间的更多信息,请检查here

答案 1 :(得分:1)

您获得的UnboundLocalError: local variable 'N' referenced before assignment是由于在函数P()中使用了N,而没有对其进行声明和初始化。

N = int(input())在循环内,但不在P()的范围内。循环中的最后一行P()将调用函数P(),而不是返回到N = int(input()),在该位置应已分配N。

我已将代码修改为

T = int(input())
for i in range(T):
    N = int(input())
    def P(N):
        M = [int(d) for d in str(N)]
        N = sum(M)
        if N<10:
            print(N)
        else :
            return P(N)
    P(N)

答案 2 :(得分:1)

您可以通过在P函数中传递N作为参数来解决此问题。

T = int(input())
for i in range(T):
N = int(input())
def P(n):
        M = [int(d) for d in str(n)]
        n = sum(M)
        if n<10:
                print(n)
        else :
                P(n)
P(N)

如果您在函数P中设置N的值,python会将其理解为使用该名称创建局部变量。该局部变量掩盖了在函数外部使用的全局变量N。因此,最好将N作为参数传递给函数P。

谢谢。

答案 3 :(得分:1)

您正在使用递归来解决此问题。简单地使用循环会更有效:

def gimmeNumber(text):
    """"Helper: Asks for input until valid integer number is inputted. Retuns the number"""
    while True:
        T = input(text).strip()
        if T and T.isdigit():
            T = int(T)
            break
        print("Thats not a number ...")
    return T

def sumDigits(number):
    return sum(int(x) for x in str(number))

T = gimmeNumber("How many numbers? ")
for _ in range(T):
    s = 0
    N = gimmeNumber("Give me a number: ")
    # calculate the cross-sum
    s = sumDigits(N)
    while s > 9: # repeat while greater then 9  
        s = sumDigits(s)

    print(s)

输入:4,然后是999,888,333,111

输出:

9
6
9
3

@Arne建议将gimmeNumber(text)改为使用try/except,而更适合python Ask forgiveness not permission的思维方式,我同意。

仍然,上述变体也可以使用,对于初学者来说更容易理解。这是try/except之一:

def gimmeNumber(text):
    """"Helper: Asks for input until valid integer number is inputted. Retuns the number"""
    while True:
        try:
            T = int(input(text).strip())
            break
        except ValueError as e:
            print("Thats not a number ...")
    return T

有关输入验证的更多信息,建议您在Asking the user for input until they give a valid response的答案中进行阅读。