0

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

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

然而,当chocolate()被执行时,Python 只打印 'sweets'

有人可以解释这两种情况的区别吗?

同样,当more_chocolate执行时,Python 不打印任何值,它只是返回“蛋糕”。

我敢肯定这些案例有一个简洁的解释。希望有人能解释一下!

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

chocolate = cake()

cake()()

chocolate()

more_chocolate, more_cake = chocolate(), cake

more_chocolate
4

3 回答 3

1
chocolate = cake()

这将标识符绑定chocolate到调用cake返回的对象 - 它返回一个函数对象 - 因此,巧克力绑定到该函数对象(chocolate绑定到函数对象pie)。调用的副作用cake是打印“甜菜”。

cake()()

这调用cake,它返回一个函数对象。这次函数对象没有绑定名称。返回后,我们调用匿名函数对象。结果是“甜菜”从对 的调用中打印出来cake,而“糖果”从对 的调用中打印出来piepie还返回字符串“cake”,但该字符串未绑定或捕获。

chocolate()

chocolate仍然绑定到cake当我们做时返回的函数对象chocolate = cake()。现在我们只是调用我们之前捕获的函数对象。由于我们现在实际上并没有调用cake(我们只是调用pie),因此不会打印“beets”,但会打印“sweets”。同样,这将返回字符串“cake”,但同样,它没有被绑定或捕获。

more_chocolate, more_cake = chocolate(), cake

this 绑定more_chocolate到调用返回的对象chocolate(即字符串“cake”)。它还绑定more_cakecake. 不确定您是否真的打算这样做 - 所有这一切都是绑定到绑定more_cake到的同一个函数对象cake,但您实际上并没有在这里调用任何函数。

于 2019-07-14T10:59:00.263 回答
0

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

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

所以:

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

您将返回的函数对象保存为 name chocolate,因此它现在引用pie函数对象。

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

  • 印刷sweets
  • 返回字符串cake

当你这样做时cake()(),它也会在不使用中间变量的情况下做同样的事情chocolate。所以cake()()cake()ie运行返回的函数对象pie和打印。

于 2019-07-14T10:56:04.107 回答
0

这个概念被称为柯里化函数。在函数式编程中,柯里化是将多参数函数简化为具有单个参数的更简单函数的方法。

要了解您的示例的行为,请对其进行分解:

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

这里我们有一个函数 cake,它将打印beets并返回一个函数 pie。

现在,如果我们使用以下方法调用它:

cake()()

这里我们调用了它两次,第一次是什么时候cake()执行,它会打印beets并返回pie 函数,由于第二组()结果打印了糖果,它会立即被调用

而如果我们执行它:

chocolate = cake()

我们只执行了一次,所以它会打印beets并且返回的 pie 函数将被设置到变量Chocolate中。

稍后当我们调用巧克力时,它会打印糖果,它还会返回一个字符串cake。您在以后的情况下将其保存在more_chocolate变量中。因为它只是一个字符串文字并且没有打印任何东西,所以没有任何东西打印在输出上。

于 2019-07-14T11:23:13.657 回答