我试图理解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
这个概念叫做Currying Function。在函数式编程中,currying是一种将多参数函数简化为一个单参数函数的方法。你知道吗
要了解示例的行为,请将其分解为:
这里我们有一个函数蛋糕,它将打印甜菜并返回一个函数饼。你知道吗
现在,如果我们调用它使用:
这里我们调用了它两次,第一次执行
cake()
时,它将打印甜菜并返回饼函数,由于第二组()结果打印糖果如果我们执行它:
我们只执行了一次,所以它将打印甜菜,返回的饼函数将被设置到变量巧克力中。你知道吗
稍后,当我们调用chocolate时,它将打印糖果,并返回一个字符串cake。在以后的情况下,您可以将其保存在more\u chocolate变量中。因为它只是一个字符串文本,没有打印任何东西,所以输出上没有打印任何东西。你知道吗
这将标识符
chocolate
绑定到通过调用cake
返回的对象—它返回一个函数对象—因此,chocolate绑定到该函数对象(chocolate
绑定到函数对象pie
)。 调用cake
的副作用是打印“甜菜”。你知道吗这将调用
cake
,返回一个函数对象。这次函数对象没有绑定到名称。返回时调用匿名函数对象。结果是从对cake
的调用打印“beets”,从对pie
的调用打印“sweets”。pie
还返回字符串“cake”,但该字符串未被绑定或捕获。你知道吗chocolate
仍然绑定到执行chocolate = cake()
时cake
返回的函数对象。现在我们只需调用前面捕获的函数对象。因为我们现在实际上并没有调用cake
(我们只调用pie
),“beets”没有打印出来,但是“sweets”是打印出来的。同样,它返回字符串“cake”,但是它没有被绑定或捕获。你知道吗这将
more_chocolate
绑定到通过调用chocolate
(即字符串“cake”)返回的对象。它还将more_cake
与cake
结合。不确定您是否真的打算这么做—这只是将more_cake
绑定到cake
绑定到的同一个函数对象,但实际上您并没有在这里调用任何函数。你知道吗执行
cake()
时,将运行以下块:所以它:
beets
pie
函数定义,函数体尚未运行,因此没有打印sweets
pie
函数对象您将返回的函数对象保存为名称
chocolate
,因此它现在引用pie
函数对象。你知道吗因此,当您执行
chocolate()
时,它实际上现在运行pie()
,并执行以下操作:sweets
cake
当您执行
cake()()
时,它也会执行相同的操作,而不使用中间变量chocolate
。因此cake()()
从cake()
运行返回的函数对象,即pie
和打印。你知道吗相关问题 更多 >
编程相关推荐