匿名函数和关键字lambda

  • 匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数
  • 在Python中,如果要声匿名函数,则需要使用lambda关键字
  • 使用lambda声明的匿名函数能接收任何数量的参数,但只能返回一个表达式的值。
  • 匿名函数不能直接调用priht(),因为lambda需要一个表达式。
  • 匿名函数的用处:
    • 当我们要对两个数进行运算,如果希望声明的函数支持所有的运算,可以将匿名函数作为函数参数传递。
    • 匿名函数还通常作为内置函数的参数来使用

匿名函数lambda和普通函数def的区别

  1. def创建的函数是有名称的,而lambda没有函数名称,这是最明显的区别之一。
  2. lambda返回的结果通常是一个对象或者一个表达式,它不会将结果赋给一个变量,而def可以。
  3. lambda只是一个表达式,函数体比def简单很多,而def是一个语句。
  4. lambda表达式的冒号后面只能有一个表达式,def则可以有多个.
  5. 像if或for等语句不能用于lambda中, def则可以。
  6. lambda一般用来定义简单的函数,而def可以定义复杂的函数。
  7. lambda函数不能共享给别的程序调用,def可以。

为什么要用到匿名函数lambda?

因为简单 、简洁,它能很快的写函数,非常适用于小型函数,能在一行命令将函数表达完整。

申明lamnda的格式:

lambda 变量1,变量2,···变量n :运算表达式

例一:

# 定义一个计算三数相加的匿名函数
f=lambda x,y,z : x+y+y # x,y,z表示匿名函数的参数; x+y+z表示的返回的结果
f(1,2,3) # 执行匿名函数

例二:

# 通过匿名函数判断数字是否是偶数
is_num = lambda num: True if num % 2 == 0 else False # 执行匿名函数
result = is_num(1)
print(result)

匿名函数的应用

应用一: 作为函数的参数传递

  • 示例(1):匿名函数作自定义函数的参数
#定义函数
def myFunc(num1,num2,option):
print('num1 = %d'%num1)
print('num2 = %d'%num2)
print('num1 + num2 = %d'%option(num1,num2))
#调用函数
myFunc(3,5,lambda x,y:x+y)

上述代码运行结果:

num1 = 3
num2 = 5
num1 + num2 = 8
  • 示例(2): 作为内置函数的参数
#定义一个列表,列表中的元素是字典
stus = [{'name':'xiaoming','age':18},
{'name':'xiaohong','age':19},
{'name':'xiaoxue','age':17}]
#实现列表中的元素按name排序
stus.sort(key = lambda x:x['name'])
print('列表中的元素按name排序:', stus)
#实现列表中的元素按age排序
stus.sort(key = lambda x:x['age'])
print('列表中的元素按age排序:', stus)

上述代码运行结果:

列表中的元素按name排序: [{'name': 'xiaohong', 'age': 19}, {'name': 'xiaoming', 'age': 18}, {'name': 'xiaoxue', 'age': 17}]
列表中的元素按age排序: [{'name': 'xiaoxue', 'age': 17}, {'name': 'xiaoming', 'age': 18}, {'name': 'xiaohong', 'age': 19}]
  • 示例(3): 匿名函数和普通函数都是函数,都是可以作为函数的参数使用的
# 使用一个变量sum保存sum_num函数的内存地址
sum = sum_num
# 执行函数
result = sum(1, 2)
print(result) def calc(num1, num2, func_name):
result = func_name(num1, num2)
print("func_name:", id(func_name))
return result # 匿名函数作为函数的参数使用
result = calc(1, 2, func) print(result) # 普通函数也可以作为函数的参数使用
result = calc(5, 2, sum_num) print(result)

应用二:将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。

add=lambda x, y: x+y

print(add(1,2))

上述代码中,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行打印add(1,2),输出为3。

应用三:传递一个函数的结果作为另一个函数的参数

  • 经常可以见到如下调用:
import thread, time
thread.start_new_thread(lambda : (thread.interrupt_main(), ), ())
  • lambda在这里的作用是传递一个函数的结果作为另一个函数的参数,例如:
def perform( fun, *args ):
fun( *args ) def action1( args ):
pass def action2( args ):
pass perform( action1 )
perform( action2, p )
perform( action3, p, r )

可以被方便的写成:

def Perform(f):
f() Perform(lambda: Action1())
Perform(lambda: Action2(p))
Perform(lambda: Action3(p, r))

应用四:在内置函数中使用

1, 用在过滤函数filter中,指定过滤列表元素的条件:

filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

上述代码运行结果:

[3, 6, 9]

2, 用在排序函数sorted中,指定对列表中所有元素进行排序的准则:

sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))

上述代码运行结果:

[5, 4, 6, 3, 7, 2, 8, 1, 9]

另外一个例子:

# 匿名函数可以结合sort方法使用,完成数据的排序
my_list = [{"name": "zs", "age": 18}, {"name": "ls", "age": 28}] # 默认是按照升序排序的 # ([参数])-> any 表示匿名函数
# 下面的代码解释: 变量列表,给匿名函数传入一个字典,根据字典name的value值进行排序
# my_list.sort(key=lambda x: x["name"])
# print(my_list) # 根据年龄进行排序,然后进行数据反转,完成降序
my_list.sort(key=lambda x: x["age"],reverse=True)
print(my_list)

3, 用在reduce函数中,指定列表中两两相邻元素的结合条件

reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])

上述代码运行结果:

'1, 2, 3, 4, 5, 6, 7, 8, 9'

4, 用在map函数中,指定对列表中每一个元素的共同操作

map(lambda x: x+1, [1, 2,3])

上述代码运行结果:

[2, 3, 4]

5, 从另一函数中返回一个函数,常用来实现函数装饰器(Wrapper),例如python的function decorators

def transform(n):
return lambda x: x + n
f = transform(3)
print f(3)

上述代码运行结果:

7

匿名函数特点:

1.只能有一个表达式

2.不用return,默认return结果

3.不需要名字,防止函数名重复

4.是对象,可赋值给一个变量

参考:

『Python基础-14』匿名函数 `lambda`的更多相关文章

  1. 『Python基础-7』for循环 & while循环

    『Python基础-7』for循环 & while循环 目录: 循环语句 for循环 while循环 循环的控制语句: break,continue,pass for...else 和 whi ...

  2. 『Python基础-4』字符串

    # 『Python基础-4』字符串 目录 1.什么是字符串 2.修改字符串 2.1 修改字符串大小 2.2 合并(拼接)字符串 2.3 使用乘号'*'来实现字符串的叠加效果. 2.4 在字符串中添加空 ...

  3. 『Python基础-3』变量、定义变量、变量类型、关键字Python基础-3』变量、定义变量、变量类型、关键字

    『Python基础-3』变量.定义变量.变量类型.关键字 目录: 1.Python变量.变量的命名 2.变量的类型(Python数据类型) 3.Python关键字 1. Python 变量.变量的命名 ...

  4. 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)

    # 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...

  5. 『Python基础-11』集合 (set)

    # 『Python基础-11』集合 (set) 目录: 集合的基本知识 集合的创建 访问集合里的值 向集合set增加元素 移除集合中的元素 集合set的运算 1. 集合的基本知识 集合(set)是一个 ...

  6. 『Python基础-10』字典

    # 『Python基础-10』字典 目录: 1.字典基本概念 2.字典键(key)的特性 3.字典的创建 4-7.字典的增删改查 8.遍历字典 1. 字典的基本概念 字典一种key - value 的 ...

  7. 『Python基础-9』元祖 (tuple)

    『Python基础-9』元祖 (tuple) 目录: 元祖的基本概念 创建元祖 将列表转化为元组 查询元组 更新元组 删除元组 1. 元祖的基本概念 元祖可以理解为,不可变的列表 元祖使用小括号括起所 ...

  8. 『Python基础-8』列表

    『Python基础-8』列表 1. 列表的基本概念 列表让你能够在一个地方存储成组的信息,其中可以只包含几个 元素,也可以包含数百万个元素. 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...

  9. 『Python基础-6』if语句, if-else语句

    # 『Python基础-6』if语句, if-else语句 目录: 条件测试 if语句 if-else语句 1. 条件测试 每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为 ...

随机推荐

  1. mongodb时间点备份恢复

    1:创建测试数据 > use maxiangqian switched to db maxiangqian "}) WriteResult({ "nInserted" ...

  2. 错误: 安装必备组件失败: 安装必备组件失败: SqlInstanceRtc 有关详细信息

    错误: 安装必备组件失败: 安装必备组件失败: SqlInstanceRtc 有关详细信息 查看错误得知是安装sqlexpr_x64.exe的时候出现了错误 解决: 通过打开skype镜像,找到sql ...

  3. 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏

    1.  在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2.  如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...

  4. [零基础学JAVA]Java SE基础部分-03. 运算符和表达式

    转自:http://redking.blog.51cto.com/27212/116751 1.课程名称:运算符.表达式 讲解了JAVA中各种运算符的使用,包括与.或.非.大于.小于等. 2.知识点 ...

  5. Expression拼接

    public static class PBuilder { /// <summary> /// 机关函数应用True时:单个AND有效,多个AND有效:单个OR无效,多个OR无效:混应时 ...

  6. 可变对象(immutable)和不可变对象(mutable)

    可变对象(immutable)和不可变对象(mutable) 这个是之前一直忽略的一个知识点,比方说说起String为什么是一个不可变对象,只知道因为它是被final修饰的所以不可变,而没有抓住不可变 ...

  7. 如何用jstl的select标签做二级联动下拉列表框??

    下拉列表框的多级联动早就会了.但是用jstl的select标签做下拉列表框的做二级联动的时候还是遇到了些问题.主要问题在用Ajax查询到的数据如何拼成下拉选项的时候.其实很简单,但我还是折腾了好久.所 ...

  8. UVa 1442 - Cave

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  10. 11、SpringBoot-CRUD-thymeleaf公共页面元素抽取

    thymeleaf公共页面元素抽取 存在一种现象:两个文件的代码只有一部分代码不一样 其余的均相同,此时就可以提取公共的代码去简化开发 .抽取公共片段 <div th:fragment=&quo ...