如何处理函数中的函数?

2024-04-26 10:56:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解Python如何处理以下示例中的代码:

执行cake()()时,Python首先打印“beets”,然后打印“sweets”

但是,当执行chocolate()时,Python只打印“sweets”

有人能解释一下这两种情况的区别吗?你知道吗

同样,当执行more_chocolate时,Python不打印任何值,它只返回“cake”。你知道吗

我相信这些案子有一个合理的解释。希望有人能解释!你知道吗

def cake():
    print('beets')
    def pie():
        print('sweets')
        return 'cake'
    return pie

chocolate = cake()

cake()()

chocolate()

more_chocolate, more_cake = chocolate(), cake

more_chocolate

Tags: 代码示例returndefmore情况printcake
3条回答

这个概念叫做Currying Function。在函数式编程中,currying是一种将多参数函数简化为一个单参数函数的方法。你知道吗

要了解示例的行为,请将其分解为:

def cake():
    print('beets')
    def pie():
        print('sweets')
        return 'cake'
    return pie

这里我们有一个函数蛋糕,它将打印甜菜并返回一个函数饼。你知道吗

现在,如果我们调用它使用:

cake()()

这里我们调用了它两次,第一次执行cake()时,它将打印甜菜并返回饼函数,由于第二组()结果打印糖果

如果我们执行它:

chocolate = cake()

我们只执行了一次,所以它将打印甜菜,返回的饼函数将被设置到变量巧克力中。你知道吗

稍后,当我们调用chocolate时,它将打印糖果,并返回一个字符串cake。在以后的情况下,您可以将其保存在more\u chocolate变量中。因为它只是一个字符串文本,没有打印任何东西,所以输出上没有打印任何东西。你知道吗

chocolate = cake()

这将标识符chocolate绑定到通过调用cake返回的对象—它返回一个函数对象—因此,chocolate绑定到该函数对象(chocolate绑定到函数对象pie)。 调用cake的副作用是打印“甜菜”。你知道吗

cake()()

这将调用cake,返回一个函数对象。这次函数对象没有绑定到名称。返回时调用匿名函数对象。结果是从对cake的调用打印“beets”,从对pie的调用打印“sweets”。pie还返回字符串“cake”,但该字符串未被绑定或捕获。你知道吗

chocolate()

chocolate仍然绑定到执行chocolate = cake()cake返回的函数对象。现在我们只需调用前面捕获的函数对象。因为我们现在实际上并没有调用cake(我们只调用pie),“beets”没有打印出来,但是“sweets”是打印出来的。同样,它返回字符串“cake”,但是它没有被绑定或捕获。你知道吗

more_chocolate, more_cake = chocolate(), cake

这将more_chocolate绑定到通过调用chocolate(即字符串“cake”)返回的对象。它还将more_cakecake结合。不确定您是否真的打算这么做—这只是将more_cake绑定到cake绑定到的同一个函数对象,但实际上您并没有在这里调用任何函数。你知道吗

执行cake()时,将运行以下块:

print('beets')
def pie():
    print('sweets')
    return 'cake'
return pie

所以它:

  • 打印beets
  • 执行pie函数定义,函数体尚未运行,因此没有打印sweets
  • 返回pie函数对象

您将返回的函数对象保存为名称chocolate,因此它现在引用pie函数对象。你知道吗

因此,当您执行chocolate()时,它实际上现在运行pie(),并执行以下操作:

  • 打印sweets
  • 返回字符串cake

当您执行cake()()时,它也会执行相同的操作,而不使用中间变量chocolate。因此cake()()cake()运行返回的函数对象,即pie和打印。你知道吗

相关问题 更多 >