我遇到了一些Python函数,完全无法理解它的含义,也不知道它是如何工作的。
def test(data, bot):
return reduce(lambda a, b: a or b, [i in data['message'] for i in
['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']])
我知道结果是data['message']
(这是一个字符串值)包含任何这些字符串['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']
,函数测试将返回true。
答案 0 :(得分:13)
您正在查看列表理解;对于每个i
,它将计算i in data['message']
。
如果你要在循环中写出来,那就是:
tmplist = []
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']:
tmplist.append(i in data['message'])
因此,对于列表中的每个字符串,测试布尔表达式i in data['message']
并在`tmplist中添加结果(True
或False
)。
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
b
中的下一个元素return any(i in data['message']
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'])
,并重复此操作,直到处理了序列中的所有元素。
更友好的方式是使用any()
代替:
any()
data['message']
实际上更有效率;它将运行发电机并在发现匹配时立即停止;如果'地震了吗'
包含{{1}},则只会执行一项测试。