disl 发表于 2018-8-10 06:08:34

Python之匿名函数

  今天给大家介绍一下Python中的匿名函数。


匿名函数


[*]由lambda关键字来定义
[*]参数列表不需要小括号
[*]冒号不是开启新的语句块的
[*]只能写在一行上
[*]没有return语句,最后一个表达式的值就是返回值
  一个简单的例子:
  

In : lambda x: x+1  
Out: <function __main__.<lambda>>
  

  
# 第一种用法
  
(lambda x: x + 1)(3) # 第一个括号用来改变优先级,第二对括号表示函数调用
  
In : (lambda x: x+1)(3)
  
Out: 4
  

  
# 第二种用法,把匿名函数赋值给变量
  
f = lambda x: x + 1
  
f(5)
  
In : f = lambda x: x+1
  

  
In : f(5)
  
Out: 6
  

  
lambda x, y: x + y
  
# 也可以这样调用
  
(lambda x, y: x + y)(3, 5)# 第一个括号是用来改变优先级的,第二个括号是调用函数的
  
add = lambda x, y: x + y
  
add(3, 5)
  

  也可以设置默认参数:
  

lambda x, y=1: x + y  
add = lambda x, y=1: x + y
  
add(3)
  
# 调用的时候也可以用关键字参数
  
add(x=5)
  

  
lambda x, y=1: x + y
  
<function <lambda> at 0x1019e10d0>
  
add = lambda x, y=1: x + y
  
add(3)
  
4
  
# 调用的时候也可以用关键字参数
  
add(x=5)
  
6
  

  可变参数可以吗?
  

In : f = lambda *x: x  

  
In : f(1, 2, 3)
  
Out: (1, 2, 3)
  

  
In : lst =
  

  
In : f(*lst)
  
Out: (1, 2, 3)
  

  关键字参数可以吗?
  

In : f = lambda **kw: kw  

  
In : f(a=0)
  
Out: {'a': 0}
  

  
In : dict01 = {'name': 'lavenliu.cn', 'age': 23}
  

  
In : f(**dict01)
  
Out: {'age': 23, 'name': 'lavenliu.cn'}
  

  可变参数与可变关键字参数同时使用呢?
  

In : (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)})  
(0, 1, 2) {'0': 0, '1': 1, '2': 2}
  

  
In : (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)})
  
(0, 1, 2) {'0': 0, '1': 1, '2': 2}
  

  参数槽可以吗?
  

In : f = lambda x, *, y: x+y  

  
In : f(1, y=3)
  
Out: 4
  

  普通函数所支持的参数变化,匿名函数都支持。
  再来一例:
  

In : concat = lambda *args: ''.join(args)  

  
In : concat('a', 'b', 'c')
  
Out: 'abc'
  

  
In : lower = (lambda x, y: x if x < y else y)
  

  
In : lower(7, 3)
  
Out: 3
  

  
In : lower('a', 'b')
  
Out: 'a'
  

  
In : lower(2.3, 4.5)
  
Out: 2.3
  

  匿名函数通常和高阶函数配合使用,作为参数传入,或者作为返回值返回。
  匿名函数最好不要定义成递归函数。
  

In : fib = lambda n: 1 if n == 0 or n == 1 else fib(n-1) + fib(n-2)  

  
In : fib(5)
  
Out: 8
  

  一个例子:
  

from collections import namedtuple  

  
User = namedtuple('User', ['name', 'age'])
  

  
users =
  

  
def get_age(user):
  return user.age
  

  
sorted(users, key=get_age)
  

  

  
# 或者使用匿名函数
  
sorted(users, key=lambda x: x.age)
  

  

  
list(map(lambda x: x.age, users))
  

  
list(filter(lambda x: x.age < 30, users))
  

  自己实现一个map函数,
  

In : def map_(fn, it):  ...:   return
  ...:
  

  
In : def square(n):
  ...:   return n ** 2
  ...:
  

  
In : lst1 =
  

  
# 使用自定义的map函数
  
In : map_(square, lst1)
  
Out:
  

  自己实现一个filter函数,
  

def filter_(fn, it):  return
  

  今天的内容就到这里,欢迎大家继续关注微信公众号:小白的技术客栈。
页: [1]
查看完整版本: Python之匿名函数