Python Локальная переменная как счетчик - PullRequest
0 голосов
/ 12 января 2020

Использование 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))

Ответы [ 2 ]

1 голос
/ 12 января 2020

Это действительно очень странная функция. В любом случае, вы можете избежать использования глобальной переменной, преобразовав ее во входной параметр:

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)
0 голосов
/ 12 января 2020

Одно из возможных решений - переместить переменную 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))
...