【问题标题】:How to call multi-level nested function in Python?如何在 Python 中调用多级嵌套函数?
【发布时间】:2016-03-28 13:12:30
【问题描述】:

我正在尝试学习 Python,并且对 .r.t 对 Python 中的多级嵌套函数和函数闭包有一些疑问。请帮助我了解这是如何工作的。

以下代码中的问题:

  1. 如何从主块调用 func3 ?
  2. func3 是否可以从 func1 访问 x1 或仅从 func2 的直接封闭范围访问 x2?。

示例代码:

# File: nesteFunc.py
def func1():
    x1 = 1
    def func2():
        x2 = 2
        def func3():
            x3 = 3
            print(x1, x2, x3)
        return func3

if __name__ == "__main__":
    f = func1()
    f()            # line 14

上面的代码给了我这个错误信息:

Traceback (most recent call last):
  File "D:/Python Prep/nestedFunc", line 14, in <module>
    f()
TypeError: 'NoneType' object is not callable

Process finished with exit code 1

【问题讨论】:

  • func1 不返回函数对象,因此调用 func1() 将返回 None 到变量 f。而f() 引发 TypeError。
  • func1的底部放return func2然后你可以做f2 = func1(); f3 = f2(); f3()。或者做一些更理智的事情。
  • 不知道为什么在 Python 中需要这个,但这通常会给出非 Python 的、不可维护的代码。
  • 在 func1 末尾添加“return func2”有效。感谢您的回复。
  • 你从来没有定义一个名为f的函数,所以在最后一行你不能调用它。

标签: python function python-3.x


【解决方案1】:

func1 不返回任何内容(隐式为 None),这就是为什么你会得到异常,如果你想从主块调用 func3,只需返回 func2,调用 func2 获取 func3 然后调用它。

# File: nesteFunc.py
def func1():
    x1 = 1
    def func2():
        x2 = 2
        def func3():
            x3 = 3
            print(x1, x2, x3)
        return func3
    return func2

if __name__ == "__main__":
    f2 = func1()
    f3 = f2()
    f3()

关于您的第二个问题,是的,func3 将有权访问变量 x1 和 x2,因为它们存在于父作用域中。

【讨论】:

    【解决方案2】:

    如果只是打印 (x1, x2, x3),则不需要在 func1() 中返回 func2 或 func3。你可以这样做:

    # File: nesteFunc.py
    def func1():
        x1 = 1
        def func2():
            x2 = 2
            def func3():
                x3 = 3
                print(x1, x2, x3)
            func3()
        func2()
    
    if __name__ == "__main__":
        func1()
    

    【讨论】:

      【解决方案3】:
      def arith():
          def add(a):
              x=a+5
              print(x)
              def sub(b):
                  y=b-5
                  print(y)
                  def mul(c):
                      z=c*5
                      print(z)
                  return mul
              return sub
          return add
      arith()(10)(10)(10)
      

      【讨论】:

      • 虽然此代码可能显示了一个多级嵌套函数调用的示例,但它看起来相当复杂。您能否考虑在答案中附上有关此代码如何工作的简短说明?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 2021-08-19
      • 2015-03-18
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多