繁体   English   中英

Python - 将函数存储在变量中

[英]Python - Store function in variable

我有一个概念,我将函数存储在变量中,这对我来说更容易。 但是我遇到的问题是变量中的值不是每次都动态调用函数。 所以它一直返回相同的值。 为了弄清楚这个问题,我做了一个代码片段来以简单的方式说明它:

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

在这种情况下,当我打印 test 时while true返回相同的值,即使我正在调用函数value() 我该如何解决这个问题? 我知道我可以把这个函数放在 while 循环中,但我想把它作为一个变量。

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)

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

在Python的世界中,事物具有非常精确的含义,但是如果您刚开始使用,它并不总是很清楚。

表达式是东西,有一个 ,并且它们包括像123some_variable10 / 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语言参考》中找到更多信息。

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

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

test = value()

while True:
    print test
    time.sleep(10)

改变这一行

测试 = 值

测试 = 值()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM