13

Python 3.2 のドキュメントは、function を含むCollin Winter のfunctionalモジュールcomposeを参照しています。

compose() 関数は、関数合成を実装します。つまり、内部からの戻り値が直接外部に渡されるように、外部および内部の callable のラッパーを返します。

残念ながら、このモジュールは 2006 年 7 月以降更新されていません。代替品がないか気になります。

今のところ、compose関数だけが必要です。次の元のfunctional.compose定義は Python 3 でも有効ですか?

def compose(func_1, func_2, unpack=False):
    """
    compose(func_1, func_2, unpack=False) -> function

    The function returned by compose is a composition of func_1 and func_2.
    That is, compose(func_1, func_2)(5) == func_1(func_2(5))
    """
    if not callable(func_1):
        raise TypeError("First argument to compose must be callable")
    if not callable(func_2):
        raise TypeError("Second argument to compose must be callable")

    if unpack:
        def composition(*args, **kwargs):
            return func_1(*func_2(*args, **kwargs))
    else:
        def composition(*args, **kwargs):
            return func_1(func_2(*args, **kwargs))
    return composition

このSOの質問は多少関連しています。Python が の特別な構文をサポートする必要があるかどうかを尋ねますcompose

4

1 に答える 1

6

compose上記のコメントで説明したように、実装はpython 3.2 で有効です。あなたが与えたライブラリのほとんどの関数には、ドキュメンテーションに書かれた同等のpythonがあります。

mapやなどの関数filterは既に Python で実装されており、リスト内包表記として単純に表現することもできます。Python にはidオブジェクトの ID を (整数として) 返す関数がありidますが、ライブラリの関数は として表現できますlambda x: x

興味深いと思われるもう 1 つのモジュールはitertoolsandです。functoolspartialreducefoldl

以下は、標準ライブラリで見つけられなかったいくつかの簡単な実装です。

from functools import reduce

def flip(f):
    if not callable(f):
        raise TypeError("Cannot filp a non-callable object")
    def result(*args, **kw):
        args = list(args)
        args.reverse()
        return f(*args, **kw)
    return result

def ilast(i):
    return reduce(lambda _, x: x, i)

def iscanl(f, v, seq):
    yield v
    for a in seq:
        v = f(v, a)
        yield v

def scanl(*args, **kw):
    return list(iscanl(*args, **kw))

def foldl(*args, **kw):
    return ilast(iscanl(*args, **kw))
# Or using reduce
#def foldl(f, v, seq):
#    return reduce(f, seq, v)

def iscanr_reverse(f, v, seq):
    return iscanl(flip(f), v, seq)

def scanr(*args, **kw):
    result = list(iscanr_reverse(*args, **kw))
    result.reverse()
    return result

def foldr(*args, **kw):
    return ilast(iscanr_reverse(*args, **kw))
于 2012-02-01T07:49:21.787 に答える