Python - 将函数存储在变量中

时间:2016-03-11 16:39:51

标签: python function variables while-loop storing-data

我有一个概念,我将函数存储在变量中,这使我更容易。但我遇到的问题是变量中的值不是每次动态调用函数。所以它一直返回相同的值。为了弄清楚这个问题,我已经做了一个代码片段来简单地说明它:

def value():
        resp = requests.get('http://www.google.com').elapsed.total_seconds()
        return resp

test = value()

while True:
        print test
        time.sleep(10)

输出:

0.00649
0.00649

在这种情况下,在我打印测试的while true中,它返回相同的值,即使我正在调用函数value()。我该如何解决这个问题?我知道我可以将函数放在while循环中,但我希望将它作为变量。

4 个答案:

答案 0 :(得分:3)

test = value()没有存储它存储结果的函数。您应该在循环中调用value(),或者如果要分配函数,则在循环中分配test = value然后test()

答案 1 :(得分:2)

test = value()调用该函数并存储返回值。它不存储该功能。 test = value将存储该函数,但您需要print test()才能调用它。

def value():
        resp = requests.get('http://www.google.com').elapsed.total_seconds()
        return resp

test = value

while True:
        print test()
        time.sleep(10)

答案 2 :(得分:2)

之前的答案是正确的,但请让我详细说明。

在Python的世界中,事物具有非常精确的含义,但如果你刚开始的话,并不总是清楚是什么。

表达式是具有的内容,它们包含123some_variable10 / 2等内容。名称some_variable被称为标识符,仅仅因为它标识了一个值。就像Scruffy这个名字可能会识别你的狗一样。

语句是影响程序流程或程序状态的东西,但缺少值。以下是陈述的例子:

if x > 10:
    x -= 1

def foo(x):
    print("The value of x is", x)

与JavaScript不同,例如,几乎所有内容都是表达式(并且具有值), 不能 执行此操作:

my_function = def foo(x): print("The value of x is", x)

上一个def语句将通过名称foo创建一个函数,但该语句本身没有值。但是,名称foo将引用一个值。这意味着当你写foo时,值就是一个东西,而这个东西就是一个函数!

另一方面,表达式x()将执行 两个 的事情。首先,它将查找标识符x的值。希望这个值是一个函数。之后,括号表示该值将被调用。如果x不是函数,会发生什么?

>>> x = 10
>>> x()
Traceback (most recent call last):
  File "<ipython-input-3-7354d77c61ac>", line 1, in <module>
    x()
TypeError: 'int' object is not callable

Big Fat Error:10不是“可调用的”。可调用意味着可以像函数一样调用的东西。

正如您可能知道的那样,括号列表是一个参数列表。在这种情况下,列表只是空的,所以当你写x()时,你会说“调用'x'所指的名字,但不发送任何参数”。

函数调用总是有一个值,因为它是一个表达式。如果您没有明确地返回任何内容,则该值将只是None

为了回答你的问题,最后,让我们玩替换游戏。规则很简单,任何表达式都可以用其值替换:

def value():
    resp = requests.get('http://www.google.com').elapsed.total_seconds()
    return resp

这是一个声明,因此它没有值。但是,创建了一个名为value的函数。

该函数由两个语句(无值,再次),变量赋值和return语句组成。

=右边的东西是表达式。短篇小说:

  • requests指的是请求模块
  • get指的是上述模块中的模块全局函数
  • get('...')正在调用此函数,并返回一些内容。
  • “something”有一个名为elapsed的属性,它有一个名为total_seconds的属性。
  • total_seconds是引用可调用的标识符。调用callable时不带任何参数(total_seconds())并返回一些东西。可能是一个基于名称的数字。为简单起见,我们假设其值始终为10

下一个陈述是另一项任务:

test = value()

这可以被认为是“让名称'test'引用由名称'value'标识的callable返回的值,当使用空参数列表调用时”。在我们的例子中,将调用名为value的函数对象,resp将被赋值10,然后return语句将让调用者知道此调用是发送值10。从现在开始,名称test将引用值10

让我们快速回顾一下:

while True:
    print test
    time.sleep(10)

在时间结束前执行以下操作:

  • print(Python 2中的一个声明,Python 3中的一个表达式!)具有将内容打印到屏幕的副作用。否则它没什么用。
  • 在这种情况下,这些东西就是表达式test的值。我们已经知道标识符test指的是值10。它只会在屏幕上打印“10”。
  • 睡了十秒钟。
  • 重复。

你可能想在循环的每次迭代中调用一些函数(“invoke”基本上是latin for“call”,我喜欢花哨的单词)。否则程序将一遍又一遍地打印“10”,“10”,“10”。要解决这个问题,首先必须将作为print语句的一部分计算的表达式从标识符(test)更改为函数调用:

print test()

但是,正如我们之前看到的那样,由于10不是可调用函数,因此会引发大胖错误。要解决它(这是程序员做的,对吗?)你还需要从test更改10的值,因为它不是可调用的函数。函数可以简单地通过其名称来引用,因此只需更改此行:

test = value()  # equals ten

对此:

test = value  # equals the function called "value"

该函数现在有两个名称,旧名称“value”和新名称“test”。循环中的每个步骤将再次请求页面并返回完成请求所花费的时间。如果请求超时,您将遇到另一种崩溃,但这是另一个故事。

更多信息可在Python Language Reference

中找到

答案 3 :(得分:-1)

您可以像这样更改代码..

def value():
    resp = requests.get('http://www.google.com').elapsed.total_seconds()
    return resp

test = value()

while True:
    print test
    time.sleep(10)

改变这一行

<块引用>

测试 = 价值

<块引用>

测试 = 值()

现在意味着您将函数存储在变量中。