Как посчитать сколько раз вызывалась функция, не выходя за её рамки? Python

Всем доброго вечера. Есть такой код:

import math

n = 999

def cycle(a):
    b = math.prod(list(map(lambda x: int(x), str(a))))
    return b if len(str(b)) == 1 else cycle(b)

print(cycle(n))

Он разбивает двузначное (и больше) число на отдельные числа. И перемножает их пока результат не будет равен одному числу. Например, при n = 999 он выдаст 2. А внутри всё будет выглядеть так:

1) 9*9*9 = 729, 2) 7*2*9 = 126, 3) 1*2*6 = 12, 4) 1*2 = 2

То есть потребовалось 4 действия, чтобы получить результат с одним символом. Вопрос - как в самой функции вернуть это количество действий? Не выходя за её рамки. То есть кроме n = ... за пределами функции ничего быть не должно

А итоговый результат должен быть такой:

n = 999
def cycle(a):
   .....
print(cycle(n))
>>>> 4

Или

n = 7
def cycle(a):
  .....
print(cycle(n))
>>>> 0

Ответы (3 шт):

Автор решения: Павел

Вообще, вариантов масса:

C использованием декоратора

import math

n = 999

def counted(f):
    def wrapped(*args, **kwargs):
        wrapped.calls += 1
        return f(*args, **kwargs)
    wrapped.calls = 0
    return wrapped

@counted
def cycle(a):
    b = math.prod(list(map(lambda x: int(x), str(a))))
    return cycle.calls if len(str(b)) == 1 else cycle(b)

print(cycle(n)) # 4

С использованием глобальной переменной

import math

n = 999
global counter

def cycle(a):
    global counter
    counter += 1
    b = math.prod(list(map(lambda x: int(x), str(a))))
    return counter if len(str(b)) == 1 else cycle(b)

counter = 0
print(cycle(n)) # 4

С использованием переменной у функции

import math

n = 999

def cycle(a):
    cycle.counter += 1
    b = math.prod(list(map(lambda x: int(x), str(a))))
    return cycle.counter if len(str(b)) == 1 else cycle(b)

cycle.counter = 0
print(cycle(n)) # 4

Выбирайте какой нравится.

→ Ссылка
Автор решения: Алексей Р
import math

n = 999


def cycle(a, step=1):
    b = math.prod(list(map(lambda x: int(x), str(a))))
    return (b, step) if len(str(b)) == 1 else cycle(b, step + 1)


print(cycle(n))
(2, 4) # первое число в кортеже - результат, второе - кол-во шагов
→ Ссылка
Автор решения: Stanislav Volodarskiy

Чем проще, тем лучше. Рекурсия:

import math


def cycle(n):
    if n < 10:
        return 0
    return cycle(math.prod(map(int, str(n)))) + 1


print(cycle(int(input())))
$ echo 999 | python cycle.py
4

$ echo 729 | python cycle.py
3

$ echo 126 | python cycle.py
2

$ echo 12 | python cycle.py
1

$ echo 2 | python cycle.py
0
→ Ссылка