Python:在函数内定义函数

时间:2013-11-06 23:32:11

标签: python function

我正在尝试编写一个可以定义函数的函数。

我试过了:

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"
             pass
    pass

function_writer()
new_function()

但是,我的调试器抱怨没有定义new_function,所以这显然不是这样做的。

有谁知道怎么做?

感谢。

5 个答案:

答案 0 :(得分:4)

完全的代码失败的原因与以下代码抱怨未定义i的原因相同:

def integer_writer():
    i = 0

integer_writer()
i

i是函数integer_writer中的局部变量,new_function是函数function_writer中的局部变量。

您可以执行以下操作:

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"

    return new_function

new_function = function_writer()
new_function()

在这种情况下似乎没有多大意义(正如通常没有多少定义一个总是返回0的函数),但如果function_writer要采取一些参数,如果这些参数在它返回的函数中使用,那么你就可以开展业务了。

答案 1 :(得分:2)

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"

    return new_function

fn_dynamic = function_writer()
fn_dynamic() #call new_function

也许你在寻找什么? (这几乎是装饰者所做的......除了他们修改传入的方法)

另一个解决方案(这不是一个好建议,但回答了问题)

def function_writer():
    print "I am a function writer"      
    def new_function():
        print "I am a new function"
    globals()['new_function'] = new_function

function_writer()
new_function()

在python中通常会避免使用这种类型的功能,除非你有一个非常严格的理由说明为什么这绝对是你需要的......

答案 2 :(得分:1)

当然会导致错误,因为new_function仅限于function_writer范围。

def function_writer():
    print "I am a function writer"  

    def new_function():
        print "I am a new function"
        pass

    return new_function

a = function_writer()
#output: "I am a function writer"

a()
#output: "I am a new function"

答案 3 :(得分:1)

这取决于你打算用它做什么。

  1. 您可以在函数内调用它。

    如果内部函数需要访问外部函数的局部变量,则可能就是这种情况。

  2. 您可以将其退回以便从外部进行调用。

    这很常见。 G。在装饰者的情况下。

答案 4 :(得分:1)

如果要创建函数工厂,只需返回创建的函数!

def factory():
    def new_func():
        print 'Hello!'
  return new_func

f = factory()
f()