无法理解Python表达式

时间:2013-01-11 12:58:34

标签: python lambda

我遇到了一些Python函数,完全无法理解它的含义,也不知道它是如何工作的。

def test(data, bot):
    return reduce(lambda a, b: a or b, [i in data['message'] for i in
        ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']])

我知道结果是data['message'](这是一个字符串值)包含任何这些字符串['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'],函数测试将返回true。

1 个答案:

答案 0 :(得分:13)

您正在查看列表理解;对于每个i,它将计算i in data['message']

如果你要在循环中写出来,那就是:

tmplist = []
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']:
    tmplist.append(i in data['message'])

因此,对于列表中的每个字符串,测试布尔表达式i in data['message']并在`tmplist中添加结果(TrueFalse)。

reduce()函数返回等效于:

tmplist[0] or tmplist[1] or tmplist[2] or ... or tmplist[len(tmplist)-1]

但以更曲折的方式表达。 reduce(lambda a, b: a or b, sequence)sequence[0]sequence[1]作为ab开头,然后将lambda的结果作为asequence b中的下一个元素return any(i in data['message'] for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']) ,并重复此操作,直到处理了序列中的所有元素。

更友好的方式是使用any()代替:

any()

data['message']实际上更有效率;它将运行发电机并在发现匹配时立即停止;如果'地震了吗'包含{{1}},则只会执行一项测试。