Введение в язык Питон


Замыкание - часть 2


    #--------- Python session showing cargo variable --------#

    >>> def a(n):

    ...     add7 = b(n)

    ...     return add7

    ...

    >>> def b(n):

    ...     i = 7

    ...     j = c(i,n)

    ...     return j

    ...

    >>> def c(i,n):

    ...     return i+n

    ...

    >>> a(10)     # Pass cargo value for use downstream

    17

В этом примере, параметр n в пределах функции b() нужен только для того, чтобы быть доступным для передачи в c().

Другое возможное решение - использование глобальных переменных:

    #--- Сессия Python, показывающая использование глобальной переменной ---#

    >>> N = 10

    >>> def addN(i):

    ...     global N

    ...     return i+N

    ...

    >>> addN(7)   # Добавить глобальную переменную N к аргументу

    17

    >>> N = 20

    >>> addN(6)   # Добавить глобальную переменную N к аргументу

    26

Глобальная переменная доступна в любой момент, где бы вы ни вызывали addN(), при этом вовсе не обязательно явно передавать фоновый контекст .

Несколько более "питоновская" техника - "заморозить" переменную в функции, используя для этого значение параметра по умолчанию во время определения функции:

    #-------- Сессия Python, иллюстрирующая замороженную переменную --------#

    >>> N = 10

    >>> def addN(i, n=N):

    ...     return i+n

    ...

    >>> addN(5)   # Добавить 10

    15

    >>> N = 20

    >>> addN(6)   # Добавить 10 (текущее значение N не играет роли)

    16

Замороженная нами переменная, в сущности, замыкание. Некие данные прикреплены к функции addN(). В случае полного

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


Начало  Назад  Вперед



Книжный магазин