Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
07 Июл 2023
2 мин
1033

Использование статических переменных в функциях в Python

Часто разработчики, привыкшие к таким языкам программирования как C/C++, сталкиваются с необходимостью использовать статические переменные внутри

Часто разработчики, привыкшие к таким языкам программирования как C/C++, сталкиваются с необходимостью использовать статические переменные внутри функций при переходе на Python. В C/C++ статическая переменная внутри функции сохраняет свое значение между вызовами функции, что может быть очень полезно.

Возьмем в качестве примера следующий код на C++:

void foo()
{
    static int counter = 0;
    counter++;
    cout << "counter is " << counter << endl;
}

В этом коде переменная counter увеличивается на 1 при каждом вызове функции foo(), и значение counter сохраняется между вызовами.

Реализация статических переменных в Python

В Python нет прямого аналога статическим переменным в функциях, как в C/C++. Однако, есть несколько способов реализовать подобное поведение.

Использование атрибутов функции

Один из способов — использовать атрибуты функции. В Python функции — это объекты, и у них могут быть атрибуты. Вот пример кода, который демонстрирует это:

def foo():
    if not hasattr(foo, "counter"):
        foo.counter = 0
    foo.counter += 1
    print("counter is", foo.counter)

В этом коде foo.counter является атрибутом функции foo. При первом вызове функции атрибут counter инициализируется значением 0, а затем при каждом вызове функции foo значение counter увеличивается на 1.

Использование генераторов

Другой способ — использовать генераторы. Генераторы в Python — это специальный тип функций, которые сохраняют свое состояние между вызовами. Вот пример кода, который демонстрирует это:

def foo():
    counter = 0
    while True:
        yield counter
        counter += 1

f = foo()
for _ in range(5):
    print("counter is", next(f))

В этом коде foo — это генератор, который при каждом вызове функции next возвращает значение counter и затем увеличивает его на 1.

Использование замыканий

Третий способ — использовать замыкания. Замыкание в Python — это функция, которая имеет доступ к переменным из своей области видимости, даже после того, как эта область видимости исчезла. Вот пример кода, который демонстрирует это:

def foo():
    counter = [0]
    def inner():
        counter[0] += 1
        print("counter is", counter[0])
    return inner

f = foo()
for _ in range(5):
    f()

В этом коде foo возвращает функцию inner, которая имеет доступ к переменной counter из области видимости функции foo. При каждом вызове функции f (которая теперь ссылается на inner) значение counter увеличивается на 1.

Добавить комментарий