我试图了解以下示例中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
答案 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 变量中。由于它只是一个字符串文字,并且不打印任何内容,因此没有在输出中打印任何内容。