Skip to main content
 首页 » 编程设计

python之Python-将函数存储在变量中

2025年05月04日13myhome

我有一个将函数存储在变量中的概念,这对我来说比较容易。但是我有一个问题,变量中的值不是每次都动态地调用函数。因此,它始终会返回相同的值。为了解决这个问题,我做了一个代码片段,以一种简单的方式进行说明:

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循环中,但是我想将其作为变量。

请您参考如下方法:

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

在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中的几乎所有内容都是表达式(并具有值)的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 


大胖错误:10不是“ callable”。可调用是指可以像函数一样调用的东西。

如您所知,括号是参数列表。在这种情况下,列表只是空的,所以当您写 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'标识的可调用对象在使用空参数列表进行调用时所返回的值”。在我们的例子中,将调用名为 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中找到更多信息。