Имитация статических переменных в python с помощью замыканий - PullRequest
1 голос
/ 18 ноября 2011

Можно ли написать на python функцию, которая принимает аргумент a и печатает результат h + a, где h - локальная переменная.Тогда он должен вернуться сам, с h, увеличенным на единицу.

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

В Python 3 вы можете сделать это:

>>> def f(a):
...     h = 1
...     def inner():
...             nonlocal h
...             print(a+h)
...             h += 1
...             return inner
...     return inner
... 
>>> g = f(3)  
>>> g = g()
4
>>> g = g()
5 
>>> g = g()
6
>>> g()()()
7 
8
9
<function inner at 0xb71bcd6c>

Предыдущие версии требовали подделки:

>>> def f(a):
...     h = [1]
...     def inner():
...             print a + h[0]
...             h[0] += 1
...             return inner
...     return inner
... 
>>> f(3)()()()
4  
5
6
<function inner at 0x10041f050>
>>> 

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

2 голосов
/ 18 ноября 2011

Да, вы можете

def f(a):
    def inner(h, a):
        print h+a
        return lambda (x): inner(h+1, x)
    return inner(1, a)

пример

g = f(0) # +1
g = g(0) # +2
g = g(0) # +3

f(0) # +1
g(0) # +4
g(0) # +4

печать

1
2
3
1
4
4

1010 * что и требовалось доказать *

...