Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2014 21:50:30

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

функции, вложенные функции

Собственно изучаю Питон по книге Лутца, возникло пару вопросов

исходный код, как написано в книге:

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 (Фев. 1, 2014 21:51:01)

Офлайн

#2 Фев. 1, 2014 22:32:38

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

функции, вложенные функции

час убил на понимание сего кода, видимо по своей же невнимательности

оказалось, что код

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

жестко… осознание сего приема придет не скоро, а в практике вообще не представляю где смогу энто применять

Офлайн

#3 Фев. 1, 2014 22:51:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

функции, вложенные функции

>>> def f1():
...     X = 88
...     def f2():
...         print(X + 12)
...     return f2
... 
>>> f1()()
100
>>>



Офлайн

#4 Фев. 1, 2014 23:01:06

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

функции, вложенные функции

py.user.next
мерсирую. такие варианты встречал в книге. но пока не совсем понял логику работы такой конструкции, в мозгу еще не отложилось

Офлайн

#5 Фев. 1, 2014 23:50:36

kise97
Зарегистрирован: 2012-05-31
Сообщения: 83
Репутация: +  4  -
Профиль  

функции, вложенные функции

bs0d
если вызвать `f1()`, то она вернет `return f2`, т.е. имя функции написанной на 2 строчки выше, но НЕестественно, но эта строка f2 идет не как функция, а как переменная(python bleat the best), т.е если мы выведем f(), то у нас ничего не будет (т.к. мы не вызвали функцию, а лишь получили ее имя), далее просто для экономии строк пишем f2()().

вот так думаю понятнее будет

_f2 = f1()
_f2()

По моему, я какой то бред выше написал

Офлайн

#6 Фев. 2, 2014 07:20:02

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

функции, вложенные функции

мерсирую. такие варианты встречал в книге. но пока не совсем понял логику работы такой конструкции, в мозгу еще не отложилось
Разбирайтесь что такое декораторы и с чем их едят
Еще смотрите метод __call__ .

Офлайн

#7 Фев. 2, 2014 16:51:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

функции, вложенные функции

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]
>>>

в основном используется для создания функций для их последующей передачи куда-нибудь



Офлайн

#8 Фев. 2, 2014 18:27:29

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

функции, вложенные функции

декораторы - отдельная тема; в данном случае речь идёт про замыкания
согласен замыкание более правильно, просто декоратор как способ применения пришел первым в голову

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version