Skip to main content
 首页 » 编程设计

python之看不懂Python表达式

2025年05月04日10cloudgamer

我遇到了一些 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'] 包含 '地震了吗' 将只执行一个测试。