リスト内包表記を見ています。それぞれiについて計算しi in data['message']ます。
代わりにこれをループで書き出すと、次のようになります。
tmplist = []
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']:
    tmplist.append(i in data['message'])
そのため、リスト内の文字列ごとにブール式i in data['message']をテストし、結果 (TrueまたはFalse) を `tmplist に追加します。
次に、reduce()関数は次と同等のものを返します。
tmplist[0] or tmplist[1] or tmplist[2] or ... or tmplist[len(tmplist)-1]
しかし、より曲がりくねった方法で表現されます。andとしてandでreduce(lambda a, b: a or b, sequence)始まり、 asの結果とasの次の要素を取得し、sequence 内のすべての要素が処理されるまでこれを繰り返します。sequence[0]sequence[1]ablambdaasequenceb
これを書くためのより友好的な方法は、any()代わりに使用することです:
return any(i in data['message']
    for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'])
any()実際にはより効率的です。ジェネレーターを実行し、一致が見つかるとすぐに停止します。1 つのテストのみdata['message']が含まれている場合は、実行されます。'地震了吗'