函数式编程:匿名函数

按照惯例这里应该是lambda的文档,但是相对于官方文档给出的内容比较少,所以这里就暂时打破惯例了。

了解匿名函数前,先要知道什么是python函数

在python中使用 def funtion_name(paramter)的方式定义函数即:

>>>>def function_name(paramter):
>>>>    pass

这样的函数拥有函数名,调用的时候只需要

function_name(input_paramter)

暂且将def定义的函数叫做'有名函数',那么什么是匿名函数呢?顾名思义,这类函数没有显示的定义函数名。

 

认识匿名函数:

匿名函数不需要显示的定义函数名称,使用【lambda paramter : expression】的方式【1个或者多个参数,表达式,一个返回值】,即:

lambda arg1,arg2.... : expression

比如,我要写一个函数用于计算2个数值的相乘

使用def方式:

#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-

def product(a,b):
    return a * b

用匿名函数来编写

#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-

func = lambda a,b : a*b

 

使用场景

1. 需要将一个函数对象作为参数来传递的时候,可以定义一个lambda函数(lambda作为函数的参数或者函数的返回值)

#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-

# lambda作为参数传递,第一种常用情况
def sub_func(a, b, func):
    print('a = ',a)
    print('b = ',b)
    print('a - b =',func(a, b))

sub_func(100,2,lambda a, b: a-b)


# lambda作为参数传递,第二种常用情况
member_list = [
    {"name":“风清扬”,"age":99,"power":99999},
    {"name":“大老王”,"age":89,"power":88888},
    {"name":“老吴”,"age":120,"power":77777}
]

# sorted循环第一个参数中的每个元素传递给后边的匿名函数
new_list = sorted(member_list, key = lambda member_list: member_list['power'])
print(new_list)

num_list = [100,77,69,31,44,56]
num_str = list(map(lambda x:{str(x):x}, number_list))
print(num_str)


# lambda 作为函数的返回值
def run_func(a, b):
    return lambda c: a+b+c

return_func = run_func(1,1000)
print(return_func)
print(return_func(100))
>>> <function run_func.<locals>.<lambda> at 0x00000254E4C94158>
>>> 10101

# 理解不错的话,这个函数返回一个函数对象,函数对象将它的运行环境保存了一下,所以在run_func都执行完了 我们还能使用a,b参数(暂时不着急理解这个,后续会学到的,calm down)

2. 要处理的业务符合lambda函数的情况(任意多个参数和一个返回值)并且只有一个地方会用到这个函数,不会在其他地方重用(重用的话还是老老实实用def定义函数吧)

^_^ 这个就不举例子了,我也没写过业务代码暂时还没有经验

 

匿名函数的多种形式

# 无参数
lambda_a = lambda: 100
print(lambda_a())
 
# 一个参数
lambda_b = lambda num: num * 10
print(lambda_b(5))
 
# 多个参数
lambda_c = lambda a, b, c, d: a + b + c + d
print(lambda_c(1, 2, 3, 4))
 
# 表达式分支
lambda_d = lambda x: x if x % 2 == 0 else x + 1
print(lambda_d(6))
print(lambda_d(7))

其他好玩的写法

data = ([1, 4, 3], [3, 2, 5], [5, 1, 2], [4, 3, 1], [2, 5, 3])
sorted(data, key=lambda _: _[0])
>>>[[1, 4, 3], [2, 5, 3], [3, 2, 5], [4, 3, 1], [5, 1, 2]]
sorted(data, key=lambda _: _[1])
>>>[[5, 1, 2], [3, 2, 5], [4, 3, 1], [1, 4, 3], [2, 5, 3]]
sorted(data, key=lambda _: _[2])
>>>[[4, 3, 1], [5, 1, 2], [1, 4, 3], [2, 5, 3], [3, 2, 5]]

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值