1. ホーム
  2. python

[解決済み] なぜPythonにはfirst(iterable)という組み込み関数がないのですか?

2023-07-17 18:57:47

質問

がないのは、何か理由があるのでしょうか? first(iterable) がないのはなぜでしょうか。 any(iterable)all(iterable) (にはありません(stdlib モジュールのどこかに隠されているかもしれませんが、私は itertools ). first は短絡的なジェネレータ評価を行うので、不必要な(そして無限に続く可能性のある)操作を避けることができます;すなわち

def identity(item):
    return item

def first(iterable, predicate=identity):
    for item in iterable:
        if predicate(item):
            return item
    raise ValueError('No satisfactory value found')

このように表現することができます。

denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
    if all(i % denominators == 0 for denominator in denominators))

明らかに、あなたは list(generator)[0] を実行することはできません。なぜなら、ジェネレータは終了しないからです。

あるいは、マッチさせたい正規表現がたくさんある場合 (それらがすべて同じ groupdict インターフェースを持つ場合に便利です)。

match = first(regex.match(big_text) for regex in regexes)

を避けることで、不要な処理を大幅に削減できます。 list(generator)[0] を避け、正の一致で短絡することで、多くの無駄な処理を省くことができます。

どのように解決するのですか?

Python 2 では、イテレータがある場合、単にその next メソッドを呼び出すだけです。みたいな感じ。

>>> (5*x for x in xrange(2,4)).next()
10

Python 3 を使用すると next 組み込み をイテレータで指定します。

>>> next(5*x for x in range(2,4))
10