示例:为什么dictuse1返回值而dictuse2返回地址如下所示
def dictuse1(operator,x,y):
return{
'add':lambda:x + y,
'sub':lambda:x - y,
'mul':lambda:x * y,
'div':lambda:x / y,
}.get(operator,lambda:None)()
def dictuse2(operator,x,y):
return{
'add':lambda:x + y,
'sub':lambda:x - y,
'mul':lambda:x * y,
'div':lambda:x / y,
}.get(operator,lambda:None) #No parentheses here compared to previous function
d = dictuse1('add',8,9)
print(d) #return 17
a = dictuse2('a',5,4)
print(a) #returns:<function dictuse.<locals>.<lambda> at 0x7f30d23f3ea0>
试着在一些有意义的部分拆分这样的一行代码。你知道吗
dictuse1
和dictuse2
之间唯一的区别是,最后一个返回函数而不是调用该函数的结果。你知道吗因为在Python中一切都是对象。这包括整数、浮点数、字符串、其他类的实例、类本身和函数。你知道吗
第一个函数从字典中检索一个函数或使用默认值调用它,返回调用的结果(在您的例子中是一个数字)。你知道吗
第二个函数返回函数本身。你知道吗
括号是函数调用的符号:
(lambda x, y: x + y)(1, 2)
,例如,调用函数并返回1 + 2 == 3
。如果去掉括号,就会得到一个函数对象。你知道吗括号与
return
无关;它们是用来调用函数的,就像你调用函数一样。你知道吗让我们将其分解为一种更具可读性的形式:
到目前为止,还不错:这只是一个将字符串映射到函数的字典,因此您可以按名称查找函数。你知道吗
这只是一个可以调用并返回
None
的函数。你知道吗这只是在dict中查找一个值。
d.get(key, default)
如果该键有值,则给出d[key]
;如果没有值,则给出default
所以,现在
function
就是add
函数lambda: x+y
,或者默认的lambda: None
,或者其他三个函数中的任何一个,但是不管是哪一个,它都是一个不带参数的函数。所以我们可以称之为。这就是括号的含义:现在我们只返回这个值:
如果不使用括号,就不会调用函数并返回它给您的值,而只会返回它。因此,您不必返回
5
或None
,而是返回一个函数对象。如果你试着把它打印出来,也许它会说<function '<lambda>' at 0x12345788>
,但它说什么其实并不重要;它告诉你的是,你要打印的东西是某个函数,它没有名字,因为你用lambda
而不是def
来定义它。你知道吗相关问题 更多 >
编程相关推荐