如何在python中实现静态计数器

时间:2017-01-26 15:17:52

标签: python static

我正在调用一个方法,我需要在此方法中使用静态计数器。它需要解析列表的元素。计数器将告诉列表的哪个位置要查找。

例如

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中找不到类似的东西。任何帮助将不胜感激:)

谢谢!

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:1)

按照此示例,您可以对计数器执行相同的操作:

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

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

将打印

> 1
> 2
> 3

答案 2 :(得分:0)

我实际上并不主张在你的情况下这样做,但是在函数中创建一个“静态”变量是一个鲜为人知的黑客:把它作为一个带有可变默认值的参数!您可以在函数内对其进行修改,只要调用者没有为其传递值,它就会一直保持到下一个函数调用。

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

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