以下のような、リストデータと関数があったとします。
# 月別の日数 >>> days = (31, 28, 31, 30, 31, 30, ... 31, 31, 30, 31, 30, 31) # 条件に合う要素を数える関数 >>> def count_if(data, predicate): ... return sum(predicate(i) for i in data) ...
count_if() の使い方は以下のようになります。引数 predicate には lambda を使うのが最も簡単と思われます。
>>> count_if(days, lambda x: x == 31) 7 >>> count_if(days, lambda x: x <= 30) 5
上記 lambda と同じ動作を、整数のメソッドを渡すことでも実現できます。通常は演算子を通して呼ばれる __eq__() や __gt__() といったメソッドを、引数として渡してやります。
注意点として、リテラル整数のメソッドを呼ぶときには、ドットが小数点でないことを示すために、整数を () で括る必要があります。31.__eq__ のように呼ぶとエラーとなります。
>>> count_if(days, (31).__eq__) 7 >>> count_if(days, (30).__ge__) 5この書き方、簡潔と言えば簡潔ですが、__eq__ などのメソッドはあまり見かけないこともあり、可読性はイマイチでしょうか。特に不等式の表現は、通常の > 、>= の方がずっと読みやすいように思います。
とは言え、このような書き方もあるということを、知識として知っておいて損はないと思います。
0 件のコメント:
コメントを投稿