为什么在下面的代码中使用return语句结尾的括号?如果我不使用括号,为什么它返回地址?

2024-10-01 04:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

示例:为什么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>

Tags: lambdadivnoneadd示例getreturndef
3条回答

试着在一些有意义的部分拆分这样的一行代码。你知道吗

def dictuse1(operator, x, y):
    # Stores mapping from operator names (strings) 
    # to op implementations (functions == lambdas)
    optable = {
        'add': lambda: x + y,
        'sub': lambda: x - y,
        'mul': lambda: x * y,
        'div': lambda: x / y,
    }

    # Define a default op
    noop = lambda: None

    # Take the function by op name
    op = optable.get(operator, noop)

    # Exectute it and return a returning value of that function.
    return op()  # remove () and you have a dictuse2 here.

dictuse1dictuse2之间唯一的区别是,最后一个返回函数而不是调用该函数的结果。你知道吗

因为在Python中一切都是对象。这包括整数、浮点数、字符串、其他类的实例、类本身函数。你知道吗

第一个函数从字典中检索一个函数或使用默认值调用它,返回调用的结果(在您的例子中是一个数字)。你知道吗

第二个函数返回函数本身。你知道吗

括号是函数调用的符号:(lambda x, y: x + y)(1, 2),例如,调用函数并返回1 + 2 == 3。如果去掉括号,就会得到一个函数对象。你知道吗

括号与return无关;它们是用来调用函数的,就像你调用函数一样。你知道吗

让我们将其分解为一种更具可读性的形式:

function_table = {
    'add': lambda: x + y,
    'sub': lambda: x - y,
    'mul': lambda: x * y,
    'div': lambda: x / y,
}

到目前为止,还不错:这只是一个将字符串映射到函数的字典,因此您可以按名称查找函数。你知道吗

default_function = lambda: None

这只是一个可以调用并返回None的函数。你知道吗

function = function_table.get(operator, default_function)

这只是在dict中查找一个值。d.get(key, default)如果该键有值,则给出d[key];如果没有值,则给出default

所以,现在function就是add函数lambda: x+y,或者默认的lambda: None,或者其他三个函数中的任何一个,但是不管是哪一个,它都是一个不带参数的函数。所以我们可以称之为。这就是括号的含义:

value = function()

现在我们只返回这个值:

return value

如果不使用括号,就不会调用函数并返回它给您的值,而只会返回它。因此,您不必返回5None,而是返回一个函数对象。如果你试着把它打印出来,也许它会说<function '<lambda>' at 0x12345788>,但它说什么其实并不重要;它告诉你的是,你要打印的东西是某个函数,它没有名字,因为你用lambda而不是def来定义它。你知道吗

相关问题 更多 >