リスト内包表記を見ています。それぞれ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]
a
b
lambda
a
sequence
b
これを書くためのより友好的な方法は、any()
代わりに使用することです:
return any(i in data['message']
for i in ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧'])
any()
実際にはより効率的です。ジェネレーターを実行し、一致が見つかるとすぐに停止します。1 つのテストのみdata['message']
が含まれている場合は、実行されます。'地震了吗'