lambda表达式定义的函数为匿名函数,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用。本文对Python中lambda表达式的特性和用法进行了一个简单的总结。

语法

基本语法格式:

lambda [参数列表]: 表达式

语义与如下函数形式相同:

def fn(参数列表): return 表达式

语法格式要点:

  • lambda 关键词定义
  • 冒号左边是参数,后边是返回值
  • 只能是单行函数体

举例:

lambda x, y: x + y

def add(x, y): return x + y

特性

  • 匿名函数。 没有名字的函数。
  • 有输入输出。 以冒号为界,左边获取参数,右边返回计算值。
  • 单行函数,功能简单。 由于函数体只能写在单行内,只能完成简单功能,代码简洁。
  • 用完立即释放。 用于无需多次复用的函数,使用后立即释放,提升性能。

用法

  • 将lambda函数赋值给变量,由该变量间接调用该lambda函数。

      add = lambda x, y: x + y
      print(add(1, 2))         # 输出3
    
  • 将lambda函数赋值给其他函数,从而将其他函数替换为该lambda函数。

      time.sleep=lambda x:None  #屏蔽了sleep函数的功能
      time.sleep(3)             #执行该语句时,程序不会休眠3秒钟
    
  • 将lambda函数作为其他函数的返回值,即作为内部函数。 (这里涉及“闭包”)

      def get_math_func(type):
          # 返回lambda表达式
          if type == 'square':
              return lambda n: n * n
          elif type =- 'cube':
              return lambda n: n * n * n
          else:
              return lambda n: (1 + n) * n / 2
      # 调用get_math_func(), 返回一个嵌套函数
      math_func = get_math_func("cube")
      print(math_func(5))  # 输出125
      math_func = get_math_func("square")
      print(math_func(5))  # 输出25
      math_func = get_math_func("other")
      print(math_func(5))  # 输出15.0
    
  • 将lambda函数作为参数传递给其他函数。

      # 一些典型的内置函数
      # map函数
      x = map(lambda x: x * x, range(8)) # 对元素做平方计算
      print([e for e in x])  # 输出 [0,1,4,9,16,25,36,49]
      y = map(lambda x: x * x if x % 2 == 0 else 0, range(8))
      print([e for e in y])  # 输出 [0,0,4,0,16,0,36,0]
    
      # sorted函数
      s = sorted(range(1,10), key=lambda x: abs(5-x)) # 按照元素与5距离从小到大进行排序
      print([e for e in s])  # 输出 [5, 4, 6, 3, 7, 2, 8, 1, 9]
    
      # filter函数
      f = filter(lambda x: x % 3 == 0, range(1,3)) # 过滤能够被3整除的元素
      print([e for e in f])  # 输出 [3]
    
      # reduce函数
      r = reduce(lambda a, b: '{}, {}'.format(a, b), range(1,10)) #将元素从左往右两两以逗号分隔的字符的形式依次结合起来
      print([e for e in r])  # 输出 '1, 2, 3, 4, 5, 6, 7, 8, 9'
    

写在最后的话

Explicit is better than implicit.(明了胜于晦涩。) – 《Python之禅》

参考文献

  1. 《疯狂Python讲义》

  2. 关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解