Pythonでlambdaをいじる。俺switch使ってみたバカだなもっと単純だ編

実際に今書きかけのRasPi用のpythonスクリプトに使ってみました。
いいね!見違えるほどスッキリ!
でも、やっぱり条件が先がいいし、無駄なものがいっぱいついてる...

ながめているうちに気がついた。
もっと単純でよくね?

クイックソートの例でいうと前回はこうでした。

box=lambda *x:x
unbox=lambda x:x[-1]
    
do=box             
switch=unbox

qs=(lambda xs :
    (lambda
        le = [x for x in xs[1:] if x<=xs[0] ] ,
        gt = [x for x in xs[1:] if x>xs[0] ] :
        switch(
                do( [] ) if xs == [] else False
                or
                do( qs( le ) + [ xs[0] ] + qs( gt ) )
        )
    )()
)
そもそもelse False orいらない。

式1 if 条件1 else 式2 if 条件2 else ...最後の式
と続けても問題ないみたい。

box=lambda *x:x
unbox=lambda x:x[-1]
    
do=box             
switch=unbox

qs=(lambda xs :
    (lambda
        le = [x for x in xs[1:] if x<=xs[0] ] ,
        gt = [x for x in xs[1:] if x>xs[0] ] :
        switch(
                do( [] ) if xs == [] else
                do( qs( le ) + [ xs[0] ] + qs( gt ) )
        )
    )()
)

でも、これがいいんじゃね?


box=lambda *x:x
unbox=lambda x:x[-1]
    
do=box             
switch=unbox

qs=(lambda xs :
    (lambda 
        le = [x for x in xs[1:] if x<=xs[0] ] , 
        gt = [x for x in xs[1:] if x>xs[0] ] :
        switch(
            xs == [] and do( [] )  
            or
            do( qs( le ) + [ xs[0] ] + qs( gt ) )
        )
    )()
)
理屈はほとんど同じです。
switch()の中に、

条件式 and do(式1,式2,...)
をorでいくつもつなげていくことができます。
最後にすべての 条件式 and do(式1,式2,...) が偽になった時の処理をdo(式1,式2,...)で書きます。
do(式1,式2,...)の中味は順番に評価されます。
その結果がタプルとしてswitch()に渡され、タプルの最後の値が返ります。

あるいは、

見た目気にしなければこれでいいんじゃね?

qs=(lambda xs :
    (lambda 
        le = [x for x in xs[1:] if x<=xs[0] ] , 
        gt = [x for x in xs[1:] if x>xs[0] ] :
        (
            xs == [] and ( [], )  
            or
            ( qs( le ) + [ xs[0] ] + qs( gt ) ,)
        )[-1]
    )()
)
何してるかよくわからないけど、すっきりしていてむしろ漢気を感じる。
書くとき[-1]とかコンマとか忘れそう。いや絶対忘れる...

コメント