python lambda详解

lambda

由浅入深讲解lambda,所有的例子都在python2.7中测试通过

1、第一个例子
def identity(x):
    return x


a = lambda x: x + 1

有上面的分析可得,lambda分为三个部分:
关键字: lambda
A bound variable: x (lambda函数的参数)
A body: x

2、lambda在python中是什么类型的?
print type(lambda x: x)

执行结果

<type 'function'>

可以知道lambda在python中是function类型,所以根据这个,我们可以很灵活的用lambda
比如

  1. 可以命名
my_lambda = lambda x: x + 1
print my_lambda(2)
  1. 可以立即执行
print (lambda x: x + 1)(8)
  1. 可以有很多个参数
full_name = lambda first, last: 'full name ' + first + last
print full_name('william', ' x_f_wang')
  1. 返回多个参数
shang_yushu = lambda x, y: (x / y, x % y)
print shang_yushu(2, 3)
  1. lambda嵌套,也叫higher-ordeer functions,如filter() ,min(), and max()等,都是内置的higher-ordeer functions
high_ord_func = lambda x, func: x + func(x)
print high_ord_func(2, lambda x: x * x)
print high_ord_func(2, lambda x: x + 3)
3、匿名函数

在python中,匿名函数anomyous functions就是用lambda关键字来写的,总之python中的lambda几乎和普通的函数normal function一摸一样

4、lambda与普通函数的区别
  1. 看一下TraceBack
    1.1 lambda
    div_zero = lambda x: x / 0
    div_zero(2)
    
    执行结果
    Traceback (most recent call last):
      File "lambdaTest.py", line 1, in <module>
        div_zero(2)
      File "lambdaTest.py", line 1, in <lambda>
        div_zero = lambda x: x / 0
    ZeroDivisionError: integer division or modulo by zero
    
    可以看到lambda给出的就是一个关键字lambda
    1.2 普通函数normal function
    def div_zero(x): return x / 0
    div_zero(2)
    
    执行结果
    Traceback (most recent call last):
      File "lambdaTest.py", line 72, in <module>
        div_zero(2)
      File "lambdaTest.py", line 71, in div_zero
        def div_zero(x): return x / 0
    ZeroDivisionError: integer division or modulo by zero
    
    可以看到普通函数给出的是函数名div_zero
    所以结论,在TraceBack的时候,普通的函数能给出更加精确的log
5、语法上的一些限制

1、不能包含statements,如print,assert

# 这样写就是错的
print (lambda x: assert / return  x == 2 )(2)

2、只能由一个语句,这个没啥好说的
3、不支持type annotations,类型注释,python中可以通过类型注释来达到java中的参数类型效果

        def test(first):
            """
            :rtype: int		(说明返回类型是 int)
            :type first: int	(说明first类型是 int)
            """
            return first

        a = ""  # type: str	(说明a类型是 str)
        a = test(1)		# (这一句编译器就会提示报错)
5、参数的使用方法

1、Positional arguments

print ( lambda x, y ,z: x + y + z)(1, 2, 3)

2、Named arguments (sometimes called keyword arguments)

print ( lambda x, y, z=3: x + y + z)(1, 2)

3、Variable list of arguments (often referred to as varargs)

print ( lambda x, y=1, z=3: x + y + z)(1, y=2)

4、Variable list of keyword arguments

print ( lambda *args: sum(args) )(1, 2, 3)

5、Keyword-only arguments

print ( lambda **kwargs: sum(kwargs.values()))(a=1, b=2, c=3)
然后后面就写了一大堆lambda可以用到的地方,用来用去,也都是为了说明,凡是function可以用的,lambda都可以用

比如decorator的修饰器,closure等,一个比较有意思的例子:

numbers = 'one', 'two', 'three'
funcs = []
for n in numbers:
    funcs.append(lambda n=n: n)
for f in funcs:
    print f()
lambda expression abuses

说lambda不能滥用,的波的,的波的…

接下来就是仁者见仁,智者见智了

If you find yourself trying to overcome something that a lambda expression does not support,
this is probably a sign that a normal function would be better suited.

  1. It doesn’t follow the Python style guide (PEP 8)
  2. It’s cumbersome and difficult to read.
  3. It’s unnecessarily clever at the cost of difficult readability.

猜你喜欢

转载自blog.csdn.net/qq_40666620/article/details/108062537