1

私はいくつかの Python 関数に遭遇しましたが、その意味を完全に理解できず、その仕組みも知りませんでした。

def test(data, bot):
    return reduce(lambda a, b: a or b, [i in data['message'] for i in
        ['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']])

data['message']結果が(文字列値である)これらの文字列のいずれかを含む場合['地震了吗', '地震了么', '地震了?', '地震了?', '地震了吧']、関数テストはtrueを返すことを知っています。

4

1 に答える 1

13

リスト内包表記を見ています。それぞれ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']が含まれている場合は、実行されます。'地震了吗'

于 2013-01-11T13:00:48.047 に答える