zoukankan      html  css  js  c++  java
  • Python基础:lambda 匿名函数

    格式

    lambda argument1, argument2,... argumentN : expression
    
    square = lambda x: x**2
    print(square(2))

    与常规函数区别

      匿名函数 lambda 和常规函数一样,返回的都是一个函数对象(function object)
     
      lambda 是一个表达式(expression),并不是一个语句(statement)。表达式是可以被求值,类似"公式"的代码,而语句是一段完成了某种功能的可执行代码。
      所以,lambda可以用在列表内部:
    l = [(lambda x:x**2) (x) for x in range(10)]
    print(list(l))
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
      同样,可以作为参数
    l = [(1, 20), (3, 0), (9, 10), (2, -1)]
    l.sort(key=lambda x: x[1]) # 按列表中元祖的第二个元素排序
    print(l)
    输出
    [(2, -1), (3, 0), (9, 10), (1, 20)]
      lambda 的主体是只有一行的简单表达式,并不能扩展成一个多行的代码块。

    使用lambda可以简化代码

    squared = map(lambda x: x**2, [1, 2, 3, 4, 5])
    print(list(squared))

      上面那段代码,如果不用lambda表达式而用常规函数:

    def squared2(x):
        return x[1] if isinstance(x,tuple) else x**2
    
    squared = map(squared2, [1, 2, 3, 4, 5,(1,3)])
    print(list(squared))

    Python函数式编程

      Python函数式编程有三个基本函数 map()、reduce()、filter()

      map(function, iterable [,iterable2])

      map遍历可迭代对象取出元素,作为参数依次传给function函数,例:每个元素都变大2倍

    l = [1, 2, 3, 4, 5]
    new_list = map(lambda x: x * 2, l) # [2, 4, 6, 8, 10]

      filter(function, iterable)

      filter与map一样,遍历可迭代对象,并依次传给function,不同的是,filter会判断每次function的结果是True或False,并将结果为True的元素组成列表返回

      例:返回一个列表中的所有偶数

    l = [1, 2, 3, 4, 5]
    new_list = filter(lambda x: x % 2 == 0, l) # [2, 4]

      reduce(function, iterable[, initializer])

      其中function 是一个函数对象,规定它有两个参数,表示对 iterable 中的每个元素以及上一次调用后的结果,运用 function 进行计算,所以最后返回的是一个单独的数值。

      配合reduce源码理解:

    def reduce(function, iterable, initializer=None):
        it = iter(iterable)
        if initializer is None:
            try:
                initializer = next(it)
            except StopIteration:
                raise TypeError('reduce() of empty sequence with no initial value')
        accum_value = initializer
        for x in it:
            accum_value = function(accum_value, x)
        return accum_value

      例 累加列表中的元素

    from functools import reduce
    l = [1,2,3,4,5]
    result = reduce(lambda x,y:x+y, l )
    print(result) #15
    result = reduce(lambda x,y:x+y, l,10 )
    print(result) #25

    思考题

      把字典 d = {'mike': 10, 'lucy': 2, 'ben': 30} 按值从高到低排序

    d = {'mike': 10, 'lucy': 2, 'ben': 30}
    d = sorted(d.items(), key=lambda x: x[1],reverse = True ) #[('ben', 30), ('mike', 10), ('lucy', 2)]
    d = dict(d)
    print(d)

     参考:

    极客时间《Python核心技术与实战》

  • 相关阅读:
    linux 和 ubuntu 修改主机名
    Linux删除用户
    ubuntu更新源
    python连接mysql
    用于迭代器的yield return
    Tuple类型
    Action 和 Func
    用iDSDT制作声显卡DSDT
    C#“同步调用”、“异步调用”、“异步回调”
    读懂IL代码就这么简单
  • 原文地址:https://www.cnblogs.com/xiaoguanqiu/p/10958623.html
Copyright © 2011-2022 走看看