2017-01-26 6 views
0

Я вызываю метод, и мне нужен статический счетчик в этом методе. Требуется проанализировать элементы списка. Счетчик скажет, в какую позицию списка искать.Как реализовать статический счетчик в python

Для например

static_var_with_position = 0 
noib_list = [3, 2, 2, 2, 2, 1, 2, 2] 

def foo(orig_output, NOB): 
    # tried two ways 

    #static_var_with_position += 1 # doesn't work 

    #global static_var_with_position 
    #static_var_with_position += 1 # doesn't work either 

    bit_required = noib_list[static_var_with_position] 
    converted_output = convert_output(orig_output, NOB, bit_required) 

Значение static_var_with_position никогда не увеличивается. Я прокомментировал два способа, которыми я пытался увеличить значение.

В C++ его кусок пирога, но до сих пор я не мог найти ничего подобного на python. Любая помощь будет оценена :)

Спасибо!

+0

вы можете вставить некоторый код, вы пробовали ... наверняка понять это что-то –

+0

я обновил Ques, надеюсь, что это делает его немного ясно – blackbug

+0

Рассматривали ли вы используя 'iterator' вместо этого? –

ответ

2

Вместо использования глобальной/статической переменной счетчика, вы могли бы использовать iterator:

iterator = iter(noib_list) 

def foo(orig_output, NOB): 
    bit_required = next(iterator) 
    converted_output = convert_output(orig_output, NOB, bit_required) 

Итератор автоматически отслеживает, что является next элемент внутри.

Когда итератор исчерпан (т.е. когда вы достигли конца списка), next поднимет ошибку StopIteration, так это вы не знаете, когда будет достигнут конец, вы можете использовать вместо bit_required = next(iterator, None); то просто проверьте, является ли значение None, и вы знаете, что список исчерпан (или просто используйте try/except).

+0

Спасибо. Это работает очень хорошо! – blackbug

1

После этого примера, вы могли бы сделать то же самое с вашим счетчиком:

def inc() : 
    global global_cpt 
    global_cpt +=1 
    print global_cpt 

if __name__ == '__main__' : 
    global_cpt = 0 
    inc() 
    inc() 
    inc() 

напечатает

> 1 
> 2 
> 3 
+0

Спасибо. Он работает, если я запускаю его, но когда я включаю то же самое в свой проект, я получаю следующую ошибку: static_var_with_position + = 1 NameError: name static_var_with_position 'не определен' Файл с основным методом вызывает 'foo (orig_output, NOB)', который внутренне calls inc() 'bit_required = noib_list [inc()]' – blackbug

+0

Обратите внимание, что если строка '+ =' находится перед строкой, которая получает значение из списка, она пропускает первое значение. –

+0

@tobias_k вы правы, это был случай. Спасибо вам обоим :) – blackbug

0

Я действительно не сторонник этого делать в вашем случае, но это малоизвестный взлом для создания «статической» переменной внутри функции: поместите ее как параметр с изменяемым значением по умолчанию! Вы можете изменить его внутри функции, и он будет удерживаться до следующего вызова функции, если вызывающий объект не передает значение для него.

def foo(value=[0]): 
    value[0] += 1 
    print(value[0]) 

>>> foo() 
1 
>>> foo() 
2 
>>> foo() 
3 
>>> foo([906]) 
907 
>>> foo() 
4 
+0

Спасибо. Мне любопытно: «Я на самом деле не выступаю за это в вашем случае».Поскольку я новичок в python, хотел бы знать о возможном недостатке или ситуациях, когда использование статической вещи не является хорошей идеей в pyhton – blackbug

+0

@blackbug все, что может смутить людей, должно быть обескуражено. Использование параметра как чего-то другого, кроме параметра, определенно путается. Что касается вашей исходной проблемы, глобальные переменные считаются плохой идеей на всех языках, потому что они являются почти невидимой формой связи. По крайней мере, мое решение держит его локальным для функции. –