如何在Python中调用多级嵌套函数?

时间:2016-03-28 13:12:30

标签: python function python-3.x

我正在尝试学习Python,并且很少怀疑.r.t到Python中的多级嵌套函数和函数闭包。请帮助我了解这将如何运作。

以下代码中的问题:

  1. 如何从主块调用func3?
  2. func3可以从func1访问x1,还是从func2的直接封闭范围访问x2。
  3. 示例代码:

    # 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
    

2 个答案:

答案 0 :(得分:6)

func1没有返回任何内容(隐式为None),这就是你得到异常的原因,如果你想从main块调用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,因为它们存在于父范围内。

答案 1 :(得分:0)

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

# 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()