解释这个python lambda

时间:2015-06-10 19:30:10

标签: python django lambda

我正在django中实施每月日历,并使用了我在网上找到的一些代码。在代码中有一个lambda函数,我需要根据我的特定用途进行调整。

def group_by_day(self, event):
        field = lambda event: event.start.day
        return dict(
            [(day, list(items)) for day , items in groupby(event, field)]
        )

从我在网上看到的内容:

  

group_by_day()构建一个以月中某日为关键字典的字典   以及当天的任何锻炼作为其值(http://uggedal.com/journal/creating-a-flexible-monthly-calendar-in-django/

我对python很新,并且在弄清楚它实际上是如何做它的魔法时遇到了问题。我确实理解它使用event.start.day将其分配给日期和月份。这是用递归做的吗?

我试图调整功能,以便支持重复/多日活动。

由于

3 个答案:

答案 0 :(得分:1)

所有lambda都返回事件开始日期的日期部分; lambda个对象只是函数。真正的 magic 位于itertools.groupby() function,它根据返回值生成组。每当值从一个事件更改为下一个事件时,您将获得一个新组。

根据您的多日/重复实施方式,可能不容易直接适应您的情况。您必须切换到带字典的循环。

这是一个仅使用循环的等效函数,它更容易适应:

def group_by_day(self, event):
    result = {}
    for e in event:
        day = event.start.day
        result.setdefault(day, []).append(event)
    return result

这不依赖于事件的顺序,因为它只是将每个日期按日分组,而不管它在序列中出现的位置。这应该允许您将事件添加到超过一天

答案 1 :(得分:0)

Lambda函数就像常规函数一样。例如:

f = lambda x:x**2

是否等同于:

def f(x):
    return x**2

因此,在您的情况下,对于field(事件),请返回event.start.day

答案 2 :(得分:0)

魔法有三个独立的部分:lambda,list comprehension和groupby函数。

声明lambda event: event.start.day等同于:

def f(event):
  return event.start.day

groupby函数可能需要eventfield并返回某种双元素列表(或元组)列表。

列表理解[(day, list(items)) for day , items in groupby(event, field)]等同于:

result = []
for day, items in groupby(event, field):
    result.append( (day, list(items)) )

然后dict调用获取元组列表并将其转换为day:list(items)对的字典。