难以理解Python中的嵌套函数

时间:2014-11-23 01:05:07

标签: python function

我仍在尝试理解Python的基础知识,并试图弄清楚如何在内部函数y中将值附加到action2

def outer(n):
def action(x):
    return x ** n
    def action2(y):
        return x/n
    return action2
return action

f = outer(2) #We are actually setting the n in action here
print(f)
print(f(5)) #We are now setting the x parameter in the inner function action 
print(f(4))

g = outer(3)
print(g(3))

print(f(3) 

由于

2 个答案:

答案 0 :(得分:1)

这样嵌套函数的通常原因是函数修饰。几个月前我问a question,其中一个答案似乎几乎完全符合你的用例。基本上你正在尝试这样做:

def outer(n):
    def action(x):
        def action2(y):
            return x**n / y
        return action2
    return action

这是一种奇怪的方式

def action(n, x, y):
    return x**n / y

但我们会用它滚动。在任何情况下,让我们回到我们的规范函数装饰器,看看它是如何比较的。

def decorator(func):
    def wrapped(*args, **kwargs):
        print("Calling inner function")
        return func(*args, **kwargs)
    return wrapped

@decorator
def foo(some_txt):
    print("Hello, ", some_txt)

# EXAMPLE OUTPUT
>>> foo("World!")
Calling inner function
Hello, World!

这是你想要做的事情的一层太浅。如果我们回到之前链接的问题,我们将讨论验证器。

max_len_12 = lambda n: len(n) <= 12 # 12 character max field length

def validation(v):
    """ensures the result of func passes a validation defined by v"""
    def outer(func):
        def inner(*args, **kwargs):
            while True:
                result = func(*args, **kwargs)
                # if validation passes
                if v(result):
                    return result
        return inner
    return outer

@validation(max_len_12)
def valid_input(prompt):
    return input(prompt)

# EXAMPLE
>>> valid_input("Enter your name (max 12 chars): ")
Enter your name (max 12 chars): Adam YouBetYourAss Smith
Enter your name (max 12 chars): Adam Smith
'Adam Smith'

或者更容易:

valid_input = validation(max_len_12)(raw_input)
# same as previous function

因为很难确切地知道你试图用你的示例代码做什么,所以希望这能让你在装饰器和闭包时站稳脚跟。请注意,为了使您的功能更加内向,您需要做的事情遍布整个世界,其中大部分都可以由functools.wraps

来处理。

答案 1 :(得分:0)

我假设您正在努力完成以下任务:

def outer(n):
    def action(x):
        def action2(y):
            return x ** n / y
        return action2
    return action

现在,您的测试命令给出:

>>> f = outer(2)
>>> print f
<function action at 0x7f59b872e578>
>>> print f(5)
<function action2 at 0x7f59b872e5f0>
>>> print f(4)
<function action2 at 0x7f59b872e5f0>

f是你的外部“闭包”,它本身就是一个“工厂”函数,返回你的内部闭包。

>>> g = outer(3)
>>> print g(3)
<function action2 at 0x7f59b872e668>

您现在有两个完全独立的功能fg

>>> print f(3)
<function action2 at 0x7f59b872e668>

...您可以像以前一样继续使用f,这可能不是您打算做的。

你可以像这样调用内部闭包:

>>> f5 = f(5)
>>> print f5(10.)
2.5

或者您可以完全跳过变量:

>>> outer(3)(10)(2)
500