Найти - Пользователи
Полная версия: функции, вложенные функции
Начало » Python для новичков » функции, вложенные функции
1
bs0d
Собственно изучаю Питон по книге Лутца, возникло пару вопросов

исходный код, как написано в книге:
def f1():
    X = 88
    def f2():
        print(X+12)
    return f2
act = f1()
act()
работает, возвращает результат на экран “100”

def f1():
    X = 88
    def f2():
        print(X+12)
    return f2
f1()
работает, но не возвращает ничего. почему необходимо создавать копию функции f1, чтобы она передавала управление на функцию f2 ???

def f1():
    X = 88
    def f2():
        print(X+12)
    return X
 
act = f1()
act()
падает с ошибкой TypeError: ‘int’ object is not callable
тоже не понятно. почему при создании копии функции f1, act не может вернуть integer?
bs0d
час убил на понимание сего кода, видимо по своей же невнимательности

оказалось, что код
act = f1()
не копирует функцию, а выполняет ее, а результат выполнения (передача управления на функцию f2) остается в переменной act ; при выполнении же act() - выполняется уже функция f2, которой передано управление….

жестко… осознание сего приема придет не скоро, а в практике вообще не представляю где смогу энто применять
py.user.next
>>> def f1():
...     X = 88
...     def f2():
...         print(X + 12)
...     return f2
... 
>>> f1()()
100
>>>
bs0d
py.user.next
мерсирую. такие варианты встречал в книге. но пока не совсем понял логику работы такой конструкции, в мозгу еще не отложилось
kise97
bs0d
если вызвать `f1()`, то она вернет `return f2`, т.е. имя функции написанной на 2 строчки выше, но НЕестественно, но эта строка f2 идет не как функция, а как переменная(python bleat the best), т.е если мы выведем f(), то у нас ничего не будет (т.к. мы не вызвали функцию, а лишь получили ее имя), далее просто для экономии строк пишем f2()().

вот так думаю понятнее будет
_f2 = f1()
_f2()

По моему, я какой то бред выше написал
PanovSergey
мерсирую. такие варианты встречал в книге. но пока не совсем понял логику работы такой конструкции, в мозгу еще не отложилось
Разбирайтесь что такое декораторы и с чем их едят
Еще смотрите метод __call__ .
py.user.next
PanovSergey
Разбирайтесь что такое декораторы
декораторы - отдельная тема; в данном случае речь идёт про замыкания

bs0d
а в практике вообще не представляю где смогу энто применять
>>> def adder(n):
...     return lambda x: n + x
... 
>>> add3 = adder(3)
>>> add5 = adder(5)
>>> 
>>> list(map(add3, [1, 5, 9]))
[4, 8, 12]
>>> list(map(add5, [1, 5, 9]))
[6, 10, 14]
>>>

в основном используется для создания функций для их последующей передачи куда-нибудь
PanovSergey
декораторы - отдельная тема; в данном случае речь идёт про замыкания
согласен замыкание более правильно, просто декоратор как способ применения пришел первым в голову
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB