1

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

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

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

4

1 回答 1

13

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

如果您要在循环中写出它,它将是:

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

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

然后该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]and sequence[1]as aand开始b,然后获取 as 的结果和lambdaasa中的下一个元素sequenceb并重复此操作,直到 sequence 中的所有元素都已处理。

编写此代码的更友好的方法是any()改用:

return any(i in data['message']
    for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'])

any()实际上效率更高;它将运行生成器并在找到匹配项时立即停止;如果只data['message']包含'地震了吗'一个测试将被执行。

于 2013-01-11T13:00:48.047 回答