Nikolino
@Nikolino

Замыкание в Python?

В php, как и в JavaScript можно делать счетчики с помощью замыкания.
Пример кода на php:

function counter() {
    $counter = 0;    
    return function() use (&$counter) {
        $counter++;
        return $counter;
    };
}

$a = counter();

var_dump($a()); // 1
var_dump($a()); // 2


Возможно ли сделать подобное в Python?

Такой код дает ошибку: UnboundLocalError: local variable 'counter' referenced before assignment

def counter():
    counter = 0
    
    def increase():
        counter = counter+1
        return counter
    return increase

a = counter()

print(a())
  • Вопрос задан
  • 320 просмотров
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Есть более удобные средства для этого:
def counter():
    count = 0
    while True:
        count += 1
        yield count
    
a = counter()

print(next(a))
print(next(a))
print(next(a))
print(next(a))

# 1
# 2
# 3
# 4

не говоря уже об использовании enumerate и подобных для этого...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Nikolino
@Nikolino Автор вопроса
решено через nonlocal

def counter():
    counter = 0
    
    def increase():
        nonlocal counter
        counter = counter+1
        return counter
    return increase

a = counter()

print(a()) // 1
print(a()) // 2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы