Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python局部变量作为计数器_Python_Function_Variables_Global_Local - Fatal编程技术网

Python局部变量作为计数器

Python局部变量作为计数器,python,function,variables,global,local,Python,Function,Variables,Global,Local,使用Python3.7 有没有办法使用局部变量作为计数器? 我尝试并收到错误: 未绑定本地错误 我确实找到了使用glbal变量的建议,但如果可能的话,我更喜欢使用局部变量 谢谢, -w 使用计数器的全局变量的工作代码: count = 0 def my_collatz(number): global count count +=1 if int(number)%2 == 0: r = int((number)//2) else:

使用Python3.7

有没有办法使用局部变量作为计数器? 我尝试并收到错误:

未绑定本地错误

我确实找到了使用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)

你到底在数什么?您的代码示例似乎只有一个函数调用,在这一点上,
count
似乎毫无意义?@paritossingh:显示的函数是递归的,注意
返回函数体中的my_collatz(int(r))
行啊,我错过了,gotchaThanks all,如果您感兴趣,这里有更多关于collatz的信息: