Python 局部变量作为计数器

Python Local Variable As Counter

使用 Python 3.7.

有什么方法可以使用局部变量作为计数器吗? 我尝试并收到错误:

UnboundLocalError

我确实找到了使用有效的 glbal 变量的建议,但如果可能的话,我更愿意使用局部变量。

谢谢, -w

使用计数器全局变量的工作代码:

count = 0
def my_collatz(number):

    global count
    count +=1
    if int(number)%2 == 0:
        r = int((number)//2)
    else:
        r = int(((number * 3) + 1))
    print('Attempt : ' + str(count) + ',' + str(r))

    if r != 1:
        return my_collatz(int(r))

print('Please enter a number : ')
number=input()
my_collatz(int(number))

一个可能的解决方案是将 count 变量作为函数的参数移动并在每次调用时递增它:

def my_collatz(number, count=1):    
    if number % 2 == 0:
        r = number // 2
    else:
        r = (number * 3) + 1

    print('Attempt : ' + str(count) + ',' + str(r))

    if r != 1:
        return my_collatz(r, count + 1)

print('Please enter a number : ')
number=input()
my_collatz(int(number))

打印:

Please enter a number : 
6
Attempt : 1,3
Attempt : 2,10
Attempt : 3,5
Attempt : 4,16
Attempt : 5,8
Attempt : 6,4
Attempt : 7,2
Attempt : 8,1

其他解决方案是根本不使用 count,而是将函数作为生成器(使用 yield)。然后您可以使用 enumerate() 来获取您的步数:

def my_collatz(number):
    if number % 2 == 0:
        r = number // 2
    else:
        r = (number * 3) + 1

    yield r

    if r != 1:
        yield from my_collatz(r)

print('Please enter a number : ')
number=input()

for count, r in enumerate(my_collatz(int(number)), 1):
    print('Attempt : ' + str(count) + ',' + str(r))

确实是一个很奇怪的功能。无论如何,您可以通过将其转换为输入参数来避免使用全局变量:

count = 0
def my_collatz(number, count):

    count +=1
    if int(number)%2 == 0:
        r = int((number)//2)
    else:
        r = int(((number * 3) + 1))
    print('Attempt : ' + str(count) + ',' + str(r))

    if r != 1:
        return my_collatz(int(r), count=count)

print('Please enter a number : ')
number=input()
my_collatz(int(number),count)