defaultdict,functions和lambdas

时间:2015-09-16 18:45:42

标签: python lambda

我一直在玩默认字典而且我很困惑

为什么这不起作用:

示例1

def hi(name):
    return "hi " + name

a = defaultdict(hi)
print(a["hello"]("jane"))

输出示例1

TypeError: hi() missing 1 required positional argument: 'name'

但这样做:

示例2

def hi(name):
        return "hi " + name

a = {"hello":hi}
print(a["hello"]("jane"))

输出示例2

hi jane

也使用lambda会使它工作

示例3

def hi(name):
    return "hi " + name

a = defaultdict(lambda: hi)
print(a["hello"]("jane"))

输出示例 3

hi jane

为什么示例1 会返回错误,而示例3 则不会?

发生了什么事?

1 个答案:

答案 0 :(得分:5)

当defaultdict找不到密钥时,它会调用不带任何参数的函数。与

def hi(name):
    return "hi " + name

a = defaultdict(hi)
a["hello"]

hi已被调用,尽管您希望稍后调用它。由于默认用户在没有任何参数的情况下调用hi,因此您在手动运行hi()时会看到相同的错误,即TypeError抱怨错误的参数计数。< / p>

另一种写出lambda的方法(仅用于教学目的)将是

def hi(name):
    return "hi " + name

def make_hi():
    return hi

a = defaultdict(make_hi)
print(a["hello"]("jane"))

在此处,访问a["hello"]调用make_hi,然后返回hi,然后使用参数("jane")调用。{/ p>