Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将DefaultDict与lambda表达式一起使用以使默认值可更改?_Python_Lambda_Defaultdict - Fatal编程技术网

Python 如何将DefaultDict与lambda表达式一起使用以使默认值可更改?

Python 如何将DefaultDict与lambda表达式一起使用以使默认值可更改?,python,lambda,defaultdict,Python,Lambda,Defaultdict,DefaultDicts是一个有用的对象,可以使用一个用于定义默认值的可调用函数动态创建新键的字典。例如,使用str将空字符串设为默认值 >>> food = defaultdict(str) >>> food['apple'] '' 还可以使用lambda将表达式设置为默认值 >>> food = defaultdict(lambda: "No food") >>> food['apple'] 'No food' 但是

DefaultDicts是一个有用的对象,可以使用一个用于定义默认值的可调用函数动态创建新键的字典。例如,使用
str
将空字符串设为默认值

>>> food = defaultdict(str)
>>> food['apple']
''
还可以使用lambda将表达式设置为默认值

>>> food = defaultdict(lambda: "No food")
>>> food['apple']
'No food'
但是,您不能向该lambda函数传递任何参数,这会在尝试调用该函数时导致错误,因为您实际上无法向该函数传递参数

>>> food = defaultdict(lambda x: "{} food".format(x))
>>> food['apple']

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    food['apple']
TypeError: <lambda>() takes exactly 1 argument (0 given)
>>food=defaultdict(lambda x:“{}food.”格式(x))
>>>食物[苹果]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
食物[苹果]
TypeError:()正好接受1个参数(给定0)
即使您试图提供参数

>>> food['apple'](12)

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    food['apple']
TypeError: <lambda>() takes exactly 1 argument (0 given)
>食物[‘苹果’](12)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
食物[苹果]
TypeError:()正好接受1个参数(给定0)

这些lambda函数是如何响应的而不是一个严格的表达式?

在表达式中使用变量实际上可以在某种程度上避免这种情况

>>> from collections import defaultdict
>>> baseLevel = 0
>>> food = defaultdict(lambda: baseLevel)
>>> food['banana']
0
>>> baseLevel += 10
>>> food['apple']
10
>>> food['banana']
0
默认lambda表达式绑定到一个变量,该变量可以在不影响其已创建的其他键的情况下进行更改。当它可以绑定到仅在访问不存在的键时才进行计算的其他函数时,这一点特别有用

>>> joinTime = defaultdict(lambda: time.time())
>>> joinTime['Steven']
1432137137.774
>>> joinTime['Catherine']
1432137144.704
>>> for customer in joinTime:
    print customer, joinTime[customer]

Catherine 1432137144.7
Steven 1432137137.77

丑陋但可能对某人有用:

class MyDefaultDict(defaultdict):
    def __init__(self, func):
        super(self.__class__, self).__init__(self._func)
        self.func = func

    def _func(self):
        return self.func(self.cur_key)
        
    def __getitem__(self, key):
        self.cur_key = key
        return super().__getitem__(self.cur_key)