2 python variables function 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)
Run Code Online (Sandbox Code Playgroud)
输出:
0.00649
0.00649
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在while true我打印测试时,它返回相同的值,即使我正在调用函数value()。我该如何解决这个问题?我知道我可以把这个函数放在 while 循环中,但我想把它作为一个变量。
And*_*zlo 10
前面的答案是正确的,但请让我详细说明。
在 Python 世界中,事物具有非常精确的含义,但如果您刚刚开始,并不总是清楚什么是什么。
表达式是具有值的东西,它们包括诸如123、some_variable和 之类的东西10 / 2。该名称some_variable称为标识符,仅仅因为它标识了一个值。就像 Scruffy 这个名字可能会识别你的狗一样。
语句是影响程序流程或程序状态但缺乏价值的事物。以下是语句示例:
if x > 10:
x -= 1
Run Code Online (Sandbox Code Playgroud)
和
def foo(x):
print("The value of x is", x)
Run Code Online (Sandbox Code Playgroud)
例如,不像在 JavaScript 中,几乎所有东西都是一个表达式(并且有一个值),你不能这样做:
my_function = def foo(x): print("The value of x is", x)
Run Code Online (Sandbox Code Playgroud)
前面的def语句将创建一个名为 name 的函数foo,但语句本身没有值。但是,名称foo将引用一个值。意思是你写的时候foo,值会是一个东西,这个东西就是一个函数!
x()另一方面,表达式会做两件事。首先它将查找 identifier 的值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
Run Code Online (Sandbox Code Playgroud)
大错误:10 不是“可调用的”。Callable 意味着可以像函数一样调用的东西。
正如您可能知道的那样,括号是一个参数列表。在这种情况下,列表只是空的,所以当你写的时候,x()你是在说“调用任何名称 'x' 所指的名字,但不要发送任何参数”。
函数调用总是有一个值,因为它是一个表达式。如果您没有明确返回任何内容,则该值将只是None.
回答你的问题,最后我们来玩换人游戏。规则很简单,任何表达式都可以用它的值替换:
def value():
resp = requests.get('http://www.google.com').elapsed.total_seconds()
return resp
Run Code Online (Sandbox Code Playgroud)
这是一个声明,所以它没有价值。value但是,创建了一个名为 的函数。
该函数由两个语句(再次无值)组成,一个变量赋值和一个返回语句。
然而,右边的东西=是一个表达式。短篇故事:
requests 指的是请求模块get 指的是上述模块中的模块全局函数get('...') 正在调用这个函数,并且返回了一些东西。elapsed,该属性有一个名为 的属性total_seconds。total_seconds是引用可调用对象的标识符。callable 在没有任何参数的情况下被调用 ( total_seconds()) 并返回一些东西。根据名称,可能是一个数字。10为简单起见,假设它的值始终为 。下一个语句是另一个赋值:
test = value()
Run Code Online (Sandbox Code Playgroud)
这可以被认为是“让名称 'test' 引用由名称 'value' 标识的可调用对象在使用空参数列表调用时返回的值”。在我们的例子中,value被调用的函数对象将被调用,resp将被赋值10,然后return语句会让调用者知道这个调用正在发送值10。名称test将引用值10从现在开始,。
让我们快速回顾一下循环:
while True:
print test
time.sleep(10)
Run Code Online (Sandbox Code Playgroud)
执行以下操作直到时间结束:
print(Python 2 中的语句,Python 3 中的表达式!)具有将内容打印到屏幕的副作用。否则它没有多大作用。test。我们已经知道标识符test指的是值10。它只会在屏幕上打印“10”。您可能希望在循环的每次迭代中调用某个函数(“invoke”基本上是拉丁语“call”的意思,我喜欢花哨的词)。否则,程序将一遍又一遍地打印“10”、“10”、“10”。要解决此问题,您首先必须将作为print语句一部分求值的表达式从仅标识符 ( test) 更改为函数调用:
print test()
Run Code Online (Sandbox Code Playgroud)
但是,正如我们之前看到的,这将引发一个 Big Fat Error,因为10它不是一个可调用的函数。要修复它(这就是程序员所做的,对吗?)您还需要将testfrom的值更改为函数10,因为它不是可调用的。一个函数可以简单地通过它的名字来引用,所以只需更改这一行:
test = value() # equals ten
Run Code Online (Sandbox Code Playgroud)
对此:
test = value # equals the function called "value"
Run Code Online (Sandbox Code Playgroud)
该函数现在有两个名称,旧名称“value”和新名称“test”。循环中的每一步都会再次请求页面并返回完成请求所需的新时间。如果请求超时,您将遇到不同类型的崩溃,但那是另一回事。
更多信息可以在Python 语言参考 中找到。
test = value()不是存储函数而是存储结果。你应该只value()在你的循环中调用,或者如果你想分配它将会是的函数test = value,然后test()在你的循环中。
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)
Run Code Online (Sandbox Code Playgroud)