Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2016 18:09:03

roggerg
Зарегистрирован: 2015-03-12
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Вложенные функции

Скажите я правильно понимаю что в ситуации когда одна функция вложена в другую, то при вызове внешней функции, внутрення будет работать только если в коде будет вызов внутренней функции.
Вопрос возник после прочтения статьи о декораторах на хабре.
https://habrahabr.ru/post/141411/
При описании создания декоратора “вручную”, я не увидел в коде вызова внутреннй функции
def the_wrapper_around_the_original_function():,
только через return.
Как тогда это все работает в этом случае.

Офлайн

#2 Дек. 1, 2016 18:13:23

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вложенные функции

roggerg
При описании создания декоратора “вручную”, я не увидел в коде вызова внутреннй функции
Декоратор - это функция, которая принимает функцию и возвращает другую функцию.
Ключевое понятие - возвращает функцию. А вызываться эта функция будет тогда, когда вы будете вызывать декорируемую функцию (которая станет равна возвращаемой декоратором)



Офлайн

#3 Дек. 2, 2016 06:53:08

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

Вложенные функции

roggerg
Скажите я правильно понимаю что в ситуации когда одна функция вложена в другую, то при вызове внешней функции, внутрення будет работать только если в коде будет вызов внутренней функции.
Вложенная функция работает так же, как невложенная. Если она определена, то её надо вызвать, чтобы она сработала. А вызывается она там, где видна, а видна она только внутри функции, в которой определена.

  
>>> def f():
...     def g(x):
...         print('g')
...         return x * 2
...     print('f')
...     print(g(8))
...     print('end')
... 
>>> f()
f
g
16
end
>>>

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

Вот декоратор без каких-либо вложенных функций
  
>>> def dec(func):
...     return 1
... 
>>> @dec
... def f(x):
...     return x * 2
... 
>>> f
1
>>>

  
>>> def dec(func):
...     return lambda: 'nothing'
... 
>>> @dec
... def f(x):
...     return x * 2
... 
>>> f
<function dec.<locals>.<lambda> at 0xb73dc5cc>
>>> f()
'nothing'
>>>

  
>>> def g():
...     return 'g'
... 
>>> def dec(func):
...     return g
... 
>>> @dec
... def f(x):
...     return x * 2
... 
>>> f
<function g at 0xb75183d4>
>>> f()
'g'
>>>

  
>>> def g(x):
...     print('g')
...     return x
... 
>>> def dec(func):
...     return lambda x: g(func(x))
... 
>>> @dec
... def f(x):
...     return x * 2
... 
>>> f
<function dec.<locals>.<lambda> at 0xb74375cc>
>>> f(8)
g
16
>>> 



Отредактировано py.user.next (Дек. 2, 2016 07:05:43)

Офлайн

#4 Дек. 2, 2016 20:29:01

roggerg
Зарегистрирован: 2015-03-12
Сообщения: 61
Репутация: +  0  -
Профиль   Отправить e-mail  

Вложенные функции

Спасибо за объяснения. у мен я есть еще один вопрос
если fn это функция, то есть ли отличие между return fn и return fn()

Офлайн

#5 Дек. 3, 2016 02:02:01

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

Вложенные функции

roggerg
если fn это функция, то есть ли отличие между return fn и return fn()
fn - это имя, привязанное к объекту-функции.
Поэтому когда возвращаешь fn, ты возвращаешь объект-функцию - саму функцию без её вызова.

Пример использования функции как объекта
  
>>> f = print
>>> f('abc')
abc
>>> f('abc', 'def')
abc def
>>> f is print
True
>>> id(f)
3075392716
>>> id(print)
3075392716
>>>

  
>>> a = b = c = print
>>> a(1)
1
>>> b(1, 2, 3)
1 2 3
>>> c([1], [2])
[1] [2]
>>> print('test')
test
>>>



Отредактировано py.user.next (Дек. 4, 2016 02:15:13)

Офлайн

#6 Дек. 3, 2016 05:46:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Вложенные функции

roggerg
то есть ли отличие между return fn и return fn()
 def f():
    pass
def g():
   return f
print(g()())
вернули функцию - результат можно потом много раз вызывать

 def f():
    pass
def g():
   return f()
print(g())
вернули результат вызова функции его уже не вызовешь.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version