Вложенная функция Python

Я наткнулся на этот интересный код

# Define echo
def echo(n):
    """Return the inner_echo function."""

    # Define inner_echo
    def inner_echo(word1):
        """Concatenate n copies of word1."""
        echo_word = word1 * n
        return echo_word

    # Return inner_echo
    return inner_echo


# Call echo: twice
twice = echo(2)

# Call echo: thrice
thrice = echo(3)

# Call twice() and thrice() then print
print(twice('hello'), thrice('hello'))

выход :

привет привет привет привет

Но я не могу понять, как это работает, так как функции дважды и трижды вызывают функцию echo и предоставляют значение n, как передано ли значение слова1?


person argo    schedule 27.11.2017    source источник
comment
Первая эхо-функция инициализируется, как класс, если вы уже знакомы с классом. Эта конструкция похожа на то, что вы инициализируете основную функцию, чем вы можете передать значение внутренним методам. Например. в JavaScript нет надлежащих классов (не создается новый тип, такой как String) — на самом деле это функции, содержащие другие функции.   -  person Zydnar    schedule 27.11.2017
comment
То, на что вы смотрите, называется замыканием. Когда я впервые столкнулся с этой концепцией, у меня были проблемы с ее пониманием, но как только вы узнаете термин, вы можете найти его и прочитать несколько вещей, чтобы понять. Они есть на многих языках, вот ссылка, которая неплохо объясняет это: stackoverflow.com/a/7464475/1468125   -  person Gavin    schedule 27.11.2017


Ответы (4)


echo — это функция, которая принимает параметр n и возвращает другую функцию, которая закрывается при указанном значении n, а также принимает аргумент word1.

Другими словами, вызов echo(n) для некоторого n возвращает функцию, которая затем вызывается с twice(word1)

Поток по сути.

echo = function (n) -> function (word1) with closure (n) -> word1 repeated n times

twice = echo (2) -> function (word1) with closure (n = 2) -> word1 repeated 2 times

twice('hello') -> 'hello' repeated 2 times

Я описал это вышеописанным образом, потому что AFAICT Python не имеет синтаксиса для выражения типов функций.

person Aluan Haddad    schedule 27.11.2017

Функция эха возвращает другую функцию, для которой n установлено то, что вы ей передаете. Когда вы вызываете inner_echo (т. е. возвращаете эхо), он сохраняет область видимости, заданную при создании.

В вашем примере twice создается с использованием echo(2), который возвращает функцию inner_echo, которая в своей области видимости n имеет значение 2.

Аналогично, thrice, созданный echo(3), создает новую версию inner_echo, где n устанавливается на 3.

Помните, как echo возвращает функцию? Когда вы вызываете twice или thrice, вы вызываете функцию, которую echo возвратил, то есть вы вообще не вызываете echo. Следовательно, вызов twice является вызовом inner_echo, и именно так заполняется word.

person Shadow    schedule 27.11.2017

Когда вы вызываете echo со значением 2 в twice = echo(2) , значение 2 сохраняется внутри. Поэтому, когда мы вызываем дважды («привет»), он запоминает значение n и печатает его столько раз. Когда вы передаете 3 той же функции, что и thrice = echo(3) , она сохраняет значение 3 внутри.

Итак, в основном это создание экземпляров с разными значениями n. Надеюсь, вы поняли.

Попробуйте передать его twice = echo(2), а затем twice = echo(3) . В этом случае он обновит значение n.

person Sumit S Chawla    schedule 27.11.2017

Приведенный выше пример является примером замыкания функций.

Лучше вы можете сослаться на эту ссылку Закрытие функции в Python

person Sanket    schedule 27.11.2017
comment
Не просто публикуйте ссылку на документы, а цитируйте что-то актуальное для потомков. - person Aluan Haddad; 27.11.2017
comment
Моя цель опубликовать ссылку заключалась в том, что сначала он попытается понять концепцию закрытия функции и попытается отладить приведенный выше пример, для него это станет легко и хорошо для него @AluanHaddad - person Sanket; 27.11.2017
comment
Хорошая идея, но это был бы комментарий, а не ответ, вот и все. Это ничего не добавляет в качестве ответа. Но добавление ссылок на документы в ваш ответ — это здорово. - person Aluan Haddad; 27.11.2017