Требуется пояснение того, КАК функция возвращает то, что она возвращает
Название темы неинформативное, но по-другому описать проблему не додумался.
Как данная функция возвращает то, что она возвращает?
А именно, она возвращает список из произведений цифр числа до момента, пока это число не стало цифрой.
def per(n, s=0):
return ([n] if s else []) + (per(eval('*'.join(str(n))), 1) if n > 9 else [])
Особенно интересует eval. Я нашёл много страшных и длинных статей на тему принципа работы этой функции, но хотелось бы понять для начала хотя бы азы её работы. Как она вообще работает в данном конкретном случае?
Ответы (1 шт):
Функция eval(command) просто выполняет Python команду "command" как если бы вы задали ее в интерпретаторе Python:
In [85]: eval("print(1, 2)")
1 2
In [86]: eval("3 * 4")
Out[86]: 12
В приведенной вами функции число превращается в строку цифр, разделенную знаком умножения между каждой цифрой: 234 --> "2*3*4". После этого функция eval(...) считает произведение всех цифр.
Но, во-первых, этого можно достичь проще - просто дописать "1" в начале или в конце числа и перемножить все цифры. Таким образом нам не придется беспокоиться о числах, состоящих из одной цифры:
def prod(n):
return eval('*'.join('1' + str(n)))
А, во-вторых, как вы уже сами заметили, использование функции eval(...) может представлять серьезные проблемы безопасности, поэтому лучше сначала всегда попробовать обойтись без этой функции.
def prod(n):
res = 1
while n > 0:
n, mod = divmod(n, 10)
res *= mod
return res