[python] このλ/ yield / generatorの理解はどのように機能しますか?



Answers

ああ、神様。 基本的には、これまでのところ、

def f(_):              # I'm the lambda _: t
    return '-o'

def thegenerator():   # I'm (f((yield x)) for x in l)
    for x in kvs:
        yield f((yield x))

だから、反復されると、ジェネレータはxkvsメンバー)を返し、次にfの戻り値を返します。これは常に-oです。 どんなyield xが返っても何がfに渡されるかは無視されます。

同等物:

def thegenerator():   # I'm (f((yield x)) for x in l)
    for x in kvs:
        whatever = (yield x)
        yield f(whatever)

def thegenerator():   # I'm (f((yield x)) for x in l)
    for x in kvs:
        yield x
        yield f(None)

def thegenerator():   # I'm (f((yield x)) for x in l)
    for x in kvs:
        yield x
        yield '-o'

もちろんこれをもっと簡単に行う方法はたくさんあります。 元の倍率のトリックでさえ、全体が

return list(((lambda _: '-o')((yield x)) for x in kvs))[::-1]
Question

私は今日のコードベースを見ていて、これを見つけました:

def optionsToArgs(options, separator='='):
    kvs = [
        (
            "%(option)s%(separator)s%(value)s" %  
            {'option' : str(k), 'separator' : separator, 'value' : str(v)}
        ) for k, v in options.items()
    ]
    return list(
        reversed(
            list(
                    (lambda l, t: 
                        (lambda f: 
                            (f((yield x)) for x in l)
                        )(lambda _: t)
                    )(kvs, '-o')
                )
            )
        )

これは、パラメータのdictを取ってシェルコマンドのパラメータのリストに変換するようです。 それは、私が不可能と思った発電機の理解の中で歩留まりを使用しているようです...?

>>> optionsToArgs({"x":1,"y":2,"z":3})
['-o', 'z=3', '-o', 'x=1', '-o', 'y=2']

どのように機能するのですか?




Links