我遇到了一些 Python 函数,完全无法理解它的含义,也不知道它是如何工作的。
def test(data, bot):
return reduce(lambda a, b: a or b, [i in data['message'] for i in
['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']])
我知道结果是如果 data['message'](这是一个字符串值)包含这些字符串中的任何一个 ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'],函数测试会返回true。
请您参考如下方法:
你正在看一个列表理解;对于每个 i,它将计算数据 ['message'] 中的 i。
如果你改为在循环中写出它,它将是:
tmplist = []
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']:
tmplist.append(i in data['message'])
因此,对于列表中的每个字符串,测试 bool 表达式 i in data['message'] 并添加结果(True 或 False) 在 `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]和sequence[1]作为a开始 和 b,然后将 lambda 的结果作为 a 和 sequence 中的下一个元素as b,并重复此操作,直到处理完序列中的所有元素。
一种更友好的写法是使用 any()相反:
return any(i in data['message']
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'])
any() 实际上效率更高;它将运行生成器,并在找到匹配项时立即停止;如果 data['message'] 包含 '地震了吗' 将只执行一个测试。
