Is it pythonic: naming lambdas

后端 未结 3 402
我寻月下人不归
我寻月下人不归 2020-11-27 08:18

I\'m beginning to appreciate the value of lambda expressions in python, particularly when it comes to functional programming, map, functions returning functions

相关标签:
3条回答
  • 2020-11-27 08:40

    This is not Pythonic and PEP8 discourages it:

    Always use a def statement instead of an assignment statement that binds a lambda expression directly to an identifier.

    Yes:

    def f(x): return 2*x
    

    No:

    f = lambda x: 2*x
    

    The first form means that the name of the resulting function object is specifically 'f' instead of the generic '<lambda>'. This is more useful for tracebacks and string representations in general. The use of the assignment statement eliminates the sole benefit a lambda expression can offer over an explicit def statement (i.e. that it can be embedded inside a larger expression)

    A rule of thumb for this is to think on its definition: lambdas expressions are anonymous functions. If you name it, it isn't anonymous anymore. :)

    0 讨论(0)
  • 2020-11-27 08:46

    These are functionally (no pun intended) identical.

    indexer = lambda a0, a1, idx: a0[idx] + a1[idx]
    
    def indexer(a0, a1, idx):
        return a0[idx] + a1[idx]
    

    If you have an aesthetic preference for one or the other, then use it.

    0 讨论(0)
  • 2020-11-27 08:55

    I've written a named lambda expression to do the indexing instead of writing a whole other function

    Well, you are writing a whole other function. You're just writing it with a lambda expression.

    Why not use def? You get nicer stack traces and more syntactical flexibility, and you don't lose anything. It's not like def can't occur inside another function:

    def fcn_operating_on_arrays(array0, array1):
        def indexer(a0, a1, idx):
            return a0[idx] + a1[idx]
        ...
    
    0 讨论(0)
提交回复
热议问题