【问题标题】:How does Python take in an expression as a parameter to a function?Python 如何将表达式作为函数的参数?
【发布时间】:2013-09-02 03:52:03
【问题描述】:

在 IDLE GUI 中测试代码时,我正在查看 Python 中的一个严重性能问题。

对于递归函数:

def f(input1,input2):
    newinput1 = g(input1,input2);
    return f(newinput1,input2)

如果我调用函数 f(20,A+10) ,其中 A 是一个常数,那么每次递归调用 f() 是否将 input2 = "A+10" 作为重新解释的字符串,得到一个需要的表达式重新计算,还是得到一个A+10的结果?

我在帮助文件中找到了这个,但需要更明确的定义才能理解:

“抽象倾向于创建间接并迫使解释器工作更多。如果间接级别超过完成的有用工作量,您的程序将变慢。您应该避免过度抽象,尤其是在微小的函数或方法(这也常常不利于可读性)。”

Python 到底发生了什么?

【问题讨论】:

  • 尝试用您的示例输入写下重复。
  • @PhillipCloud:他不是在“抱怨抽象”。这是他为了理解问题而阅读的一段话。
  • @user2357112 啊,我的错。感谢您指出这一点。

标签: python performance function interpreter python-idle


【解决方案1】:

当你如下调用函数时:

f(20, A+10)

Python 评估 2020A+10 到任何结果。假设A 当前是20,所以A+10 等于30。在调用f 的环境中,名称input1input2 然后绑定到值2030。当使用该值时,Python 不需要重新评估A+10,并且它不会记录任何关于如何获得值30 的信息。特别是,如果您调用

f(20, A)

input2 将绑定到A 的当前值,但不会保留与A 的任何联系。在f 中重新分配input2 不会影响A

【讨论】:

  • 谢谢,如果 input2 是作为 f(20,input2=A+10) 传递的可选参数,这会改变什么吗?
  • @Jason:不。 (切题:如果您为参数定义了一个默认值的函数,则默认值的表达式仅在定义函数时计算一次。这意味着如果默认值是一个列表,则所有使用默认值共享一个列表。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
相关资源
最近更新 更多