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

时间:2015-07-23 09:01:13

标签: python timer lambda

我之前有过一次错误。 (" NoneType对象不可调用") 我找到了解决问题的方法,而不是调用"更新"直接通过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 个答案:

答案 0 :(得分:3)

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

t = timer(delta_t_seconds, update)

通过执行timer(delta_t_seconds, update())(请注意额外的括号),您只需拨打update一次,然后返回Nonetimer然后尝试调用None,这是不可能的(None不可调用),为您提供遇到的错误。

答案 1 :(得分:1)

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

如果您想将update传递给timer,只需使用t = timer(delta_t_seconds, update)即可,您无需使用lambda

答案 2 :(得分:0)

你不

update()不是函数,它是对函数的调用。因此,它在被调用时执行更新。您需要传入一个函数t = timer(delta_t_seconds, update)。请注意update之后缺少的括号。

答案 3 :(得分:0)

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