首页 文章

Python:为什么需要通过lambda函数调用定时器函数?

提问于
浏览
2

我之前有过一次错误 . (“NoneType对象不可调用”)我找到了解决问题的方法,而不是直接调用“update”函数来通过lambda函数调用它 .

代码每秒打印一次开始时间,持续10秒,然后更新打印一次的时间 .

(这是我的更大项目的概念代码证明 . 我使用此构造来创建一个新的时间戳,在该时间戳上打开日志文件 . 而不是在第二天打开旧的日志文件,创建和使用新的日志文件每天00:00:00)

now = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
delta_t_seconds = 10

def update():
    global now
    now = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    print "Time updated"
    return

t = timer(delta_t_seconds, lambda: update())
t.start()

while (True):
    print("Time is:" + now)
    time.sleep(1)

我的问题是:为什么我必须通过lambda函数调用它?

t = timer(delta_t_seconds, lambda: update())

而不是直接:

t = timer(delta_t_seconds, update())

调用function2似乎很愚蠢,其唯一目的是调用function1 . 与直接调用function1相比 .

4 回答

  • 3

    你不需要使用lambda,你可以直接传递函数:

    t = timer(delta_t_seconds, update)
    

    通过执行 timer(delta_t_seconds, update()) (注意额外的括号),您调用 update 一次,返回 None . timer 然后尝试调用 None ,这是不可能的( None 不可调用),给你所遇到的错误 .

  • 0

    使用 t = timer(delta_t_seconds, update()) ,您将传递返回值(首先调用函数以获取它)而不是函数本身传递给 timer .

    如果要将 update 传递给 timer ,只需使用 t = timer(delta_t_seconds, update) ,则不需要使用 lambda .

  • 0

    You don't .

    update() isn 't a function, it'是对函数的调用 . 因此,它在被调用时执行更新 . 你需要传入一个函数,它将是 t = timer(delta_t_seconds, update) . 请注意 update 之后缺少的括号 .

  • 1

    显然 timer 期望第二个参数是可调用的(fx是函数),而函数 update 不返回可调用的(实际上它根本不返回任何内容 - 即 None ) . lambda是从表达式创建callable的一种方法(在调用lambda时计算表达式) . 请注意,lambda lambda: update() 等效于 update (这是一个函数对象) .

相关问题