我有一个概念,我将函数存储在变量中,这使我更容易。但我遇到的问题是变量中的值不是每次动态调用函数。所以它一直返回相同的值。为了弄清楚这个问题,我已经做了一个代码片段来简单地说明它:
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循环中,但我希望将它作为变量。
答案 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的世界中,事物具有非常精确的含义,但如果你刚开始的话,并不总是清楚是什么。
表达式是具有值的内容,它们包含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
的函数。
该函数由两个语句(无值,再次),变量赋值和return语句组成。
=
右边的东西是表达式。短篇小说:
requests
指的是请求模块get
指的是上述模块中的模块全局函数get('...')
正在调用此函数,并返回一些内容。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)
改变这一行
<块引用>测试 = 价值
到
<块引用>测试 = 值()
现在意味着您将函数存储在变量中。