每次访问变量时,如何在将结果存储在变量中后再次调用我的函数?

Posted

技术标签:

【中文标题】每次访问变量时,如何在将结果存储在变量中后再次调用我的函数?【英文标题】:How can I have my function called again after storing its result in a variable, each time the variable is accessed? 【发布时间】:2016-06-27 00:11:30 【问题描述】:

我有一个概念,我将函数返回的值存储在变量中,这对我来说更容易。

但我遇到的问题是变量中的值不是每次都动态调用函数。所以它总是返回相同的值。

我制作了一个代码片段以简单的方式说明它:

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 中,当我打印test 时,它返回相同的值,即使我正在调用函数value()。我该如何解决这个问题?我知道我可以将函数放在 while 循环中,但我想将它作为变量。

【问题讨论】:

只需将test = value() 更改为test = value @MaxU:涉及到更多。然后它会打印类似<function value at 0x63f53e> @zondo,这只是一个提示(不是完整的答案),所以它让 OP 有机会了解如何处理它 【参考方案1】:

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

在 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 的函数。

该函数由两个语句(再次没有值),一个变量赋值和一个返回语句组成。

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

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

下一条语句是另一个赋值:

test = value()

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

让我们快速回顾一下循环:

while True:
    print test
    time.sleep(10)

执行以下操作直到时间结束:

print(Python 2 中的语句,Python 3 中的表达式!)具有将内容打印到屏幕的副作用。否则它起不了多大作用。 在这种情况下,无论表达式test 的值是什么,这些东西都是如此。我们已经知道标识符test 指的是值10。它只会在屏幕上打印“10”。 睡十秒钟。 重复。

您可能希望在循环的每次迭代中调用一些函数(“invoke”基本上是拉丁语中的“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。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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)

【讨论】:

【参考方案4】:

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

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

test = value()

while True:
    print test
    time.sleep(10)

改变这一行

测试 = 值

测试 = 值()

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

【讨论】:

以上是关于每次访问变量时,如何在将结果存储在变量中后再次调用我的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Javascript变量中存储脚本url的结果

Scala:如何在循环中合并数据帧

线程之间如何调用变量

“调用 bsh 方法时出错:eval” 2 个变量的 Beanshell 断言?

扫描条形码并在将其存储在recyclerView中后从JSON中读取它

了解函数如何使用和存储变量