在python中计算函数的条目数

在python中计算函数的条目数,python,counter,Python,Counter,我是python新手。这似乎不太明显,但我想知道python中是否有更简单的方法来实现这一点 我正在尝试计算函数的条目数。要求如下: 每5秒触发一个计时器事件,通过该事件触发回调(ev_5ms()) 等待20秒,然后清除计数器并重新开始 我正在使用以下代码 counter = 0 "Callback" def ev_5s(): if counter < 4: counter += 1 else counter = 0 print('Send Message')

我是python新手。这似乎不太明显,但我想知道python中是否有更简单的方法来实现这一点

我正在尝试计算函数的条目数。要求如下:

  • 每5秒触发一个计时器事件,通过该事件触发回调(ev_5ms())
  • 等待20秒,然后清除计数器并重新开始
我正在使用以下代码

counter = 0

"Callback"
def ev_5s():
if counter < 4:
    counter += 1
else
    counter = 0
    print('Send Message')

t = EventGenerator.TimerEventGenerator(1, ev_1s())
t.start()
计数器=0
“回调”
定义ev_5s():
如果计数器<4:
计数器+=1
其他的
计数器=0
打印('发送消息')
t=EventGenerator.TimerEventGenerator(1,ev_1s())
t、 开始()
错误回溯:

Traceback (most recent call last):
File "C:/Users/i8479/Desktop/Python/HPP_SM.py", line 28, in <module>
t = EventGenerator.TimerEventGenerator(1, ev_1s())
File "C:/Users/i8479/Desktop/Python/HPP_SM.py", line 21, in ev_1s
if counter < 4:
UnboundLocalError: local variable 'counter' referenced before assignment
回溯(最近一次呼叫最后一次):
文件“C:/Users/i8479/Desktop/Python/HPP_SM.py”,第28行,在
t=EventGenerator.TimerEventGenerator(1,ev_1s())
文件“C:/Users/i8479/Desktop/Python/HPP_SM.py”,第21行,在ev_1s中
如果计数器<4:
UnboundLocalError:赋值前引用的局部变量“counter”

我像在c或cpp中一样编写代码。如何在python中实现这一点?

解决方案之一是
global

counter = 0

# Callback
def ev_5s():
    global counter
    if counter < 4:
        counter += 1
    else
        counter = 0
        print('Send Message')

t = EventGenerator.TimerEventGenerator(1, ev_1s())
t.start()
计数器=0
#回拨
定义ev_5s():
全局计数器
如果计数器<4:
计数器+=1
其他的
计数器=0
打印('发送消息')
t=EventGenerator.TimerEventGenerator(1,ev_1s())
t、 开始()

这意味着您正在将变量计数器传递到函数中

换行

def ev_5s(counter):
t = EventGenerator.TimerEventGenerator(1, ev_1s(counter))
要换的其他线路

def ev_5s(counter):
t = EventGenerator.TimerEventGenerator(1, ev_1s(counter))

python的方法是使用decorator类,例如:

from functools import wraps
import time

class EventCounter(object):
  def __init__(self, reset_span):
    self.reset_span = reset_span
    self.running = False
    self.start_t = None
    self.counter = 0
  def __call__(self, f):
    @wraps(f)
    def wrapper(*args, **kwargs):
      if not self.running:
        self.start_t = time.time()
        self.counter += 1
        self.running = True
      elif (time.time() - self.start_t) > self.reset_span:
        self.start_t = time.time()
        self.counter = 0
      else:
        self.counter += 1
      print(f"Counter: {self.counter}")
      return f(*args, **kwargs)
    return wrapper


@EventCounter(2)
def foo():
  print("Foo")
运行:

for _ in range(5):
  foo()
  time.sleep(1)
结果:

Counter: 1
Foo
Counter: 2
Foo
Counter: 0
Foo
Counter: 1
Foo
Counter: 0
Foo

在这里,您可以在函数中使用
全局计数器来引用计数器变量。无论如何,这不是一个好的做法