如何处理函数中的函数?

时间:2019-07-14 10:44:12

标签: python lambda test-environments

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

执行let typeArray = ['name', 'strret', 'car', 'type'], formDefinitionObject = { schema: {} }; /** cycle through "typeArray" and populate "formDefinitionObject.schema" **/ typeArray.forEach(el => { let currObj = { type: 'string', /** YOU DID NOT SPECIY HOW TO DECIDE THE TYPE **/ title: el[0].toUpperCase() + el.substring(1), /** the title with the first letter being capitalized as you provided in the question. You can just use "el" instead of "el[0].toUpperCase() + el.substring(1)" if you'd like to print as it is **/ }; el === 'name' && (currObj['required'] = true); /** YOU DID NOT SPECIY HOW TO DECIDE IF A FIELD HAS TO BE REQUIRED. I just saw only the "name" as required so I did a basic (yet a stupid) check if the current element is "name" add a required to it **/ formDefinitionObject.schema[el] = currObj; /** add the current record to the "schema" attribute **/ }); console.dir(formDefinitionObject); /** printing the result **/时,Python首先打印'甜菜',然后打印'甜菜'

但是,当执行cake()()时,Python只打印'sweets'

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

此外,当执行chocolate()时,Python不会打印任何值,它只会返回'cake'。

对于这些情况,我敢肯定有一个整洁的解释。希望有人能解释!

more_chocolate

3 个答案:

答案 0 :(得分:1)

where yw.year >= 2015 and yw.year < 2019

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

cake

这将调用cake()() ,它返回一个函数对象。这次,函数对象未绑定到名称。返回时,我们调用匿名函数对象。结果是从对cake的呼叫中打印出“甜菜”,而从对cake的呼叫中打印出“甜食”。 pie还返回字符串“ cake”,但该字符串未绑定或捕获。

pie
在执行chocolate() 时,

chocolate仍绑定到cake返回的功能对象上。现在,我们只是调用先前捕获的函数对象。由于我们现在实际上并未呼叫chocolate = cake()(我们仅呼叫cake),因此不会打印“甜菜”,但会打印“甜”。再次,它返回字符串“ cake”,但是再次,它没有被绑定或捕获。

pie

这会将more_chocolate, more_cake = chocolate(), cake 绑定到通过调用more_chocolate返回的对象(这是字符串“ cake”)。它还将chocolate绑定到more_cake。不知道您是否真的打算执行此操作-所有要做的就是将cake绑定到与more_cake绑定到的同一函数对象,但是您实际上并没有在这里调用任何函数。

答案 1 :(得分:0)

执行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和打印结果。

答案 2 :(得分:0)

该概念称为Currying Function。在函数式编程中,柯里化是将多个参数的函数简化为带有单个参数的简单函数的方法。

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

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

在这里,我们有一个功能饼,它将打印甜菜并返回一个功能饼。

现在,如果我们使用以下命令来调用它:

cake()()

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

如果我们执行它:

chocolate = cake()

我们只执行了一次,所以它将打印甜菜,并将返回的pie函数设置为变量 chocolate

,稍后当我们调用巧克力时,它将打印甜点,并且返回字符串 cake 。您稍后将其保存在 more_chocolate 变量中。由于它只是一个字符串文字,并且不打印任何内容,因此没有在输出中打印任何内容。

相关问题