每次访问变量时,如何在将结果存储在变量中后再次调用我的函数?
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 世界中,事物具有非常精确的含义,但如果您刚刚开始,并不总是很清楚什么是什么。
表达式是具有值的事物,它们包括诸如123
、some_variable
和10 / 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)
改变这一行
测试 = 值
到
测试 = 值()
现在意味着您将函数存储在变量中。
【讨论】:
以上是关于每次访问变量时,如何在将结果存储在变量中后再次调用我的函数?的主要内容,如果未能解决你的问题,请参考以下文章
“调用 bsh 方法时出错:eval” 2 个变量的 Beanshell 断言?